E-postformat Converter för .NET
Aspose.Email LowCode Converter ger en förenklad, hög nivå API för att konvertera e-postmeddelanden mellan olika format med minimal kod komplexitet.Denna utvecklingsguide täcker kärnfunktionaliteten, implementeringsmönster och bästa praxis för användning av konverteraren i .NET-applikationer.
Spela in.Email.LowCode
och den Aspose.Email.LowCode
namespace innehåller klasser som är utformade för att effektivisera e-postformat konverteringsverksamhet Converter
klass, som erbjuder statiska metoder för att omvandla e-postmeddelanden mellan populära format inklusive EML, MSG, HTML, MHT och MHTML.
Nyckelkomponenter
- Converter : Statiska konverteringsmetoder för e-postformat omvandling
- IOutputHandler : Gränssnitt för hantering av konverterade outputströmmar
- FolderOutputHandler : Inbyggd implementering för mappbaserad output lagring
Komma igång
Installation
Installera Aspose.Email-paketet via NuGet Package Manager:
Install-Package Aspose.Email
Namespace förklaring
using Aspose.Email.LowCode;
using System.IO;
using System.Threading.Tasks;
Kärnkonverteringsmetoder
Generisk format konvertering
och den Convert
Metoden ger flexibel formatkonversion med en uttrycklig utgångstyp specifikation:
public static Task Convert(Stream input, string nameWithExtension, IOutputHandler handler, string outputType)
Exempel på genomförande:
using var inputStream = File.OpenRead("email.eml");
var outputHandler = new FolderOutputHandler(@"C:\ConvertedEmails");
await Converter.Convert(inputStream, "email.eml", outputHandler, "html");
Specialiserade konverteringsmetoder
Konverteraren tillhandahåller dedikerade metoder för vanliga konverteringsscenarier:
Konvertera till HTML-format
await Converter.ConvertToHtml(inputStream, "email.eml", outputHandler);
Omvandlas till MSG Format
await Converter.ConvertToMsg(inputStream, "email.eml", outputHandler);
Omvandlas till EML format
await Converter.ConvertToEml(inputStream, "email.msg", outputHandler);
Konvertera till MHTML/MHT format
await Converter.ConvertToMhtml(inputStream, "email.eml", outputHandler);
await Converter.ConvertToMht(inputStream, "email.eml", outputHandler);
EML/MSG specifik omvandling
Automatisk formatdetektion mellan EML och MSG Format är:
await Converter.ConvertEmlOrMsg(inputStream, "email.eml", outputHandler, "html");
Utgångshandlare genomförande
Använd FolderOutputHandler
Den inbyggda FolderOutputHandler
Klassen sparar automatiskt konverterade filer till en angiven katalog:
public class FolderOutputHandler : IOutputHandler
{
public FolderOutputHandler(string path)
public string Path { get; set; }
}
Använd exempel:
var outputHandler = new FolderOutputHandler(@"C:\OutputDirectory");
Anpassad output handlare
genomförandet av IOutputHandler
Gränssnitt för anpassad produktionsbehandling:
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);
}
}
Stöd för Format Matrix
Inträdesformat | Utgångsformat | Metod |
---|---|---|
EML | HTML, MSG, MHTML och MHT | ConvertToHtml() , ConvertToMsg() , och etc. |
MSG | HTML, EML, MHTML och MHT | ConvertToHtml() , ConvertToEml() , och etc. |
Alla e-postformat | Användare specificerade | Convert() med utgångstyp parameter |
Avancerade genomförandemönster
Batch bearbetning genomförande
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);
}
}
Felhantering mönster
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
};
}
}
Memory-optimerad strömbehandling
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);
}
Konfiguration och anpassning
Utgångsdirektivets struktur
När man använder FolderOutputHandler
, Konverteraren upprätthåller den ursprungliga filstrukturen:
var outputHandler = new FolderOutputHandler(@"C:\ConvertedEmails");
// Original: sample.eml → Output: C:\ConvertedEmails\sample.html
Anpassad namnstrategi
Implementera anpassad filnamn genom en specialiserad utgångshanterare:
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
}
Prestanda överväganden
Asynkrona operationer
Alla konverteringsmetoder återvänder Task
Objekt som möjliggör effektiv asynkron bearbetning:
public async Task ProcessMultipleEmailsAsync()
{
var tasks = new[]
{
ConvertEmailAsync("email1.eml"),
ConvertEmailAsync("email2.msg"),
ConvertEmailAsync("email3.eml")
};
await Task.WhenAll(tasks);
}
Resurshantering
Korrekt flöde är avgörande för optimal prestanda:
// 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);
Optimera användningen av minnet
För stora e-postfiler, överväga streamingmetoder:
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);
}
Integration Exempel
ASP.NET Core Web API Integration
[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 genomförande
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
Vanliga problem och lösningar
frågan | Lösning |
---|---|
FileNotFoundException | Kontrollera inputfilvägen och behörigheterna |
UnauthorizedAccessException | Check output directory skriva tillstånd |
OutOfMemoryException | Använd streamingmetoden för stora filer |
InvalidOperationException | Säkerställ ett giltigt e-postformat för inmatningsfilen |
Debugging tips
Tillåter detaljerad loggning för problemlösning:
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;
}
}