Converter de formato de correo electrónico para .NET

El Aspose.Email LowCode Converter proporciona una API simplificada, de alto nivel para la conversión de mensajes de correo electrónico entre diferentes formatos con una complejidad mínima de código. Esta guía de desarrolladores cubre la funcionalidad básica, los patrones de implementación y las mejores prácticas para el uso del convertidor en aplicaciones .NET.

Página de correo electrónico.LowCode

El Aspose.Email.LowCode namespace contiene clases diseñadas para simplificar las operaciones de conversión de formato de correo electrónico Converter clase, que ofrece métodos estáticos para transformar mensajes de correo electrónico entre formatos populares incluyendo EML, MSG, HTML, MHT, y MHTML.

Componentes clave

  • Converter : métodos de conversión estática para la transformación de formato de correo electrónico
  • IoutputHandler : Interfaz para el manejo de flujos de salida convertidos
  • FolderOutputHandler : Implementación integrada para almacenamiento de salida basado en la pasta

Comenzando

Instalación

Instalar el paquete Aspose.Email a través de NuGet Package Manager:

Install-Package Aspose.Email

Declaración del Nombre

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

Métodos de conversión básica

Conversión de formato genérico

El Convert El método proporciona una conversión de formato flexible con una especificación explícita del tipo de salida:

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

Exemplos de implementación:

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

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

Métodos especializados de conversión

El convertidor proporciona métodos dedicados para los escenarios de conversión comunes:

Convertir en formato HTML

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

Convertir en formato MSG

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

Convertir en formato EML

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

Convertir en formatos MHTML/MHT

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

EML/MSG Conversión específica

Para la detección de formato automático entre El EML y MSG Los formatos:

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

Implementación del comerciante de salida

Utilización de FolderOutputHandler

El built-in FolderOutputHandler La clase almacenará automáticamente los archivos convertidos en un directorio especificado:

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

El ejemplo de uso:

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

Productos de exportación personalizados

La implementación de la IOutputHandler Interfaz para procesamiento de salida personalizado:

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

Formato de Matrix

Formato de entradaFormatos de salidaMétodo
El EMLHTML, MSG, MHTML y MHTConvertToHtml(), ConvertToMsg(), y etc.
MSGHTML, EML, MHTML y MHTConvertToHtml(), ConvertToEml(), y etc.
cualquier formato de correo electrónicoUsuario especificadoConvert() Parámetros de tipo de salida

Modelo de implementación avanzada

Implementación del procesamiento de batch

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

Modelo de trato de errores

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

Procesamiento de flujo optimizado de memoria

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ón y Customización

Estructura del directorio de salida

Cuando se utiliza FolderOutputHandler, el convertidor mantiene la estructura de archivo original:

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

Estrategia de nombramiento personalizado

Implementar el nombre de archivo personalizado a través de un operador de salida especializado:

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
}

Consideraciones de rendimiento

Operaciones asíncronas

Todos los métodos de conversión de vuelta Task Objetos, que permiten un procesamiento sin síntesis eficiente:

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

Gestión de Recursos

La correcta disposición del flujo es fundamental para el rendimiento óptimo:

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

Optimización del uso de memoria

Para grandes archivos de correo electrónico, considere los enfoques 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);
}

Ejemplos de integración

Introducción a 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ón 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

Problemas Comunes y Soluciones

ProblemasSolución
FileNotFoundExceptionVerificar la ruta de archivo de entrada y las autorizaciones
UnauthorizedAccessExceptionVerificar el directorio de salida escribe permiso
OutOfMemoryExceptionUtilice un enfoque de streaming para grandes archivos
InvalidOperationExceptionAsegurar el formato de correo electrónico válido para el archivo de entrada

Tipos de Debugging

Permite un registro detallado para resolver problemas:

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;
    }
}
 Español