メッセージ添付ファイルの管理
Outlook における添付ファイルの処理
Outlook メッセージ(MSG)ファイルの作成と保存 メッセージの作成と保存、添付ファイル付き MSG ファイルの作成方法を説明しています。本記事では、Aspose.Email を使用した Microsoft Outlook の添付ファイルの管理方法を解説します。メッセージファイルからの添付ファイルは、以下を使用してアクセスし、ディスクに保存します。 MapiMessage クラス 添付ファイル プロパティです。 添付ファイル プロパティは型のコレクションです MapiAttachmentCollection クラス。
添付タイプの確認 (インラインまたは通常)
インライン添付と通常添付は異なる目的で使用されます。インライン添付はメール本文に視覚的に組み込まれ、通常は画像やメディアファイルです。一方、通常添付はメールに添付された別個のファイルで、さまざまな種類のファイルが含まれます。 MapiAttachment.IsInline プロパティ( MapiAttachment クラスは、添付ファイルがインラインか通常かを示す値を取得します。
以下のコードサンプルは、ロードされた MapiMessage 内の各添付ファイルの情報を抽出・表示します。表示名やインライン添付かどうかなどが含まれます。
var message = MapiMessage.Load(fileName);
foreach (var attach in message.Attachments)
{
Console.WriteLine($"{attach.DisplayName} : {attach.IsInline}");
}
添付タイプの確認 (IsReference)
この MapiAttachment クラスには IsReference プロパティは、開発者がメッセージ内の参照添付ファイルを識別できるようにします。以下のコードサンプルを使用して、添付ファイルが参照添付かどうかを確認できます:
foreach (var attachment in msg.Attachments)
{
if (attachment.IsReference)
{
// Process reference attachment
}
}
MSG ファイルから添付ファイルを保存
MSG ファイルから添付ファイルを保存するには:
- 次を反復処理します MapiAttachmentCollection コレクションから個々の添付ファイルを取得します。
- 添付ファイルを保存するには、MapiAttachment クラスの Save() メソッドを呼び出します。
以下のコードスニペットは、添付ファイルをローカルディスクに保存する方法を示しています。
// Create an instance of MapiMessage from file
MapiMessage message = MapiMessage.FromFile(dataDir + fileName);
// Iterate through the attachments collection
foreach (MapiAttachment attachment in message.Attachments)
{
// Save the individual attachment
attachment.Save(dataDir + attachment.FileName);
}
RTF 形式の MSG ファイルから添付を抽出
RTF 形式のメッセージの場合、以下のコードを使用してインライン添付またはアイコンとしてメッセージ本文に表示される添付を区別し抽出できます。次のコードスニペットは、RTF 形式の MSG から埋め込み添付を特定し抽出する方法を示しています。
var eml = MapiMessage.Load("MSG file with RTF Formatting.msg");
foreach (var attachment in eml.Attachments)
{
if (IsAttachmentInline(attachment))
{
try
{
SaveAttachment(attachment, Guid.NewGuid().ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
static bool IsAttachmentInline(MapiAttachment attachment)
{
foreach (var property in attachment.ObjectData.Properties.Values)
{
if (property.Name == "\x0003ObjInfo")
{
var odtPersist1 = BitConverter.ToUInt16(property.Data, 0);
return (odtPersist1 & (1 << (7 - 1))) == 0;
}
}
return false;
}
static void SaveAttachment(MapiAttachment attachment, string fileName)
{
foreach (var property in attachment.ObjectData.Properties.Values)
{
if (property.Name == "Package")
{
using var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
fs.Write(property.Data, 0, property.Data.Length);
}
}
}
入れ子メールメッセージ添付の取得
埋め込み OLE 添付も以下に表示されます: MapiMessage クラス Attachment コレクション。以下のコード例は、メッセージファイル内の埋め込みメッセージ添付を解析し、ディスクに保存します。 MapiMessage クラス FromProperties() の静的メソッドは、埋め込み添付から新しいメッセージを作成できます。以下のコードスニペットは、入れ子になったメールメッセージの添付を取得する方法を示しています。
// Create a MapiMessage object from the individual attachment
MapiMessage getAttachment = MapiMessage.FromProperties(attachment.ObjectData.Properties);
// Convert the embedded message to a MailMessage and save it to disk
MailMessage mailMessage = getAttachment.ToMailMessage(new MailConversionOptions());
mailMessage.Save(dataDir + @"NestedMailMessageAttachments_out.eml", SaveOptions.DefaultEml);
添付ファイルを削除
Aspose Outlook ライブラリは、Microsoft Outlook メッセージ (.msg) ファイルから添付ファイルを削除する機能を提供します。
- RemoveAttachments() メソッドを呼び出します。メッセージファイルのパスをパラメータとして受け取ります。これは public static メソッドとして実装されているので、オブジェクトをインスタンス化する必要はありません。
次のコード スニペットは、添付ファイルを削除する方法を示します。
MapiMessage.RemoveAttachments(dataDir + "AttachmentsToRemove_out.msg");
また、以下を呼び出すことができます: MapiMessage クラスの静的メソッド DestroyAttachments(). RemoveAttachments() より高速です。RemoveAttachments() メソッドはメッセージ ファイルを解析するためです。
MapiMessage.DestroyAttachments(dataDir + "AttachmentsToDestroy_out.msg");
MSG 添付ファイルを追加
Outlook メッセージは、添付として通常のメッセージまたは埋め込みメッセージとして、他の Microsoft Outlook メッセージを含めることができます。 MapiAttachmentCollection のオーバーロードされたメンバーを提供します。 Add 両方のタイプの添付ファイルを持つ Outlook メッセージを作成するメソッド:
Add(string name, byte[] data)– バイト配列から通常の添付ファイルを追加します。Add(string name, MapiMessage message)– 別の Outlook メッセージを埋め込みメッセージとして追加します。
次のコード スニペットは、メッセージに両方のタイプの添付ファイルを追加する方法を示します。
MapiMessage message = new MapiMessage("from@test.com", "to@test.com", "Subj", "This is a message body");
// Add a regular attachment from a byte array
message.Attachments.Add("note.txt", File.ReadAllBytes(dataDir + "note.txt"));
// Add another Outlook message as an embedded message
MapiMessage attachMsg = MapiMessage.FromFile(dataDir + "Message.msg");
message.Attachments.Add("Weekly report.msg", attachMsg);
message.Save(dataDir + "WithAttachments_out.msg");
Try it out!
無料でメール添付を追加または削除する Aspose.Email エディタ アプリ.
MapiMessage に参照添付を追加
この ReferenceAttachmentOptions クラスは、必要なすべてのプロパティを単一のオブジェクトにカプセル化することで、参照添付の追加を簡素化します。
ReferenceAttachmentOptions のパラメータ:
- sharedLink: ファイルをホストするウェブサービスが提供する完全修飾された共有リンクです。
- url: ファイルの場所またはリソース URL。
- providerName: 参照添付プロバイダーの名前(例: Google Drive、Dropbox)
- 例: ReferenceAttachmentOptions を使用した参照添付の追加
var options = new ReferenceAttachmentOptions(
"https://drive.google.com/file/d/1HJ-M3F2qq1oRrTZ2GZhUdErJNy2CT3DF/",
"https://drive.google.com/drive/my-drive",
"GoogleDrive");
// Add reference attachment
msg.Attachments.Add("Document.pdf", options);
メッセージを添付として埋め込む
以下のコードスニペットは、メッセージに MSG ファイル添付を埋め込む方法を示しています。
MapiMessage message = new MapiMessage("from@test.com", "to@test.com", "Subj", "This is a message body");
MapiMessage attachMsg = MapiMessage.FromFile(dataDir + "Message.msg");
message.Attachments.Add("Weekly report.msg", attachMsg);
message.Save(dataDir + "WithEmbeddedMsg_out.msg");
添付ファイルから埋め込みメッセージを読む
以下のコードスニペットは、添付ファイルから埋め込みメッセージを読み取る方法を示しています。
var message = MapiMessage.FromFile(fileName);
if (message.Attachments[0].ObjectData.IsOutlookMessage)
{
var getData = message.Attachments[0].ObjectData.ToMapiMessage();
}
添付の挿入と置換
Aspose.Email API は、親メッセージ内の特定のインデックスに添付ファイルを挿入する機能を提供します。また、添付ファイルの内容を別のメッセージ添付で置き換える機能も提供します。
Try it out!
以下を実行します。 ReplaceAttach シンプルなアプリプロジェクトを作成し、Aspose.Email の機能を使用して添付ファイルを置換してみてください。
特定の位置に添付ファイルを挿入
Aspose.Email API は、MapiAttachmentCollection の Insert メソッド(MapiAttachmentCollection Insert(int index, string name, MapiMessage msg))を使用して、MSG 添付ファイルを親 MSG に挿入する機能を提供します。以下のコードスニペットは、特定の位置に添付ファイルを挿入する方法を示しています。
var message = MapiMessage.FromFile(fileName);
var memoryStream = new MemoryStream();
message.Attachments[2].Save(memoryStream);
var getData = MapiMessage.FromStream(memoryStream);
message.Attachments.Insert(1, "new 11", getData);
添付ファイルの内容を置換
Replace メソッドを使用して埋め込み添付ファイルの内容を新しいものに置き換えることができます。ただし、コレクションの Count が 2 である場合に PR_ATTACH_NUM = 4 の添付ファイルを挿入することはできません。以下のコードスニペットは、添付ファイルの内容を置き換える方法を示しています。
var message = MapiMessage.FromFile(fileName);
var memoryStream = new MemoryStream();
message.Attachments[2].Save(memoryStream);
var getData = MapiMessage.FromStream(memoryStream);
message.Attachments.Replace(1, "new 1", getData);
MapiMessage の添付ファイルの名前変更
MapiMessage の添付ファイルにおいて、DisplayName プロパティの値を編集することが可能です。
var msg = MapiMessage.Load(fileName);
msg.Attachments[0].DisplayName = "New display name 1";
msg.Attachments[1].DisplayName = "New display name 2";
デジタル署名されたメッセージから添付を保存
Aspose.Email API は、クリア署名メッセージをデコードするかどうかを示す値を取得または設定する機能を提供します。
oledata.mso から埋め込み OLE オブジェクトを抽出する
埋め込み OLE データが oledata.mso 添付ファイルは MapiAttachment と組み合わせて使用でき、手動で抽出する必要があります。これらの oledata.mso ファイルが Microsoft Compound Document File (MCDF) 形式であることを前提としており、これらのファイルのサポートは Aspose.Email の範囲外です。ただし、Aspose.Email は OpenMCDF、これらのファイルの内容を読み取り、ディスクに保存します。Aspose.Email は InlineAttachmentExtractor バイナリ データに含まれる MSO パッケージを列挙するクラスです。 oledata.msoが生成され、コンパウンド ファイル読み取りライブラリに渡して内容を抽出できます。
メッセージ本文タイプが HTML(RTF ではない)で、メッセージに OLE オブジェクトがある場合、 MapiPropertyTag.PR_ATTACH_DATA_OBJ プロパティが存在しません。この場合、OLE オブジェクトに関する情報は oledata.mso.
Aspose.Email と OpenMCDF を使用して内容を抽出するには:
- バイナリ データから MSO パッケージを列挙します。
oledata.mso添付ファイル。 - 各 OLE アイテムについて、コンパウンド ファイルを読み取ります。
- ストリーム名を読み取ります。
CONTENTS. - 内容を
FileStream.
// The path to the File directory
string dataDir = RunExamples.GetDataDir_Email();
MapiMessage msg = MapiMessage.FromFile(dataDir + "double.msg");
foreach (MapiAttachment mapiAttachment in msg.Attachments)
{
if (mapiAttachment.LongFileName == "oledata.mso")
{
IDictionary<string, byte[]> oledata = InlineAttachmentExtractor.EnumerateMsoPackage(new MemoryStream(mapiAttachment.BinaryData));
int index = 0;
foreach (var oleItem in oledata)
{
// Using the OpenMCDF library
CompoundFile cf = new CompoundFile(new MemoryStream(oleItem.Value));
CFStream contents = cf.RootStorage.GetStream("CONTENTS");
using (FileStream fs = File.OpenWrite(index + ".pdf"))
{
byte[] data = contents.GetData();
fs.Write(data, 0, data.Length);
fs.Flush();
fs.Close();
}
index++;
}
}
}