تبدیل و تبدیل پیام‌ها با حداقل کد

تبدیل ایمیل پیش از این به معنای بارگذاری آن در یک MailMessage، انتخاب صحیح SaveOptions، اتصال جریان‌ها، و به‌خاطر سپردن اینکه کدام فرمت به چه سوئیچ‌هایی نیاز دارد. Aspose.Email.LowCode فضای‌نام تمام این موارد را در یک فراخوانی ایستاتیک جمع می‌کند. شما به آن یک جریان، نام فایل و فرمت موردنظر می‌دهید — بقیه را محاسبه می‌کند و نتیجه را هرجا که بگویید می‌نویسد.5899c1__](../src/LowCodeEmailConversion) پروژه‌ای که همراه آن ارسال می‌شود.

چرا یک فضای‌نام «low-code»؟

Aspose.Email.LowCode یک سطح نازک، وظیفه‌محور بر روی API کامل ایمیل است. برای موارد 80٪ موجود است — «من فقط می‌خواهم این پیام را به آن فرمت تبدیل کنم» — جایی که نمی‌خواهید دربارهٔ مدل‌های پیام، MIME یا گزینه‌های نگهداری فکر کنید.

این حول سه نوع ساخته شده است:

| نوع | نقش | | — | — | | Converter | متدهای ایستاتیک که تبدیل را انجام می‌دهند. | |94b97d5590014b04_IOutputHandler) ایدهٔ کلیدی طراحی است: همان تبدیل یک‌خطه می‌تواند هدف دیسک، حافظه، پایگاه داده، سطل ابری یا پاسخ HTTP باشد تنها با تعویض هندلر.

API مبدل در یک نگاه

هر متد static، یک Task، و همان شکل را دنبال می‌کند:

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

| پارامتر | معنی | | — | — | | input | پیام منبع به عنوان یک Stream (یک فایل، یک آپلود، یک بافر حافظه…). | | nameWithExtension | نام فایل اصلی، مثلاً "message.msg". پسوند به مبدل می‌گوید فرمت منبع چیست، بنابراین باید دقیق باشد. | | handler | الف IOutputHandler که جریان خروجی تبدیل‌شده را دریافت می‌کند. | | outputType | (فقط بارگذاری‌های زمان اجرا) فرمت هدف به عنوان رشته. |

فرمت‌های منبع پشتیبانی‌شده EML و MSG هستند؛ فرمت‌های هدف پشتیبانی‌شده EML، MSG، HTML، MHT و MHTML می‌باشند.

نکته: این متدها ناهمگام هستند — همیشه await آنها. مبدل > به عنوان بخشی از آن کار به هندلر می‌نویسد، بنابراین خروجی تا زمان بازگرداندن تضمین نمی‌شود که > flush شده باشد. Task اتمام می‌یابد.

کشف خودکار تبدیل

Convert پسوند را می‌خواند nameWithExtension، فرمت منبع را تشخیص می‌دهد و هر چه outputType آنچه درخواست می‌کنید. این انعطاف‌پذیرترین نقطه ورودی است وقتی که فرمت هدف در زمان اجرا تصمیم‌گیری می‌شود (به عنوان مثال، از ورودی کاربر یا تنظیمات).

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

زمانی که مقصد ثابت و در زمان کامپایل شناخته شده باشد، روش صریح و نشان‌دهندهٔ نیت را ترجیح دهید. ConvertToEml یک Outlook را تبدیل می‌کند .msg به یک RFC 822 استاندارد .eml:

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

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

EML → MSG

جهت معکوس. استفاده کنید ConvertToMsg وقتی یک برنامه یا گیرنده موارد بومی Outlook را انتظار دارد:

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

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

ایمیل → HTML

ConvertToHtml یک پیام را به عنوان یک سند HTML مستقل رندر می‌کند — ایده‌آل برای پیش‌نمایش ایمیل در مرورگر یا جاسازی آن در یک صفحهٔ وب. این یا .eml یا .msg ورودی:

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

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

ایمیل → MHT و MHTML

هر دو فرمت بدنهٔ پیام و منابع آن را در یک فایل وب‌آرشیو واحد بسته‌بندی می‌کنند که برای بایگانی یا اشتراک‌گذاری یک اسنپ‌شات خودمحافظ مناسب است. MHTML نسخهٔ غنی‌تر است و معمولاً سرآیندهای ایمیل (From / To / Subject / Date) را در خروجی رندر شده حفظ می‌کند.

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

تنها هنگام نیاز تبدیل کنید

ConvertEmlOrMsg ورودی را فقط در صورتی که قبلاً در آن فرمت نباشد به فرمت درخواستی تبدیل می‌کند. آن را به یک انبار مخلوط از .eml و .msg فایل‌ها و درخواست کنید "eml": .eml فایل‌ها عبور می‌کنند، .msg فایل‌ها تبدیل می‌شوند — بدون این که خودتان بر پایهٔ پسوند شاخه‌بندی کنید. این برای نرمال‌سازی یک صندوق ورودی به یک فرمت مناسب است.

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

تبدیل دسته‌ای یک پوشه

از آنجایی که هر تبدیل فقط یک فراخوانی متد است، مقیاس‌پذیری برای پردازش‌های بزرگ تقریباً بدون کد اضافی انجام می‌شود — فایل‌ها را لیست کنید و هندلر را مجدداً استفاده کنید. در اینجا هر پیام در یک پوشه به 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");
}

نکته: FolderOutputHandler در یک پوشهٔ موجود می‌نویسد اما آن را ایجاد نمی‌کند. صدا بزنید Directory.CreateDirectory(...) اولین. اختصاص هر منبع به پوشه‌ٔ زیرمجموعهٔ خود نیز از تداخل‌ها جلوگیری می‌کند وقتی چند پیام نام پایهٔ یکسانی دارند (دو message.* فایل‌ها در غیر این صورت هر دو می‌خواهند بنویسند message.html).

ارسال خروجی به جایی جز دیسک

این جایی است که IOutputHandler انتزاعی فراهم می‌کند. رابط بسیار کوچک است:

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

مبدل یکی از این بارگذاری‌ها را با نام فایل خروجی و یک نويسنده فراخوانی می‌کند. پیاده‌سازی شما یک Stream و تصمیم می‌گیرد با بایت‌ها چه کاری انجام دهد. یک دستگیره که همه چیز را در حافظه می‌گیرد به این شکل است:

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

فراخوانی تبدیل خود تغییر نمی‌کند — فقط دستگیره متفاوت است:

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...

از اینجا گام کوتاهی به یک Stream-به‌ابری یا Stream-به‌دسترس‌گذار پاسخ HTTP.

انتخاب روش مناسب

| هدف | استفاده | | — | — | | فرمت هدف در زمان کامپایل شناخته شده است | ConvertToEml / ConvertToMsg / ConvertToHtml / ConvertToMht / ConvertToMhtml | | فرمت هدف در زمان اجرا تعیین می‌شود | Convert(..., outputType) | | نرمال‌سازی فایل‌ها، عبور از مواردی که قبلاً در فرمت مقصد هستند | ConvertEmlOrMsg(..., outputType) | | نوشتن نتایج در یک پوشه | FolderOutputHandler | | نوشتن نتایج در حافظه / ابر / HTTP / پایگاه‌داده | یک سفارشی IOutputHandler |