Exchange で EWS を使用して添付物を取得する
EWS マネージ API または Exchange の EWS を使用して、EWS アイテムから添付物を取得する方法について説明します。
EWS マネージ APIまたは EWS を使用して、EWS から添付物を取得する方法について説明します。 アイテムを取得するための最初の呼び出しには、アイテムの添付コレクションに関するメタデータだけが含まれるので、添付物の取得は常に 2 段階プロセスになります。 最初に、アイテムを取得します。 次に、添付物を取得します。
表 1. 添付物を追加するためのEWS マネージ API とEWS の操作
タスク | EWS マネージ API メソッド | EWS 操作 |
---|---|---|
アイテム添付を取得する |
Item.Bind の後に ItemAttachment.Load |
GetItem の後に GetAttachment |
ファイル添付を取得する |
Item.Bind の後に FileAttachment.Load |
GetItem の後に GetAttachment |
EWS マネージ API を使用して電子メールから添付物を取得する
次のコード例は、 Bind メソッドを使用して EmailMessage オブジェクトを取得し、添付コレクションを反復処理して、添付物ごとに FileAttachment.Load メソッドまたは ItemAttachment.Load メソッドを適宜呼び出す方法を示します。 各ファイル添付が C:\temp\ フォルダーに保存され、各アイテム添付がメモリに読み込まれます。 アイテム添付を保存する方法の詳細については、「 EWS マネージ API を使用して、添付のある電子メールを保存する」を参照してください。
この例では、 service が有効な ExchangeService オブジェクトであり、 itemId が添付物の取得元のメッセージの ItemId であり、ユーザーが Exchange Server に認証されたと想定しています。
public static void GetAttachmentsFromEmail(ExchangeService service, ItemId itemId)
{
// Bind to an existing message item and retrieve the attachments collection.
// This method results in an GetItem call to EWS.
EmailMessage message = EmailMessage.Bind(service, itemId, new PropertySet(ItemSchema.Attachments));
// Iterate through the attachments collection and load each attachment.
foreach (Attachment attachment in message.Attachments)
{
if (attachment is FileAttachment)
{
FileAttachment fileAttachment = attachment as FileAttachment;
// Load the attachment into a file.
// This call results in a GetAttachment call to EWS.
fileAttachment.Load("C:\\temp\\" + fileAttachment.Name);
Console.WriteLine("File attachment name: " + fileAttachment.Name);
}
else // Attachment is an item attachment.
{
ItemAttachment itemAttachment = attachment as ItemAttachment;
// Load attachment into memory and write out the subject.
// This does not save the file like it does with a file attachment.
// This call results in a GetAttachment call to EWS.
itemAttachment.Load();
Console.WriteLine("Item attachment name: " + itemAttachment.Name);
}
}
}
EWS を使用して電子メールから添付物を取得する
EWS を使用して添付物を取得するには、最初にメッセージと添付コレクションを取得して、取得する添付物の AttachmentId (GetAttachment と DeleteAttachment) を取得します。 1 つ以上の AttachmentId の値を取得したら、 GetAttachment 操作を呼び出して、添付物のすべてのプロパティを読み込みます。
次のコード例は、GetItem 操作を使用して電子メール メッセージとメッセージの添付物のコレクションを取得する方法を示しています。 これは、EWS マネージ API を使用して 電子メールからすべての添付物を取得するときに EWS マネージ API が送信する最初の XML 要求でもあります。 読みやすくするため、一部の属性の値が短縮されています。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange207_SP1" />
</soap:Header>
<soap:Body>
<m:GetItem>
<m:ItemShape>
<t:BaseShape>IdOnly</t:BaseShape>
<t:AdditionalProperties>
<t:FieldURI FieldURI="item:Attachments" />
</t:AdditionalProperties>
</m:ItemShape>
<m:ItemIds>
<t:ItemId Id="ERu/AAA=" />
</m:ItemIds>
</m:GetItem>
</soap:Body>
</soap:Envelope>
サーバーは、 GetItem 要求に GetItemResponse メッセージで応答します。このメッセージには、電子メールが正常に作成されたことを示す NoError の ResponseCode 値 、および既存の添付物の AttachmentId が含まれます。
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15"
MinorVersion="0"
MajorBuildNumber="939"
MinorBuildNumber="12"
Version="V2_11"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:GetItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:Message>
<t:ItemId Id="ERu/AAA="
ChangeKey="CQAAABYAAAAFI5DJmZv+TLtyLOLIF1S5AAAYEMnd" />
<t:Attachments>
<t:FileAttachment>
<t:AttachmentId Id="5zTzlqU=" />
<t:Name>FileAttachment.txt</t:Name>
<t:Size>212</t:Size>
<t:LastModifiedTime>2014-05-14T17:59:30</t:LastModifiedTime>
<t:IsInline>false</t:IsInline>
<t:IsContactPhoto>false</t:IsContactPhoto>
</t:FileAttachment>
<t:ItemAttachment>
<t:AttachmentId Id="Ktum21o=" />
<t:Name>Attached Message Item</t:Name>
<t:Size>3063</t:Size>
<t:LastModifiedTime>2014-05-14T17:59:30</t:LastModifiedTime>
<t:IsInline>false</t:IsInline>
</t:ItemAttachment>
</t:Attachments>
</t:Message>
</m:Items>
</m:GetItemResponseMessage>
</m:ResponseMessages>
</m:GetItemResponse>
</s:Body>
</s:Envelope>
AttachmentId の値がわかったので、取得する各添付物の GetAttachment を呼び出します。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
</soap:Header>
<soap:Body>
<m:GetAttachment>
<m:AttachmentIds>
<t:AttachmentId Id="5zTzlqU=" />
</m:AttachmentIds>
</m:GetAttachment>
</soap:Body>
</soap:Envelope>
アイテム添付を取得するときは、添付物が正常に取得されたことを示す NoError の ResponseCode の値を含む GetAttachmentResponse メッセージ、および添付されたアイテムのすべての要素 (このケースでは電子メール メッセージ) をもって、サーバーは GetAttachment の要求に応答します。
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15"
MinorVersion="0"
MajorBuildNumber="939"
MinorBuildNumber="12"
Version="V2_11"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:GetAttachmentResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:GetAttachmentResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Attachments>
<t:ItemAttachment>
<t:AttachmentId Id="Ktum21o=" />
<t:Name>Attached Message Item</t:Name>
<t:Message>
<t:ItemClass>IPM.Note</t:ItemClass>
<t:Subject>Message Item Subject</t:Subject>
<t:Body BodyType="HTML">&lt;meta http-equiv="Content-Type"
content="text/html; charset=utf-8"&gt;Message Item Body</t:Body>
<t:Size>2859</t:Size>
<t:IsSubmitted>false</t:IsSubmitted>
<t:IsDraft>true</t:IsDraft>
<t:IsFromMe>false</t:IsFromMe>
<t:IsResend>false</t:IsResend>
<t:IsUnmodified>false</t:IsUnmodified>
<t:DateTimeCreated>2014-05-14T17:59:37Z</t:DateTimeCreated>
<t:ResponseObjects>
<t:ForwardItem />
</t:ResponseObjects>
<t:DisplayCc />
<t:DisplayTo>primary; emaildelegate</t:DisplayTo>
<t:HasAttachments>false</t:HasAttachments>
<t:Culture>en</t:Culture>
<t:EffectiveRights>
<t:CreateAssociated>false</t:CreateAssociated>
<t:CreateContents>false</t:CreateContents>
<t:CreateHierarchy>false</t:CreateHierarchy>
<t:Delete>true</t:Delete>
<t:Modify>true</t:Modify>
<t:Read>true</t:Read>
</t:EffectiveRights>
<t:LastModifiedName>primary</t:LastModifiedName>
<t:LastModifiedTime>2014-05-14T17:59:30Z</t:LastModifiedTime>
<t:IsAssociated>false</t:IsAssociated>
<t:WebClientReadFormQueryString>?ItemID=AAMk3D&amp;exvsurl=1&amp;viewmodel=
ReadMessageItem</t:WebClientReadFormQueryString>
<t:ConversationId Id="AAQkADIwM2ZlM2ZlLWMwYjctNDg2N/Rc+d0=" />
<t:ToRecipients>
<t:Mailbox>
<t:Name>primary</t:Name>
<t:EmailAddress>sadie@contoso.com</t:EmailAddress>
<t:RoutingType>SMTP</t:RoutingType>
<t:MailboxType>Mailbox</t:MailboxType>
</t:Mailbox>
<t:Mailbox>
<t:Name>emaildelegate</t:Name>
<t:EmailAddress>ronnie@contoso.com</t:EmailAddress>
<t:RoutingType>SMTP</t:RoutingType>
<t:MailboxType>Mailbox</t:MailboxType>
</t:Mailbox>
</t:ToRecipients>
<t:IsReadReceiptRequested>false</t:IsReadReceiptRequested>
<t:ConversationIndex>AQHPb55BxR5Fm0Arx0yY4xbL9Fz53Q==</t:ConversationIndex>
<t:ConversationTopic>Message Item Subject</t:ConversationTopic>
<t:IsRead>true</t:IsRead>
</t:Message>
</t:ItemAttachment>
</m:Attachments>
</m:GetAttachmentResponseMessage>
</m:ResponseMessages>
</m:GetAttachmentResponse>
</s:Body>
</s:Envelope>
ファイル添付を取得するときは、添付物が正常に取得されたことを示す NoError の ResponseCode の値を含む GetAttachmentResponse メッセージ、およびファイル添付のすべての要素をもって、サーバーは GetAttachment の要求に応答します。
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15"
MinorVersion="0"
MajorBuildNumber="939"
MinorBuildNumber="12"
Version="V2_11"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:GetAttachmentResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:GetAttachmentResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Attachments>
<t:FileAttachment>
<t:AttachmentId Id="5zTzlqU=" />
<t:Name>FileAttachment.txt</t:Name>
<t:Content>VGhpcyBpcyBhIGZpbGUgYXR0YWNobWVudC4=</t:Content>
</t:FileAttachment>
</m:Attachments>
</m:GetAttachmentResponseMessage>
</m:ResponseMessages>
</m:GetAttachmentResponse>
</s:Body>
</s:Envelope>
EWS マネージ API を使用して、添付のある電子メールを保存する
EWS マネージ API を使用して電子メールの添付物の内容を保存するには、MimeContent をファイルに保存する必要があります。 この場合、フォローアップ フラグやカテゴリなど、アイテムに設定された拡張プロパティはすべて失われます。 この例では、電子メールの添付物を C:\temp\ フォルダーに保存します。
なお、アイテム添付は厳密に型指定されたアイテムではないため、別のフォルダーにアイテム添付を移動またはコピーすることはできません。このため、添付物を別のフォルダーに移動しようとしている場合は、次のコード例を使用して、別のフォルダーにファイルをインポートします。
public static void SaveEmailAttachment(ExchangeService service, ItemId itemId)
{
// Bind to an existing message item and retrieve the attachments collection.
// This method results in an GetItem call to EWS.
EmailMessage message = EmailMessage.Bind(service, itemId, new PropertySet(ItemSchema.Attachments));
foreach (Attachment attachment in message.Attachments)
{
if (attachment is ItemAttachment)
{
ItemAttachment itemAttachment = attachment as ItemAttachment;
itemAttachment.Load(ItemSchema.MimeContent);
string fileName = "C:\\Temp\\" + itemAttachment.Item.Subject + ".eml";
// Write the bytes of the attachment into a file.
File.WriteAllBytes(fileName, itemAttachment.Item.MimeContent.Content);
Console.WriteLine("Email attachment name: "+ itemAttachment.Item.Subject + ".eml");
}
}
}