Konversi dan Transformasi Pesan dengan Kode Minimal

Mengonversi email dulu berarti memuatnya ke dalam MailMessage, memilih yang tepat SaveOptions, menyambungkan aliran, dan mengingat format mana yang memerlukan saklar mana. The Aspose.Email.LowCode namespace merangkum semua itu menjadi satu panggilan statis. Anda memberinya aliran, nama file, dan format yang diinginkan — ia menentukan sisanya dan menulis hasil ke mana pun Anda menyuruhnya.5899c1__](../src/LowCodeEmailConversion) proyek yang dikirim bersamanya.

Mengapa namespace "low-code"?

Aspose.Email.LowCode adalah lapisan tipis, berorientasi tugas di atas API email lengkap. Ia ada untuk kasus 80% — "Saya hanya perlu mengubah pesan ini ke format itu" — di mana Anda tidak ingin memikirkan model pesan, MIME, atau opsi persistensi.

Ini dibangun di sekitar tiga tipe:

| Tipe | Peran | | — | — | | Converter | Metode statis yang melakukan konversi. | |94b97d5590014b04_IOutputHandler) adalah ide desain utama: konversi satu baris yang sama dapat menargetkan disk, memori, basis data, bucket cloud, atau respons HTTP hanya dengan menukar handler.

API Converter sekilas

Setiap metode adalah static, mengembalikan sebuah Task, dan mengikuti bentuk yang sama:

Task Converter.ConvertToEml  (Stream input, string nameWithExtension, IOutputHandler handler);
Task Converter.ConvertToMsg  (Stream input, string nameWithExtension, IOutputHandler handler);
Task Converter.ConvertToHtml (Stream input, string nameWithExtension, IOutputHandler handler);
Task Converter.ConvertToMht  (Stream input, string nameWithExtension, IOutputHandler handler);
Task Converter.ConvertToMhtml(Stream input, string nameWithExtension, IOutputHandler handler);

// Format chosen at run time via the outputType string ("eml", "msg", "html", ...):
Task Converter.Convert        (Stream input, string nameWithExtension, IOutputHandler handler, string outputType);
Task Converter.ConvertEmlOrMsg(Stream input, string nameWithExtension, IOutputHandler handler, string outputType);

| Parameter | Makna | | — | — | | input | Pesan sumber sebagai Stream (sebuah file, unggahan, buffer memori…). | | nameWithExtension | Nama file asli, misalnya "message.msg". Ekstensi memberi tahu Converter format sumber, jadi harus akurat. | | handler | The IOutputHandler yang menerima aliran output yang telah dikonversi. | | outputType | (Overload waktu jalan saja) format target sebagai string. |

Format sumber yang didukung adalah EML dan MSG; target yang didukung adalah EML, MSG, HTML, MHT, dan MHTML.

Catatan: metode ini bersifat asinkron — selalu await mereka. Converter > menulis ke handler sebagai bagian dari tugas itu, jadi output tidak dijamin > dibuang sampai yang dikembalikan Task selesai.

Deteksi otomatis konversi

Convert membaca ekstensi nameWithExtension, mendeteksi format sumber, dan menghasilkan apa pun outputType anda minta. Ini adalah titik masuk paling fleksibel ketika format target ditentukan pada waktu berjalan (misalnya, dari input pengguna atau konfigurasi).

using Aspose.Email.LowCode;

using FileStream input = File.OpenRead("message.msg");
var handler = new FolderOutputHandler(@"C:\output\auto");

await Converter.Convert(input, "message.msg", handler, "eml");

MSG → EML

Ketika tujuan sudah ditetapkan dan diketahui pada saat kompilasi, pilih metode eksplisit yang mengungkapkan maksud. ConvertToEml mengubah Outlook .msg ke dalam RFC 822 standar .eml:

using FileStream input = File.OpenRead("message.msg");
var handler = new FolderOutputHandler(@"C:\output\eml");

await Converter.ConvertToEml(input, "message.msg", handler);

EML → MSG

Arah sebaliknya. Gunakan ConvertToMsg ketika aplikasi atau penerima mengharapkan item Outlook asli:

using FileStream input = File.OpenRead("message.eml");
var handler = new FolderOutputHandler(@"C:\output\msg");

await Converter.ConvertToMsg(input, "message.eml", handler);

Email → HTML

ConvertToHtml merender pesan sebagai dokumen HTML mandiri — ideal untuk meninjau email di peramban atau menyematkannya dalam halaman web. Itu menerima salah satu .eml atau .msg input:

using FileStream input = File.OpenRead("message.eml");
var handler = new FolderOutputHandler(@"C:\output\html");

await Converter.ConvertToHtml(input, "message.eml", handler);

Email → MHT dan MHTML

