إدارة متقدمة لرسائل البريد الإلكتروني

تتبع تقدم تحويل المستند

يوفر Aspose.Email إمكانية تتبع تقدم تحويل المستند. لهذا، توفر API SaveOptions.CustomProgressHandler. الذي يمثل الطريقة التي تتعامل مع أحداث التقدم. يتم تمثيل أنواع أحداث التقدم بواسطة ProgressEventType تعداد. الـ ProgressEventType التعداد يحتوي على الأعضاء التالية.

  • MimeStructureCreated: يُخبر هذا الحدث بأن هيكل MIME تم إنشاؤه.
  • MimePartSaved: يُخبر هذا الحدث بأن حفظ أحد أجزاء MIME انتهى.
  • SavedToStream: يُخبر هذا الحدث بأنه تم حفظ جميع أجزاء MIME إلى التدفق.

الكود النموذجي التالي يوضح استخدام SaveOptions.CustomProgressHandler و ProgressEventType تعداد يتتبع تقدم تحويل المستند.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Email();

var fileName = dataDir + "test.eml";
MailMessage msg = MailMessage.Load(fileName);

MemoryStream ms = new MemoryStream();
EmlSaveOptions opt = new EmlSaveOptions(MailMessageSaveType.EmlFormat);
opt.CustomProgressHandler = new ConversionProgressEventHandler(ShowEmlConversionProgress);
msg.Save(ms, opt);

المقطع التالي هو الشيفرة للفئة المخصصة المستخدمة في مثال الشيفرة أعلاه.

private static void ShowEmlConversionProgress(ProgressEventHandlerInfo info)
{
    int total;
    int saved;
    switch (info.EventType)
    {
        case ProgressEventType.MimeStructureCreated:
            total = info.TotalMimePartCount;
            saved = info.SavedMimePartCount;
            Console.WriteLine("MimeStructureCreated - TotalMimePartCount: " + total);
            Console.WriteLine("MimeStructureCreated - SavedMimePartCount: " + saved);
            break;
        case ProgressEventType.MimePartSaved:
            total = info.TotalMimePartCount;
            saved = info.SavedMimePartCount;
            Console.WriteLine("MimePartSaved - TotalMimePartCount: " + total);
            Console.WriteLine("MimePartSaved - SavedMimePartCount: " + saved);
            break;
        case ProgressEventType.SavedToStream:
            total = info.TotalMimePartCount;
            saved = info.SavedMimePartCount;
            Console.WriteLine("SavedToStream - TotalMimePartCount: " + total);
            Console.WriteLine("SavedToStream - SavedMimePartCount: " + saved);
            break;
    }
}

عرض الروابط التشعبية بأنماط مخصصة

قد تحتاج في بعض الأحيان إلى إخراج الروابط التشعبية بنمط محدد بناءً على متطلبات تطبيقك. لهذا، يوفر Aspose.Email HyperlinkRenderingCallback. يمكنك تمرير الـ HyperlinkRenderingCallback كمعامل لـ MailMessage.GetHtmlBodyText.

المقتطف البرمجي التالي يوضح لك كيفية استخدام HyperlinkRenderingCallback لإخراج الروابط التشعبية باستخدام نمطك المخصص.

public static void Run()
{
    string dataDir = RunExamples.GetDataDir_Email();
    var fileName = dataDir + "LinksSample.eml";
    MailMessage msg = MailMessage.Load(fileName);
    Console.WriteLine(msg.GetHtmlBodyText(RenderHyperlinkWithHref));

    Console.WriteLine(msg.GetHtmlBodyText(RenderHyperlinkWithoutHref));
}

private static string RenderHyperlinkWithHref(string source)
{
    int start = source.IndexOf("href=\"") + "href=\"".Length;
    int end = source.IndexOf("\"", start + "href=\"".Length);
    string href = source.Substring(start, end - start);
    start = source.IndexOf(">") + 1;
    end = source.IndexOf("<", start);
    string text = source.Substring(start, end - start);
    string link = string.Format("{0}<{1}>", text, href);
    return link;
}

