تحويل وتحويل الرسائل بأقل كود

تحويل بريد إلكتروني كان يعني تحميله إلى MailMessage، اختيار الـ SaveOptions، توصيل التدفقات، وتذكّر أي تنسيق يحتاج أي مفاتيح. الـ Aspose.Email.LowCode مساحة الاسم تُلغي كل ذلك إلى استدعاء ثابت واحد. تمرِّر له تدفقًا، اسم الملف، والتنسيق المطلوب — فهو يكتشف الباقي ويكتب النتيجة أينما أخبرتَ.5899c1__](../src/LowCodeEmailConversion) مشروع يُشحن معه.

لماذا مساحة اسم "منخفض الكود"؟

Aspose.Email.LowCode هو سطح رقيق موجه للمهمة فوق واجهة برمجة تطبيقات البريد الإلكتروني الكاملة. وهو موجود لحالة الـ 80٪ — "أحتاج فقط لتحويل هذه الرسالة إلى ذلك التنسيق" — حيث لا تريد التفكير في نماذج الرسائل، MIME، أو خيارات التخزين.

تم بناؤه حول ثلاثة أنواع:

| النوع | الدور | | — | — | | Converter | طرق ثابتة تقوم بالتحويل. | |94b97d5590014b04_IOutputHandler) هي الفكرة التصميمية الرئيسية: يمكن أن تستهدف التحويل سطرًا واحدًا القرص، الذاكرة، قاعدة بيانات، دلو سحابي، أو استجابة HTTP ببساطة عن طريق تبديل المعالج.

نظرة سريعة على واجهة برمجة تطبيقات المحول

كل طريقة هي 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 هم. يقوم المحوّل > بالكتابة إلى المعالج كجزء من تلك المهمة، لذا لا يُضمن أن المخرجات > تُفرغ حتى يتم إرجاع 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 هو المتنوع الأكثر غنى وعادةً ما يحافظ على رؤوس البريد الإلكتروني (من / إلى / الموضوع / التاريخ) في المخرجات المرسومة.

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