Конвертер електронної пошти для .NET

Aspose.Email LowCode Converter забезпечує спрощений, високоякісний API для конвертації електронних повідомлень між різними форматами з мінімальною складністю коду.Цей посібник розробника охоплює основні функції, моделі реалізації та кращі практики для використання перетворювача в .NET-прикладах.

Електронна пошта.LowCode

Того ж Aspose.Email.LowCode namespace містить класи, призначені для ускладнення операцій конвертації формату електронної пошти Converter клас, який пропонує статичні методи для перетворення електронних повідомлень між популярними форматами, включаючи EML, MSG, HTML, MHT і MHTML.

Ключові компоненти

  • Converter : Статичні методи конвертації для трансформації формату електронної пошти
  • IoutputHandler : інтерфейс для обробки конвертованих вихідних потоків
  • FolderOutputHandler : Вбудована реалізація для зберігання продуктів на основі папки

Розпочинаємо

Встановлення

Завантажити пакет Aspose.Email через NuGet Package Manager:

Install-Package Aspose.Email

Декларація Namespace

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

Основні методи конверсії

Генеральний формат конверсії

Того ж Convert Метод забезпечує гнучку конвертацію формату з чіткою специфікацією типу виходу:

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

Прикладна реалізація:

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

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

Спеціалізовані методи конверсії

Конвертер забезпечує присвячені методи для загальних сценаріїв конверсії:

Конвертація до формату HTML

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

перетворення в MSG формат

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

Перетворення в EML формат

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

Конвертація до форматів MHTML/MHT

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

EML/MSG Специфічна конверсія

Для автоматичного виявлення формату між EML і МЗС Формули:

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

Виробництво експортного трейдера

Створення FolderOutputHandler

Вбудований в FolderOutputHandler Клас автоматично зберігає конвертовані файли в визначений каталог:

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

Використання прикладу:

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

Кваліфікований вихідний трейдер

Введення в дію IOutputHandler Інтерфейс для персоналізованого обробки продуктів:

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);
    }
}

Підтримка формату Matrix

Вхідний форматФормат виходуМетод
EMLHTML, MSG, MHTML і MHTConvertToHtml(), ConvertToMsg(), І т.д.
МЗСHTML, EML, MHTML і MHTConvertToHtml(), ConvertToEml(), І т.д.
будь-який формат електронної поштиКористувач-специфікованийConvert() Параметри вихідного типу

Прогресивні моделі реалізації

Використання Batch Processing

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);
    }
}

Використання помилок моделі

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 
        };
    }
}

Меморіально-оптимізована обробка потоків

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);
}

Конфігурація та персоналізація

Структура вихідного каталогу

Коли використовується FolderOutputHandler, конвертер підтримує оригінальну структуру файлу:

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

Стратегія персоналізації

Використання персоналізованого назви файлів через спеціалізований трейдер виходу:

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
}

Виконання розглядів

Асинхронні операції

Всі методи конвертації повертаються Task Об’єкти, що дозволяють ефективну асинхронну обробку:

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

Управління ресурсами

Правильне розташування потоку є ключовим для оптимальної продуктивності:

// 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);

Оптимізація використання пам’яті

Для великих електронних файлів розглянемо поточні підходи:

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);
}

Приклади інтеграції

Інтеграція 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

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

Загальні проблеми та рішення

ПроблемаРішення
FileNotFoundExceptionПеревірте вхідний шлях файлу та дозвіл
UnauthorizedAccessExceptionПеревірте каталог виходу, напишіть дозвіл
OutOfMemoryExceptionВикористання поточного підходу для великих файлів
InvalidOperationExceptionЗабезпечити дійсний формат електронної пошти для вхідного файлу

Дебютні поради

Дозволяється детальний логінг для вирішення проблем:

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;
    }
}
 Українська