private static string RenderHyperlinkWithoutHref(string source)
{
    int start = source.IndexOf(">") + 1;
    int end = source.IndexOf("<", start);
    string text = source.Substring(start, end - start);
    return text;
}

عرض المعلومات بترتيب مخصص في ملفات MHTML

يوفر Aspose.Email MhtSaveOptions.RenderingHeaders خاصية تُعيد قائمة الرؤوس للعرض. يمكنك إضافة الرؤوس باستخدام الـ MhtTemplateName الفئة. يحدد ترتيب إضافة الرؤوس ترتيب عرض المعلومات.

تُقارن الصورة التالية بين المخرجات الثلاث التي تم إنشاؤها بواسطة الشيفرة النموذجية.

todo:image_alt_text

يظهر مقطع الشيفرة التالي توضيحًا لاستخدام MhtSaveOptions.RenderingHeaders خاصية لتحديد ترتيب عرض المعلومات في ملفات MHTML الناتجة.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Email();

MailMessage eml = MailMessage.Load(dataDir + "Attachments.eml");
MhtSaveOptions opt = SaveOptions.DefaultMhtml;

eml.Save(dataDir + "CustomOrderOfInformationInMHTML_1.mhtml", opt);

opt.RenderingHeaders.Add(MhtTemplateName.From);
opt.RenderingHeaders.Add(MhtTemplateName.Subject);
opt.RenderingHeaders.Add(MhtTemplateName.To);
opt.RenderingHeaders.Add(MhtTemplateName.Sent);

eml.Save(dataDir + "CustomOrderOfInformationInMHTML_2.mhtml", opt);

opt.RenderingHeaders.Clear();
opt.RenderingHeaders.Add(MhtTemplateName.Attachments);
opt.RenderingHeaders.Add(MhtTemplateName.Cc);
opt.RenderingHeaders.Add(MhtTemplateName.Subject);

eml.Save(dataDir + "CustomOrderOfInformationInMHTML_3.mhtml", opt);

عرض الحضور الاختياري في ملفات MHT

عند العمل بتنسيق MHT، يمكنك عرض أو إخفاء معلومات حول الحضور الاختياري في رأس أحداث التقويم. لتكوين MhtSaveOptions للتعامل مع ملفات MHT، تحتاج إلى فهم كيفية MhtFormatOptions.RenderCalendarEvent و MhtFormatOptions.WriteHeader المعاملات تعمل على تخصيص المخرجات وفقًا لاحتياجاتك، خاصةً عند إدارة عرض الحضور الاختياري.

  • MhtFormatOptions.RenderCalendarEvent: يتحكم هذا المعامل فيما إذا كانت تفاصيل أحداث التقويم تُعرض في ملف MHT. من خلال ضبط هذا الخيار، تضمن تضمين معلومات شاملة عن الحدث، بما في ذلك تفاصيل الحضور، في المخرجات. وهذا ضروري لتوفير توثيق كامل لأحداث التقويم.

  • MhtFormatOptions.WriteHeader: يحدد هذا المعامل ما إذا كانت الرؤوس التي تحتوي على بيانات ميتا مثل الموضوع، التاريخ، ومعلومات المشاركين (بما في ذلك الحضور الاختياري عند تكوينه) تُكتب في ملف MHT. تمكين هذا الخيار يضمن إرفاق معلومات ذات صلة بسياق الرسالة، مما يحسن الفهم.

يعرض مثال الشيفرة أدناه كيفية استخدام ميزة عرض الحضور الاختياري عند حفظ رسالة msg بتنسيق mhtml:

MhtSaveOptions options = new MhtSaveOptions()
{
    MhtFormatOptions = MhtFormatOptions.RenderCalendarEvent | MhtFormatOptions.WriteHeader
};

MailMessage eml = MailMessage.Load(fileName);
eml.Save(fileName + ".mhtml", options);

إذا كنت بحاجة إلى استبعاد معلومات حول الحضور الاختياري من ملف MHT، ما عليك سوى مسح قالب التنسيق لـ OptionalAttendees قبل الحفظ:

//if you need to skip OptionalAttendees in mhtml file you can clear format template for OptionalAttendees
options.FormatTemplates[MhtTemplateName.OptionalAttendees] = "";
msg.Save(fileName + "2.mhtml", options);

