Conversió de format de correu electrònic per .NET

L’Aspose.Email LowCode Converter proporciona una API simplificada, d’alt nivell per a la conversió de missatges de correu electrònic entre diferents formats amb una complexitat mínima de codi. Aquesta guia de desenvolupadors cobreix la funcionalitat bàsica, els patrons de implementació i les millors pràctiques per utilitzar el convertidor en aplicacions .NET.

Enllaç de correu electrònic.LowCode

The Aspose.Email.LowCode nomespace conté classes dissenyades per simplificar les operacions de conversió de format de correu electrònic Converter classe, que ofereix mètodes estàtics per transformar missatges de correu electrònic entre formats populars com EML, MSG, HTML, MHT, i MHTML.

Components clau

  • Converter : mètodes de conversió estàtica per a la transformació de format de correu electrònic
  • IoutputHandler : Interfície per a la gestió de fluxos de sortida convertides
  • FolderOutputHandler : implementació construïda per a l’emmagatzematge de sortides basada en cartells

Per començar

Instal·lació

Instal·la el paquet Aspose.Email a través de NuGet Package Manager:

Install-Package Aspose.Email

Declaració del nom

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

Mètodes de conversió Core

Conversió de format genèric

The Convert El mètode proporciona una conversió de format flexible amb una especificació explícita del tipus de sortida:

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

Exemple de realització:

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

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

Mètodes especialitzades de conversió

El convertidor proporciona mètodes dedicats per a escenaris de conversió comuns:

Convertir en format HTML

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

Convertir en format MSG

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

Convertir en format EML

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

Convertir en formats MHTML/MHT

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

EML / MSG Conversió específica

Per a la detecció de format automàtic entre EML i MSG Els formats:

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

Implementació del comerciant d’ingressos

Utilització de FolderOutputHandler

La construcció en FolderOutputHandler La classe emmagatzema automàticament els arxius convertides en un directori especificat:

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

Utilitzar l’exemple:

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

Proveïdor de sortides personalitzats

La implementació del IOutputHandler Interfície per a processament de sortida personalitzada:

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

El format de matriu

Format d’entradaFormats de sortidaMethod
EMLHTML, MSG, MHTML i MHTConvertToHtml(), ConvertToMsg(), i etc.
MSGHTML, EML, MHTML i MHTConvertToHtml(), ConvertToEml(), i etc.
Qualsevol format de correu electrònicUsuaris especificatsConvert() Paràmetres de tipus de sortida

Models d’implementació avançats

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

Model d’error de gestió

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

Processament de flux optimitzat de memòria

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

Configuració i personalització

Estructura de la direcció de sortida

Quan utilitzem FolderOutputHandler, el convertidor manté la estructura de fitxer original:

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

Estratègia de nom personalitzat

Implementar el nom de fitxers personalitzats a través d’un operador de sortides especialitzat:

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
}

Consideracions de rendiment

Operacions asynchròniques

Tots els mètodes de conversió tornen Task Objectes, que permeten un tractament asíncrònic eficaç:

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

Gestió de recursos

La correcta disposició del flux és fonamental per al rendiment òptim:

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

Optimització de la memòria

Per a grans fitxers de correu electrònic, considereu els enfocaments de 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);
}

Exemples d’integració

Integració 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"
    };
}

Implementació de 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

Problemes comuns i solucions

qüestióSolució
FileNotFoundExceptionVerificar el camí de fitxer d’entrada i les autoritzacions
UnauthorizedAccessExceptionCheck output directory escriure permissions
OutOfMemoryExceptionUtilitzar l’enfocament de streaming per a grans fitxers
InvalidOperationExceptionAssegurar el format de correu electrònic vàlid per a fitxers d’entrada

Tipus de Debugging

Facilita el registre detallat per a la resolució de problemes:

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