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 ingresso | Formati di uscita | Metodo |
---|---|---|
di EML | HTML, MSG, MHTML e MHT | ConvertToHtml() , ConvertToMsg() , e così via. |
MSG | HTML, EML, MHTML e MHT | ConvertToHtml() , ConvertToEml() , e così via. |
Qualsiasi formato e-mail | Utente specifico | Convert() 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 problema | La soluzione |
---|---|
FileNotFoundException | Verificare il percorso e le autorizzazioni del file di input |
UnauthorizedAccessException | Controlla il directory di uscita per scrivere le autorizzazioni |
OutOfMemoryException | Utilizzare un approccio di streaming per i file più grandi |
InvalidOperationException | Assicurare 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;
}
}