Convertitore di formato email per .NET

L’Aspose.Email LowCode Converter fornisce un’API semplificata e ad alto livello per la conversione dei messaggi di posta elettronica tra diversi formati con una complessità minima di codice.Questo guide sviluppatore copre le funzionalità chiave, i modelli di implementazione e le migliori pratiche per l’uso del convertitore in applicazioni .NET.

Scrivi una recensione per Email.LowCode

Il Aspose.Email.LowCode namespace contiene lezioni progettate per semplificare le operazioni di conversione del formato di posta elettronica Converter classe, che offre metodi statici per trasformare messaggi di posta elettronica tra formati popolari tra cui EML, MSG, HTML, MHT, e MHTML.

Componenti chiave

  • Converter : Metodi di conversione statica per la trasformazione del formato email
  • IoutputHandler : Interfaccia per la gestione dei flussi di uscita convertiti
  • FolderOutputHandler : Implementazione integrata per la memorizzazione di output basata su cartella

Iniziare

Installazione

Installare il pacchetto Aspose.Email tramite NuGet Package Manager:

Install-Package Aspose.Email

Dichiarazione di nome

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

Metodi di conversione Core

Conversione di formato generico

Il Convert Il metodo fornisce una conversione di formato flessibile con una specifica esplicita del tipo di output:

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

Esempio di attuazione:

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

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

Metodi di conversione specializzati

Il convertitore fornisce metodi dedicati per scenari di conversione comuni:

Convertire in formato HTML

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

Convertire in formato MSG

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

Convertire in formato EML

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

Convertire in formati MHTML/MHT

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

Conversione specifica EML/MSG

Per la rilevazione automatica del formato tra di EML e MSG Il formato:

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

Implementazione di Output Handler

Utilizzo di FolderOutputHandler

La costruzione in FolderOutputHandler La classe salva automaticamente i file convertiti in un directory specifico:

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

Esempio di utilizzo:

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

Consulente di output personalizzato

Implementazione del IOutputHandler Interfaccia per il processamento di output personalizzato:

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

Modalità di formato Matrix

Formato di ingressoFormati di uscitaMetodo
di EMLHTML, MSG, MHTML e MHTConvertToHtml(), ConvertToMsg(), e così via.
MSGHTML, EML, MHTML e MHTConvertToHtml(), ConvertToEml(), e così via.
Qualsiasi formato e-mailUtente specificoConvert() Parametri di tipo di output

Modalità avanzate di attuazione

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

Modello di errore di trattamento

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

Memoria ottimizzata per il trattamento del flusso

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

Configurazione e personalizzazione

Struttura del directorio di uscita

Quando si utilizza FolderOutputHandler, il convertitore mantiene la struttura del file originale:

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

Strategia di nomina personalizzata

Implementazione del nome del file personalizzato attraverso un operatore di produzione specializzato:

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
}

Considerazioni di prestazioni

Operazioni asinkroniche

Tutti i metodi di conversione ritorno Task Gli oggetti, che consentono un’efficiente elaborazione asincronica:

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

Gestione delle risorse

La corretta distribuzione del flusso è fondamentale per il rendimento ottimale:

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

Ottimizzazione dell’utilizzo della memoria

Per i grandi file di posta elettronica, considerare gli approcci di 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);
}

Esempi di integrazione

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

Implementazione di 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

Problemi Comuni e Soluzioni

Il problemaLa soluzione
FileNotFoundExceptionVerificare il percorso e le autorizzazioni del file di input
UnauthorizedAccessExceptionControlla il directory di uscita per scrivere le autorizzazioni
OutOfMemoryExceptionUtilizzare un approccio di streaming per i file più grandi
InvalidOperationExceptionAssicurare il formato email valido per il file di input

Tipi di Debugging

Possibilità di registrazione dettagliata per la risoluzione dei problemi:

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