مدیریت پیشرفته پیام‌های ایمیل

پیگیری پیشرفت تبدیل سند

Aspose.Email امکان پیگیری پیشرفت تبدیل سند را فراهم می‌کند. برای این منظور، API ارائه می‌دهد SaveOptions.CustomProgressHandler. که نشان‌دهنده روشی است که رویدادهای پیشرفت را مدیریت می‌کند. انواع رویداد پیشرفت توسط ProgressEventType شمارش. The 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);

پردازش پیام‌های برگشتی

امکان دارد پیامی که به گیرنده ارسال می‌شود به دلایلی مانند آدرس نامعتبر گیرنده بازگردد. API Aspose.Email قابلیت پردازش چنین پیامی را برای بررسی اینکه آیا ایمیل برگشتی است یا پیام ایمیل عادی دارد. The بررسی ایمیل برگشتی متد از 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 فیلتر ایمیل را با استفاده از تحلیلگر اسپم بیزی ارائه می‌دهد. این امکان را فراهم می‌کند 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 و دریافت خواندن

API Aspose.Email پشتیبانی از ردیابی ایمیل را با استفاده از اعلان وضعیت پیام (MDN) فراهم می‌کند. این با درخواست دریافت‌های خواندن و ایجاد اطلاعات مورد نیاز حاصل می‌شود. The MailMessage.ReadReceiptTo دریافت یا تنظیم آدرس‌های رسید خواندن را فراهم می‌کند. این یک MailAddressCollection, بنابراین یک آدرس می‌تواند به‌صورت رشته به آن اختصاص یابد، در حالی که چندین آدرس می‌تواند به مجموعه اضافه شود. ویژگی CreateReadReceipt متد یک رسید خواندن برای پیام دریافت‌شده می‌سازد، و MapiMessage.ReadReceiptRequested ویژگی دریافت یا تنظیم این که آیا دریافت رسید خواندن برای یک پیام Outlook درخواست شود یا نه. قطعه کد زیر نشان می‌دهد چگونه ایمیل را با API Aspose.Email پیگیری کنید.

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