حفظ جميع الرؤوس في MHTML

الـ MhtSaveOptions.SaveAllHeaders خاصية الـ MhtSaveOptions الفئة تحدد ما إذا كان هناك حاجة لحفظ جميع رؤوس الملف في مخرجات mhtml أم لا. يوضح المقتطف البرمجي التالي كيفية حفظ جميع رؤوس ملف mhtml:

var eml = MailMessage.Load("message.eml");
var sopt = SaveOptions.DefaultMhtml;
sopt.SaveAllHeaders = true;
eml.Save("message.mhtml", sopt);

معالجة الرسائل المرتدة

من الشائع جدًا أن الرسالة المرسلة إلى المستلم قد ترتد لأي سبب مثل عنوان مستلم غير صالح. توفر واجهة برمجة التطبيقات Aspose.Email القدرة على معالجة مثل هذه الرسالة للتحقق ما إذا كانت بريدًا مرتدًا أو رسالة بريد إلكتروني عادية. الـ CheckBounced طريقة الـ MailMessage الفئة تُعيد نتيجة صالحة إذا كانت رسالة البريد إلكتروني بريدًا مرتدًا. تُظهر هذه المقالة استخدام الـ BounceResult فئة توفر القدرة على التحقق مما إذا كانت الرسالة بريدًا مرتدًا. كما تُعطي معلومات تفصيلية عن المستلمين، الإجراء المتخذ وسبب الإخطار. يوضح المقتطف البرمجي التالي كيفية معالجة الرسائل المرتدة.

string fileName = RunExamples.GetDataDir_Email() + "failed1.msg";
MailMessage mail = MailMessage.Load(fileName);
BounceResult result = mail.CheckBounced();
Console.WriteLine(fileName);
Console.WriteLine("IsBounced : " + result.IsBounced);
Console.WriteLine("Action : " + result.Action);
Console.WriteLine("Recipient : " + result.Recipient);
Console.WriteLine();
Console.WriteLine("Reason : " + result.Reason);
Console.WriteLine("Status : " + result.Status);
Console.WriteLine("OriginalMessage ToAddress 1: " + result.OriginalMessage.To[0].Address);
Console.WriteLine();

محلل البريد العشوائي بايزي

توفر Aspose.Email تصفية البريد باستخدام محلل Bayesian للرسائل غير المرغوب فيها. إنها توفر الـ SpamAnalyzer فئة لهذا الغرض. تُظهر هذه المقالة كيفية تدريب المرشح للتمييز بين الرسائل غير المرغوب فيها والبريد العادي بناءً على قاعدة كلمات.

يتكون سير العمل من خطوتين. أولاً، يتم تدريب الفلتر على مجموعة من الرسائل العادية ("ham") والرسائل العشوائية مع الـ TrainFilter الطريقة، وتُخزن قاعدة الكلمات الناتجة في SaveDatabase. ثم يتم تحميل قاعدة البيانات إلى SpamAnalyzer والـ اختبار الطريقة تُعيد احتمال (من 0 إلى 1) أن تكون الرسالة بريدًا عشوائيًا.

string hamFolder = RunExamples.GetDataDir_Email() + "/hamFolder";
string spamFolder = RunExamples.GetDataDir_Email() + "/Spam";
string testFolder = RunExamples.GetDataDir_Email();
string dataBaseFile = RunExamples.GetDataDir_Email() + "SpamFilterDatabase.txt";

// Train the filter and save the words database
SpamAnalyzer teacher = new SpamAnalyzer();

foreach (string file in Directory.GetFiles(hamFolder, "*.eml"))
{
    // false marks the message as a regular one
    teacher.TrainFilter(MailMessage.Load(file), false);
}

foreach (string file in Directory.GetFiles(spamFolder, "*.eml"))
{
    // true marks the message as spam
    teacher.TrainFilter(MailMessage.Load(file), true);
}

teacher.SaveDatabase(dataBaseFile);

// Analyze the test messages using the created database
SpamAnalyzer analyzer = new SpamAnalyzer(dataBaseFile);

