Email Format Converter cho .NET

Aspose.Email LowCode Converter cung cấp một API đơn giản, cấp cao để chuyển đổi tin nhắn email giữa các định dạng khác nhau với độ phức tạp mã tối thiểu. Hướng dẫn này của nhà phát triển bao gồm chức năng cốt lõi, mô hình thực hiện, và các thực hành tốt nhất để sử dụng máy biến trong các ứng dụng .NET.

Thông tin email.LowCode

của The Aspose.Email.LowCode namespace chứa các lớp học được thiết kế để streamline các hoạt động chuyển đổi định dạng email. thành phần chính là Converter lớp, cung cấp các phương pháp tĩnh để chuyển đổi tin nhắn email giữa các định dạng phổ biến bao gồm EML, MSG, HTML, MHT, và MHTML.

Các thành phần chính

  • Converter : Phương pháp chuyển đổi tĩnh cho định dạng email
  • IoutputHandler : Giao diện để xử lý dòng output chuyển đổi
  • FolderOutputHandler : Thực hiện xây dựng cho lưu trữ kết quả dựa trên thư mục

Bắt đầu

Cài đặt

Cài đặt gói Aspose.Email thông qua NuGet Package Manager:

Install-Package Aspose.Email

Thông báo Namespace

using Aspose.Email.LowCode;
using System.IO;
using System.Threading.Tasks;

Phương pháp chuyển đổi Core

Định dạng Generic Conversion

của The Convert phương pháp cung cấp chuyển đổi định dạng linh hoạt với các thông số cụ thể loại output:

public static Task Convert(Stream input, string nameWithExtension, IOutputHandler handler, string outputType)

Thực hiện ví dụ:

using var inputStream = File.OpenRead("email.eml");
var outputHandler = new FolderOutputHandler(@"C:\ConvertedEmails");

await Converter.Convert(inputStream, "email.eml", outputHandler, "html");

Phương pháp chuyển đổi chuyên môn

Converter cung cấp các phương pháp dành riêng cho các kịch bản chuyển đổi phổ biến:

Chuyển sang định dạng HTML

await Converter.ConvertToHtml(inputStream, "email.eml", outputHandler);

Chuyển sang MSG Format

await Converter.ConvertToMsg(inputStream, "email.eml", outputHandler);

Chuyển sang EML Format

await Converter.ConvertToEml(inputStream, "email.msg", outputHandler);

Chuyển đổi sang định dạng MHTML/MHT

await Converter.ConvertToMhtml(inputStream, "email.eml", outputHandler);
await Converter.ConvertToMht(inputStream, "email.eml", outputHandler);

EML/MSG chuyển đổi cụ thể

Để phát hiện định dạng tự động giữa EML MSG định dạng:

await Converter.ConvertEmlOrMsg(inputStream, "email.eml", outputHandler, "html");

Xuất khẩu Handler

Sử dụng FolderOutputHandler

Cấu trúc built-in FolderOutputHandler lớp tự động lưu các tập tin được chuyển đổi vào một thư mục cụ thể:

public class FolderOutputHandler : IOutputHandler
{
    public FolderOutputHandler(string path)
    public string Path { get; set; }
}

Sử dụng ví dụ:

var outputHandler = new FolderOutputHandler(@"C:\OutputDirectory");

Tùy chọn Output Handler

Thực hiện The IOutputHandler Giao diện cho xử lý output tùy chỉnh:

public class CustomOutputHandler : IOutputHandler
{
    public async Task AddOutputStream(string name, Func<Stream, Task> writeAction)
    {
        // Custom async implementation
        using var customStream = CreateCustomStream(name);
        await writeAction(customStream);
    }
    
    public void AddOutputStream(string name, Action<Stream> writeAction)
    {
        // Custom synchronous implementation
        using var customStream = CreateCustomStream(name);
        writeAction(customStream);
    }
}

Hỗ trợ Format Matrix

