Email Format Converter untuk .NET

Aspose.Email LowCode Converter menyediakan API yang disederhanakan, tingkat tinggi untuk mengkonversi pesan email antara format yang berbeda dengan kerumitan kode minimal. panduan pengembang ini mencakup fungsi inti, pola implementasi, dan praktik terbaik untuk menggunakan converter dalam aplikasi .NET.

Tuliskan email.LowCode

dan yang Aspose.Email.LowCode namaespace mengandung kelas yang dirancang untuk mempercepat operasi konversi format email. komponen utama adalah Converter kelas, yang menawarkan metode statik untuk mengubah pesan email antara format populer termasuk EML, MSG, HTML, MHT, dan MHTML.

Komponen Kunci

  • Converter : Metode konversi statik untuk transformasi format email
  • IoutputHandler : Interface untuk mengelola aliran output terkonversi
  • FolderOutputHandler : Implementasi terbina dalam untuk penyimpanan output berbasis folder

Memulai

Instalasi

Instalasi paket Aspose.Email melalui NuGet Package Manager:

Install-Package Aspose.Email

Deklarasi Namespace

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

Metode Konversi Utama

Konversi Format Generik

dan yang Convert Metode memberikan konversi format yang fleksibel dengan spesifikasi jenis output yang jelas:

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

Contoh dari implementasi:

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

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

Metode Konversi Spesialis

Converter menyediakan metode khusus untuk skenario konversi umum:

Konversi ke format HTML

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

Konversi ke MSG Format

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

Konversi ke format EML

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

Konversi ke format MHTML/MHT

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

Konversi spesifik EML/MSG

Untuk deteksi format otomatis antara EML dan MSG formatnya:

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

Implementasi output handler

Menggunakan FolderOutputHandler

yang dibangun dalam FolderOutputHandler Kelas secara otomatis menyimpan file terkonversi ke direktori tertentu:

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

Menggunakan contoh:

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

Custom output handler

Implementasi yang IOutputHandler Interface untuk pemrosesan output tersuai:

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

Menggunakan Format Matrix

Format InputFormat outputMetode
EMLHTML, MSG, MHTML dan MHTConvertToHtml(), ConvertToMsg(), dan sebagainya.
MSGHTML, EML, MHTML dan MHTConvertToHtml(), ConvertToEml(), dan sebagainya.
Semua format emailPengguna SpesifikasiConvert() dengan parameter jenis output

Metode Implementasi Lanjutan

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

Kesalahan Pemrosesan Pattern

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-Optimized Stream Processing

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

Konfigurasi dan Customization

Struktur direktori output

Ketika menggunakan FolderOutputHandler, Konverter mempertahankan struktur file asli:

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

Strategi nama tersuai

Implementasi nama file tersuai melalui operator output khusus:

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
}

Pertimbangan kinerja

Operasi Asinkron

Semua Metode Konversi Kembali Task Untuk memungkinkan pemrosesan asynchronous yang efektif:

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

Manajemen Sumber Daya

Pengaturan aliran yang tepat sangat penting untuk kinerja optimal:

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

Mengoptimalkan penggunaan memori

Untuk file email besar, pertimbangkan pendekatan 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);
}

Contoh Integrasi

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

Implementasi 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

Masalah Umum dan Solusi

MasalahSolusi
FileNotFoundExceptionPeriksa jalur file input dan izin
UnauthorizedAccessExceptionCheck output directory menulis izin
OutOfMemoryExceptionMenggunakan pendekatan streaming untuk file besar
InvalidOperationExceptionMemastikan format email yang valid untuk file input

Tips Debugging

Memungkinkan log terperinci untuk penyelesaian masalah:

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