Kedua format menggabungkan isi pesan dan sumber dayanya ke dalam satu file arsip web, yang praktis untuk pengarsipan atau berbagi snapshot yang berdiri sendiri. MHTML adalah varian yang lebih kaya dan biasanya mempertahankan header email (Dari / Ke / Subjek / Tanggal) dalam output yang dirender.

// MHT
using (FileStream input = File.OpenRead("message.msg"))
    await Converter.ConvertToMht(input, "message.msg", new FolderOutputHandler(@"C:\output\mht"));

// MHTML
using (FileStream input = File.OpenRead("message.eml"))
    await Converter.ConvertToMhtml(input, "message.eml", new FolderOutputHandler(@"C:\output\mhtml"));

Konversi hanya bila diperlukan

ConvertEmlOrMsg mengonversi input ke format yang diminta hanya jika belum dalam format itu. Arahkan ke tumpukan campuran .eml dan .msg file dan minta "eml": .eml file lewat, .msg file diubah — tanpa Anda harus menbranch pada ekstensi sendiri. Ini membuatnya sempurna untuk menormalkan kotak masuk menjadi satu format.

// .eml input requesting "eml" -> passes through
using (FileStream input = File.OpenRead("message.eml"))
    await Converter.ConvertEmlOrMsg(input, "message.eml", handler, "eml");

// .msg input requesting "eml" -> converted
using (FileStream input = File.OpenRead("message.msg"))
    await Converter.ConvertEmlOrMsg(input, "message.msg", handler, "eml");

Konversi batch sebuah folder

Karena setiap konversi hanyalah pemanggilan metode, skala ke pekerjaan massal membutuhkan hampir tidak ada kode tambahan — enum file dan gunakan kembali handler. Di sini setiap pesan dalam folder dirender ke HTML:

foreach (string path in Directory.EnumerateFiles(inputDir)
             .Where(f => f.EndsWith(".eml") || f.EndsWith(".msg")))
{
    var handler = new FolderOutputHandler(Path.Combine(outputDir, Path.GetFileNameWithoutExtension(path)));
    using FileStream input = File.OpenRead(path);
    await Converter.Convert(input, Path.GetFileName(path), handler, "html");
}

Tips: FolderOutputHandler menulis ke dalam folder yang sudah ada tetapi tidak > membuatnya. Panggil Directory.CreateDirectory(...) pertama. Memberikan masing-masing sumber > folder subnya sendiri juga mencegah benturan ketika beberapa pesan berbagi nama dasar > (dua message.* file yang seharusnya keduanya ingin menulis message.html).

Mengirim output ke tempat selain disk

Ini adalah tempat IOutputHandler abstraksi memberi hasil. Antarmukanya sangat kecil:

public interface IOutputHandler
{
    void AddOutputStream(string name, Action<Stream> writeAction);
    Task AddOutputStream(string name, Func<Stream, Task> writeActionAsync);
}

Konverter memanggil salah satu overload ini dengan nama file output dan penulis. Implementasi Anda menyediakan sebuah Stream dan memutuskan apa yang dilakukan dengan byte. Penangkap yang menampung semuanya di memori tampak seperti ini:

public sealed class InMemoryOutputHandler : IOutputHandler
{
    private readonly Dictionary<string, byte[]> _files = new(StringComparer.OrdinalIgnoreCase);
    public IReadOnlyDictionary<string, byte[]> Files => _files;

    public void AddOutputStream(string name, Action<Stream> writeAction)
    {
        using var buffer = new MemoryStream();
        writeAction(buffer);
        _files[name] = buffer.ToArray();
    }

    public async Task AddOutputStream(string name, Func<Stream, Task> writeActionAsync)
    {
        using var buffer = new MemoryStream();
        await writeActionAsync(buffer);
        _files[name] = buffer.ToArray();
    }
}

Panggilan konversi itu sendiri tidak berubah — hanya penangannya yang berbeda:

var handler = new InMemoryOutputHandler();
using (FileStream input = File.OpenRead("message.msg"))
    await Converter.ConvertToHtml(input, "message.msg", handler);

byte[] html = handler.Files["message.html"]; // stream it, store it, return it...

Dari sini langkah selanjutnya singkat ke sebuah Stream-ke-cloud atau Stream-ke-penangani-respons-HTTP.

Memilih metode yang tepat

| Tujuan | Penggunaan | | — | — | | Format target diketahui pada waktu kompilasi | ConvertToEml / ConvertToMsg / ConvertToHtml / ConvertToMht / ConvertToMhtml | | Format target diputuskan saat runtime | Convert(..., outputType) | | Normalisasi file, melewatkan yang sudah dalam format target | ConvertEmlOrMsg(..., outputType) | | Tulis hasil ke folder | FolderOutputHandler | | Tulis hasil ke memori / cloud / HTTP / basis data | Sebuah kustom IOutputHandler |