Định dạng Inputđịnh dạng outputPhương pháp
EMLHTML, MSG, MHTML, MHTConvertToHtml(), ConvertToMsg(), vv.
MSGHTML, EML, MHTML, MHTConvertToHtml(), ConvertToEml(), vv.
bất kỳ email định dạngNgười dùng cụ thểConvert() với loại output parameter

Các mô hình thực hiện tiên tiến

Batch xử lý thực hiện

public class EmailBatchConverter
{
    private readonly IOutputHandler _outputHandler;
    
    public EmailBatchConverter(IOutputHandler outputHandler)
    {
        _outputHandler = outputHandler;
    }
    
    public async Task ConvertBatch(IEnumerable<string> emailFiles, string outputFormat)
    {
        var conversionTasks = emailFiles.Select(async file =>
        {
            using var stream = File.OpenRead(file);
            var fileName = Path.GetFileName(file);
            
            await Converter.Convert(stream, fileName, _outputHandler, outputFormat);
        });
        
        await Task.WhenAll(conversionTasks);
    }
}

Chế độ xử lý lỗi

public async Task<ConversionResult> SafeConvert(string inputFile, string outputFormat)
{
    try
    {
        using var inputStream = File.OpenRead(inputFile);
        var outputHandler = new FolderOutputHandler(@"C:\Output");
        var fileName = Path.GetFileName(inputFile);
        
        await Converter.Convert(inputStream, fileName, outputHandler, outputFormat);
        
        return new ConversionResult { Success = true };
    }
    catch (Exception ex)
    {
        return new ConversionResult 
        { 
            Success = false, 
            ErrorMessage = ex.Message 
        };
    }
}

Bộ xử lý lưu lượng nhớ tối ưu

public async Task ConvertWithMemoryOptimization(string inputFile)
{
    using var inputStream = new FileStream(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, useAsync: true);
    var outputHandler = new FolderOutputHandler(@"C:\Output");
    
    await Converter.ConvertToHtml(inputStream, Path.GetFileName(inputFile), outputHandler);
}

Configuration và Customization

cấu trúc Directory Output

Khi sử dụng FolderOutputHandler, máy chuyển đổi duy trì cấu trúc tệp ban đầu:

var outputHandler = new FolderOutputHandler(@"C:\ConvertedEmails");
// Original: sample.eml → Output: C:\ConvertedEmails\sample.html

Chiến lược đặt tên tùy chỉnh

Thực hiện tên tập tin tùy chỉnh thông qua một nhà sản xuất chuyên ngành:

public class TimestampOutputHandler : IOutputHandler
{
    private readonly string _basePath;
    
    public TimestampOutputHandler(string basePath)
    {
        _basePath = basePath;
    }
    
    public async Task AddOutputStream(string name, Func<Stream, Task> writeAction)
    {
        var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
        var newName = $"{timestamp}_{name}";
        var filePath = Path.Combine(_basePath, newName);
        
        using var fileStream = File.Create(filePath);
        await writeAction(fileStream);
    }
    
    // Synchronous implementation omitted for brevity
}

Các tính toán hiệu suất

hoạt động asynchronous

Tất cả phương pháp chuyển đổi trở lại Task các đối tượng, cho phép xử lý không đồng bộ hiệu quả:

public async Task ProcessMultipleEmailsAsync()
{
    var tasks = new[]
    {
        ConvertEmailAsync("email1.eml"),
        ConvertEmailAsync("email2.msg"),
        ConvertEmailAsync("email3.eml")
    };
    
    await Task.WhenAll(tasks);
}

Quản lý nguồn lực

Việc xử lý dòng chảy đúng đắn rất quan trọng cho hiệu suất tối ưu:

// Correct pattern
using (var inputStream = File.OpenRead("email.eml"))
{
    await Converter.ConvertToHtml(inputStream, "email.eml", outputHandler);
}

