メールメッセージ高度管理
ドキュメント変換の進捗を追跡
Aspose.Email はドキュメント変換の進捗を追跡する機能を提供します。そのために、API は以下を提供します。 SaveOptions.CustomProgressHandler。これは進捗イベントを処理するメソッドを表します。進捗イベントタイプは以下によって表現されます。 ProgressEventType 列挙型です。 ProgressEventType 列挙型には以下のメンバーがあります。
- MimeStructureCreated: MIME 構造が作成されたことを通知するイベントです。
- MimePartSaved: 1 つの 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 クラスです。ヘッダーが追加される順序が、情報が表示される順序を決定します。
以下の画像は、サンプルコードで生成された 3 つの出力を比較したものです。

以下のコードスニペットは、次の使用例を示しています 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 API には、そのようなメッセージを処理し、バウンスメールか通常のメールかを確認する機能があります。 バウンス確認 メソッド( 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 この目的のためのクラスです。本記事では、単語データベースに基づいてスパムと通常メールを区別するフィルターのトレーニング方法を示します。
ワークフローは 2 つのステップで構成されます。最初に、フィルタは通常(「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 メッセージから前文と後文を取得
メールメッセージは、本文の前(前文、preamble)または後(後文、epilogue)に平文の隠し情報を含むことがあります。これは通常、受信者がメール本文を読む前後に付加的な情報やコンテキストを提供するものです。この情報は次の方法で取得できます。 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、単一の文字列としてアドレスを割り当てられる一方、複数のアドレスはコレクションに追加できます。The 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);