misc.log

日常茶飯事とお仕事と

EWSで取得したメールの添付データ

背景と概要

Microsoft Exchangeというメールサーバーには、EWS(Exchange Web Services)というメール情報に関するインターフェイスを提供するウェブサービスが用意されています。このウェブサービスを介してメール情報を取得するという処理を作る必要があったのですが、いくつかの場合について添付画像などが取れないケースがありました。

既存の処理を別言語に移植するという作業だったこともあり、あまり詳しい仕様を知らないまま実装したのが悪いのですが、今になってある程度状況が見えてきたので自分用に整理しておきます。

なお、ざっくりした添付データの仕様は下記のURLにありますので、こちらを見れば一通りはわかるはずです(ま、実際にロジックやデータ構造を見ないとピンとこないと思いますが)。

Attachments and EWS in Exchange/Office Dev Center
https://msdn.microsoft.com/ja-jp/library/office/dn726693(v=exchg.150).aspx

Microsoft Exchange Server Powershell Cookbook 2013: Over 120 Recipes to Help Manage and Administrate Exchange Server 2013 With Powershell 3

Microsoft Exchange Server Powershell Cookbook 2013: Over 120 Recipes to Help Manage and Administrate Exchange Server 2013 With Powershell 3

添付データの種類

添付データには大きく2種類あるようです。それぞれ、メール1件のデータ構造上別のプロパティに格納されることから、取得処理はデータの種類を意識して組む必要があるようです。

ファイルアタッチメント(File attachments)

いわゆる普通の添付データ。Outlookだと、メール送信画面でメール記述ウィンドウにドラッグ&ドロップで添付したExcelファイルなどがこれにあたります。このデータはFileAttachmentプロパティに格納されます。

アイテムアタッチメント(Item attachments)

その他、ファイルアタッチメント以外の添付データ。MSのサイトに上げられている例では、メールのメッセージ(おそらくですが、Outlookで別のメールをドラッグ&ドロップで添付したもの)や、Outlookの予定表にある予定(カレンダーアイテム)などがこれに相当するようです。
このデータはItemAttachmentプロパティに格納されます。

添付データの添付方式

添付データの付き方にも2種あるようです。

非インライン添付

後述の「インライン(Inline)」ではないもの。いわゆる普通の添付データです。これがついたメールデータは、HasAttachmentsプロパティがTrueになります。

インライン添付

HTMLメールの本文に貼付された画像のようなデータです。具体的にはほかにもこの分類になるものはあるのかもしれませんが、現時点で私が確認できたのはHTMLに貼付された画像だけでした。このデータがついている場合、HasAttachmentsプロパティはFalse、IsInlineプロパティがTrueになるようです。
ただし、添付された画像データは前述のFileAttachemntsデータの中に含まれることから、HasAttachmentsプロパティだけで添付データの有無を判断していると、インライン添付データだけがついたメールの添付画像を取り損ねます。


とりあえずこんな感じ。


電子メールプロトコル―基本・実装・運用

電子メールプロトコル―基本・実装・運用