// Alternative using statement
using var inputStream = File.OpenRead("email.eml");
await Converter.ConvertToHtml(inputStream, "email.eml", outputHandler);

Tối ưu hóa sử dụng bộ nhớ

Đối với các tập tin email lớn, hãy xem xét các cách tiếp cận streaming:

public async Task ConvertLargeEmail(string inputPath)
{
    const int bufferSize = 65536; // 64KB buffer
    
    using var inputStream = new FileStream(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, true);
    var outputHandler = new FolderOutputHandler(@"C:\Output");
    
    await Converter.ConvertToHtml(inputStream, Path.GetFileName(inputPath), outputHandler);
}

Ví dụ về Integration

Kết hợp ASP.NET Core Web API

[ApiController]
[Route("api/[controller]")]
public class EmailConverterController : ControllerBase
{
    [HttpPost("convert")]
    public async Task<IActionResult> ConvertEmail(IFormFile emailFile, [FromQuery] string format = "html")
    {
        if (emailFile == null || emailFile.Length == 0)
            return BadRequest("No file provided");
        
        try
        {
            using var inputStream = emailFile.OpenReadStream();
            var outputHandler = new MemoryOutputHandler();
            
            await Converter.Convert(inputStream, emailFile.FileName, outputHandler, format);
            
            return File(outputHandler.GetContent(), GetContentType(format), $"converted.{format}");
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Conversion failed: {ex.Message}");
        }
    }
    
    private string GetContentType(string format) => format.ToLower() switch
    {
        "html" => "text/html",
        "mhtml" => "message/rfc822",
        "eml" => "message/rfc822",
        _ => "application/octet-stream"
    };
}

Windows Service thực hiện

public class EmailConverterService : BackgroundService
{
    private readonly string _watchFolder;
    private readonly string _outputFolder;
    
    public EmailConverterService(IConfiguration config)
    {
        _watchFolder = config["EmailConverter:WatchFolder"];
        _outputFolder = config["EmailConverter:OutputFolder"];
    }
    
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        var watcher = new FileSystemWatcher(_watchFolder, "*.eml");
        watcher.Created += async (sender, e) => await ProcessEmailFile(e.FullPath);
        watcher.EnableRaisingEvents = true;
        
        while (!stoppingToken.IsCancellationRequested)
        {
            await Task.Delay(1000, stoppingToken);
        }
    }
    
    private async Task ProcessEmailFile(string filePath)
    {
        using var inputStream = File.OpenRead(filePath);
        var outputHandler = new FolderOutputHandler(_outputFolder);
        
        await Converter.ConvertToHtml(inputStream, Path.GetFileName(filePath), outputHandler);
    }
}

Troubleshooting

Vấn đề Thường Gặp và Giải Pháp

vấn đềGiải pháp
FileNotFoundExceptionKiểm tra đường dẫn file input và giấy phép
UnauthorizedAccessExceptionCheck output directory viết giấy phép
OutOfMemoryExceptionSử dụng phương pháp streaming cho các tập tin lớn
InvalidOperationExceptionBảo đảm định dạng email hợp lệ cho tệp nhập

Lời bài hát Debugging

Khả năng đăng ký chi tiết để giải quyết vấn đề:

public async Task ConvertWithLogging(string inputFile)
{
    var logger = LoggerFactory.Create(builder => builder.AddConsole()).CreateLogger<EmailConverter>();
    
    try
    {
        logger.LogInformation($"Starting conversion of {inputFile}");
        
        using var inputStream = File.OpenRead(inputFile);
        var outputHandler = new FolderOutputHandler(@"C:\Output");
        
        await Converter.ConvertToHtml(inputStream, Path.GetFileName(inputFile), outputHandler);
        
        logger.LogInformation($"Successfully converted {inputFile}");
    }
    catch (Exception ex)
    {
        logger.LogError(ex, $"Failed to convert {inputFile}");
        throw;
    }
}
 Tiếng Việt