foreach (string file in Directory.GetFiles(testFolder, "*.eml"))
{
    MailMessage msg = MailMessage.Load(file);
    Console.WriteLine(msg.Subject);

    double probability = analyzer.Test(msg);
    Console.WriteLine(probability > 0.5
        ? $"Spam (probability: {probability:P})"
        : $"Not spam (probability: {probability:P})");
}

الحصول على المقدمة والخاتمة من رسائل EML

قد تحتوي رسالة بريد إلكتروني على بعض المعلومات المخفية كنص عادي قبل جسم الرسالة (أي المقدمة) أو بعده (أي الخاتمة). عادةً ما تكون معلومات إضافية أو سياق للمتلقي قبل أو بعد قراءة المحتوى الرئيسي للرسالة. يمكنك الحصول على هذه المعلومات باستخدام MailMessage.Preamble أو/و MailMessage.Epilogue الخصائص على التوالي.

كلتا الخاصيتين من نوع string وهي قابلة للقراءة/الكتابة، لذا يمكن استخدامها أيضًا لتعيين مقدمة وخاتمة رسالة تقوم بكتابتها. يوضح مقطع الشيفرة التالي كيفية الحصول على نصوص المقدمة والخاتمة:

var eml = MailMessage.Load("message.eml");

// Gets a preamble text
Console.WriteLine("Preamble: " + eml.Preamble);

// Gets an epilogue text
Console.WriteLine("Epilogue: " + eml.Epilogue);

تتبع البريد الإلكتروني باستخدام MDN وإيصالات القراءة

توفر Aspose.Email API دعم تتبع البريد الإلكتروني باستخدام إبلاغ تسليم الرسالة (MDN). يتم ذلك بطلب إيصالات القراءة وإنشاء المعلومات المطلوبة. الـ MailMessage.ReadReceiptTo الخاصية تحصل أو تعين عناوين إقرار القراءة. هي MailAddressCollection، بحيث يمكن تعيين عنوان واحد لها كسلسلة، بينما يمكن إضافة عدة عناوين إلى المجموعة. الـ CreateReadReceipt الطريقة تبني إقرار قراءة للرسالة المستلمة، و MapiMessage.ReadReceiptRequested الخاصية تحصل أو تعين ما إذا كان إقرار القراءة مطلوبًا لرسالة Outlook. يوضح مقطع الشيفرة التالي كيفية تتبع البريد باستخدام Aspose.Email API.

var client = new SmtpClient("smtp.server.com", 587, "username", "password");

// Send a message with the requested read receipt
var mailMessage = new MailMessage("from@domain.com", "to@domain.com", "test MDN", "This is a test message with read receipt requested");

// Request the read receipt. A single address can be assigned as a string
mailMessage.ReadReceiptTo = "from@domain.com";
client.Send(mailMessage);

// Add multiple ReadReceiptTo addresses and send the message
mailMessage = new MailMessage("from@domain.com", "to@domain.com", "test MDN", "This is a test message with read receipt requested");
var addressCollection = new MailAddressCollection();
addressCollection.Add("from@domain.com");
addressCollection.Add("another@domain.com");
mailMessage.ReadReceiptTo = addressCollection;
client.Send(mailMessage);

// On the recipient side: check the request, then create and send the read receipt
var emlMDN = MailMessage.Load("received.eml");
if (emlMDN.ReadReceiptTo.Count > 0)
{
    client.Send(emlMDN.CreateReadReceipt("to@domain.com", null));
}

// Create a MapiMessage with a requested read receipt
var mapiMessage = new MapiMessage("from@domain.com", "to@domain.com", "test MDN", "This is a read requested mapiMessage", OutlookMessageFormat.Unicode);
mapiMessage.ReadReceiptRequested = true;

// Create a MailMessage with a requested read receipt and convert it to MapiMessage
mailMessage = new MailMessage("from@domain.com", "to@domain.com", "test MDN", "This is a test message with read receipt requested");
mailMessage.ReadReceiptTo = "from@domain.com";
mapiMessage = MapiMessage.FromMailMessage(mailMessage, MapiConversionOptions.UnicodeFormat);