Exchange で EWS を使用して、代理人としてメールにアクセスする
Exchange で EWS マネージ API または EWS を使用して、代理人としてメールにアクセスする方法を説明します。
EWS マネージ API または EWS を使用して、ユーザーにメーボックス所有者の受信トレイ フォルダーへの代理人アクセス権を付与できます。 代理人は、メールボックス所有者の代わりに会議出席依頼を作成し、アクセス許可に応じて、メールボックス所有者の受信トレイ フォルダーのメールの検索、取得、更新、削除を行うことができます。
代理人として、代理人アクセスなしで受信トレイ フォルダーにアクセスするために使用するメールボックス所有者の受信トレイ フォルダーにアクセスする場合と同じ方法と操作を使用します。 メイン違いは、明示的なアクセスを使用してメール アイテムを検索または作成する必要があり、アイテム ID を特定した後、暗黙的なアクセスを使用してアイテムを取得、更新、または削除できることです。
表 1. 代理人としてメールにアクセスするための EWS マネージ API メソッドと EWS 操作
目的 | 使用する EWS マネージ API メソッド… | 使用する EWS 操作… |
---|---|---|
代理人としてメールを作成して送信する |
EmailMessage.Save: FolderId パラメーターがメールボックス所有者の下書きフォルダーへの明示的なアクセスを提供する EmailMessage.SendAndSaveCopy: FolderId パラメーターがメールボックス所有者の送信済みアイテム フォルダーへの明示的なアクセスを提供する |
CreateItem: Mailbox 要素がメールボックス所有者の EmailAddress を指定する SendItem: Mailbox 要素がメールボックス所有者の EmailAddress を指定する |
代理人として複数のメール メッセージを作成する |
ExchangeService.CreateItems: FolderId パラメーターがメールボックス所有者の受信トレイ フォルダーに明示的なアクセスを提供する |
CreateItem: Mailbox 要素がメールボックス所有者の EmailAddress を指定する |
代理人としてメールを検索する |
ExchangeService.FindItems: FolderId パラメーターがメールボックス所有者の受信トレイ フォルダーに明示的なアクセスを提供する |
FindItem: Mailbox 要素がメールボックス所有者の EmailAddress を指定する |
代理人としてメールを取得 |
EmailMessage.Bind |
GetItem |
代理人としてメールを更新する |
EmailMessage.Bind の後に EmailMessage.Update |
GetItem の後に UpdateItem |
代理人としてメールを削除する |
EmailMessage.Bind の後に EmailMessage.Delete |
GetItem の後に DeleteItem |
代理人としてメールを操作する場合、次の点に注意してください。
代理人が行う必要がある操作が会議出席依頼と出欠の返答だけである場合、受信トレイ フォルダーへのアクセスは必要ありません。 詳しくは、「代理人として予定表にアクセスするために事前に必要なタスク」をご覧ください。
メールボックス所有者の代理として送信したメッセージを受信者が受信すると、送信者は「メールボックス所有者の代理人」として表示されます。
注:
この記事のコード例では、 primary@contoso.com はメールボックスの所有者です。
事前に必要なタスク
ユーザーは、代理人としてメールボックス所有者の受信トレイ フォルダーにアクセスできるようにするために、アクセス許可を持つ代理人としてメールボックス所有者の受信トレイ フォルダーに追加される必要があります。
EWS マネージ API を使用して、代理人としてメールを作成および送信する
EWS マネージ API を使用すると、代理ユーザーのサービス オブジェクトを使用して、メールボックス所有者の代わりにメールを作成および送信することができます。 次の例は、Save メソッドを使用してメールボックス所有者の下書きフォルダーにメッセージを保存し、SendAndSaveCopy メソッドを使用してそのメールを送信してそのメッセージをメールボックス所有者の送信済みアイテム フォルダーに保存する方法を示しています。
この例は、service が代理人の有効な ExchangeService オブジェクトであり、代理人にメールボックス所有者の受信トレイ、下書き、送信済みアイテムの各フォルダーの適切なアクセス許可が付与されていることを前提にしています。
public static void DelegateAccessCreateEmail(ExchangeService service)
{
// Create an email message and provide it with connection
// configuration information by using an ExchangeService
// object named service.
EmailMessage message = new EmailMessage(service);
// Set properties on the email message.
message.Subject = "Company Soccer Team";
message.Body = "Are you interested in joining?";
message.ToRecipients.Add("sadie@contoso.com");
// Save the email to the mailbox owner's Drafts folder.
// This method call results in a CreateItem call to EWS.
// The FolderId parameter contains the context for the
// mailbox owner's Inbox folder. Any additional actions
// taken on this message will be performed in the mailbox
// owner's mailbox.
message.Save(new FolderId(WellKnownFolderName.Drafts, new Mailbox("primary@contoso.com")));
// Send the email and save the message in the mailbox owner's
// Sent Items folder.
// This method call results in a SendItem call to EWS.
message.SendAndSaveCopy(new FolderId(WellKnownFolderName.SentItems, new Mailbox("primary@contoso.com")));
Console.WriteLine("An email with the subject '" + message.Subject + "' has been sent to '"
+ message.ToRecipients[0] + "' and saved in the Sent Items folder of the mailbox owner.");
}
EWS を使用して代理人としてメールを作成して送信する
EWS を使用すると、代理ユーザーのサービス オブジェクトを使用して、メールボックス所有者の代わりにメールを作成および送信することができます。 次の例は、CreateItem 操作を使用してメールを作成し、SendItem 操作によって送信してメールボックス所有者の送信済みアイテム フォルダーに保存する方法を示しています。
またこれは、メールの作成と送信に Save メソッドを使用する際に、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=" Exchange2007_SP1" />
</soap:Header>
<soap:Body>
<m:CreateItem MessageDisposition="SaveOnly">
<m:SavedItemFolderId>
<t:DistinguishedFolderId Id="drafts">
<t:Mailbox>
<t:EmailAddress>primary@contoso.com</t:EmailAddress>
</t:Mailbox>
</t:DistinguishedFolderId>
</m:SavedItemFolderId>
<m:Items>
<t:Message>
<t:Subject>Company Soccer Team</t:Subject>
<t:Body BodyType="HTML">Are you interested in joining?</t:Body>
<t:ToRecipients>
<t:Mailbox>
<t:EmailAddress>sadie@contoso.com</t:EmailAddress>
</t:Mailbox>
</t:ToRecipients>
</t:Message>
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
サーバーは、電子メールが正常に作成および保存されたことを示す NoError の ResponseCode 要素値を含む CreateItemResponse メッセージで CreateItem 要求に応答します。 応答には、新しく作成された電子メールのアイテム ID も含まれています。
ItemId 値は読みやすいように短縮されています。
<?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="893"
MinorBuildNumber="17"
Version="V2_10"
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>
<m:CreateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:CreateItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:Message>
<t:ItemId Id="iNRaAAA="
ChangeKey="CQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiQPU" />
</t:Message>
</m:Items>
</m:CreateItemResponseMessage>
</m:ResponseMessages>
</m:CreateItemResponse>
</s:Body>
</s:Envelope>
次に、SendItem 操作を使用してメールボックス所有者の代理としてメッセージを送信し、メールボックス所有者の送信済みアイテム フォルダーに保存します。
ItemId 値は読みやすいように短縮されています。
<?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:SendItem SaveItemToFolder="true">
<m:ItemIds>
<t:ItemId Id="iNRaAAA="
ChangeKey="CQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiQPU" />
</m:ItemIds>
<m:SavedItemFolderId>
<t:DistinguishedFolderId Id="sentitems">
<t:Mailbox>
<t:EmailAddress>primary@contoso.com</t:EmailAddress>
</t:Mailbox>
</t:DistinguishedFolderId>
</m:SavedItemFolderId>
</m:SendItem>
</soap:Body>
</soap:Envelope>
サーバーは、SendItem 要求に SendItemResponse メッセージで応答します。このメッセージには、メールがメールボックス所有者の送信済みアイテム フォルダーに正常に送信および保存されたことを示す、NoError の ResponseCode 要素の値が含まれます。
<?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="893"
MinorBuildNumber="17"
Version="V2_10"
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>
<m:SendItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:SendItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
</m:SendItemResponseMessage>
</m:ResponseMessages>
</m:SendItemResponse>
</s:Body>
</s:Envelope>
EWS マネージ API を使用して、代理人としてメールを検索する
メールを検索するには、FolderId パラメーターが含まれるいずれかの ExchangeService.FindItems メソッドを使用し、メールボックス所有者の受信トレイ フォルダーを指定する必要があります。
static void DelegateAccessSearchEmailWithFilter(ExchangeService service)
{
// Limit the result set to 10 items.
ItemView view = new ItemView(10);
// Define the search filter.
SearchFilter.ContainsSubstring filter = new SearchFilter.ContainsSubstring(ItemSchema.Subject,
"soccer", ContainmentMode.Substring, ComparisonMode.IgnoreCase);
view.PropertySet = new PropertySet(ItemSchema.Subject,
ItemSchema.DateTimeReceived,
EmailMessageSchema.IsRead);
// Item searches do not support deep traversal.
view.Traversal = ItemTraversal.Shallow;
// Sorting.
view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
try
{
// Call FindItems to find matching Inbox items.
// The parameters of FindItems must denote the mailbox owner,
// mailbox, and Inbox folder.
// This call results in a FindItem call to EWS.
FindItemsResults<Item> results = service.FindItems(new
FolderId(WellKnownFolderName.Inbox, "primary@contoso.com"),
filter, view);
foreach (Item item in results.Items)
{
Console.WriteLine("Subject: {0}", item.Subject);
Console.WriteLine("Id: {0}", item.Id.ToString());
if (item is EmailMessage)
{
EmailMessage message = item as EmailMessage;
Console.WriteLine("Read: {0}", message.IsRead.ToString());
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception while enumerating results: {0}", ex.Message);
}
}
FindItems 呼び出しが ID と共に応答を返すと、ID と暗黙的アクセスを使用して対象のメールを取得、更新、削除できます。その際、メールボックス所有者の SMTP アドレスを指定する必要はありません。
EWS を使用して代理人としてメールを検索する
EWS を使用すると、代理ユーザーのサービス オブジェクトを使用して、一連の検索条件に一致するメールを検索できます。 次の例は、FindItem 操作を使用して、件名に「soccer」という語が含まれる、所有者の受信トレイ フォルダー内のメッセージを検索する方法を示しています。
また、これは、メールを検索する際に、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=" Exchange2007_SP1" />
</soap:Header>
<soap:Body>
<m:FindItem Traversal="Shallow">
<m:ItemShape>
<t:BaseShape>IdOnly</t:BaseShape>
<t:AdditionalProperties>
<t:FieldURI FieldURI="item:Subject" />
<t:FieldURI FieldURI="item:DateTimeReceived" />
<t:FieldURI FieldURI="message:IsRead" />
</t:AdditionalProperties>
</m:ItemShape>
<m:IndexedPageItemView MaxEntriesReturned="10"
Offset="0"
BasePoint="Beginning" />
<m:Restriction>
<t:Contains ContainmentMode="Substring"
ContainmentComparison="IgnoreCase">
<t:FieldURI FieldURI="item:Subject" />
<t:Constant Value="soccer" />
</t:Contains>
</m:Restriction>
<m:SortOrder>
<t:FieldOrder Order="Descending">
<t:FieldURI FieldURI="item:DateTimeReceived" />
</t:FieldOrder>
</m:SortOrder>
<m:ParentFolderIds>
<t:DistinguishedFolderId Id="inbox">
<t:Mailbox>
<t:EmailAddress>primary@contoso.com</t:EmailAddress>
</t:Mailbox>
</t:DistinguishedFolderId>
</m:ParentFolderIds>
</m:FindItem>
</soap:Body>
</soap:Envelope>
サーバーは、検索が正常に完了したことを示す NoError の ResponseCode 要素値を含む FindItemResponse メッセージで FindItem 要求に応答します。 応答には、検索条件を満たす電子メールの Message 要素が含まれています。 この場合、メールは 1 つだけ見つかります。
ItemId 要素の値は読みやすいよう短縮されています。
<?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="893"
MinorBuildNumber="17"
Version="V2_10"
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>
<m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:FindItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootFolder IndexedPagingOffset="1"
TotalItemsInView="1"
IncludesLastItemInRange="true">
<t:Items>
<t:Message>
<t:ItemId Id="iNwoAAA="
ChangeKey="CQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiQuu" />
<t:Subject>Soccer team</t:Subject>
<t:DateTimeReceived>2014-03-10T06:16:55Z</t:DateTimeReceived>
<t:IsRead>false</t:IsRead>
</t:Message>
</t:Items>
</m:RootFolder>
</m:FindItemResponseMessage>
</m:ResponseMessages>
</m:FindItemResponse>
</s:Body>
</s:Envelope>
この時点で、条件と一致するメールの ItemId がわかったので ItemId と暗黙的なアクセスを使用してメールの取得、更新、削除を行えます。その際、メールボックス所有者の SMTP アドレスを指定する必要はありません。
EWS マネージ API を使用して、代理人としてメール アイテムを取得、更新、削除する
EWS マネージ API を使用すると、代理人アクセスを使用していない場合と同じように、メール アイテムを取得、更新、削除できます。 唯一の違いは、ExchangeService オブジェクトが代理ユーザーを対象にしている点です。 Bind メソッド呼び出しに含まれるアイテム ID は、メールボックス所有者の受信トレイ フォルダー内のメールボックス ストアにあるアイテムを一意に識別します。
表 2. 代理人としてメールを操作する EWS マネージ API メソッド
タスク | EWS マネージ API メソッド | コード例 |
---|---|---|
メールを取得する |
Bind |
EWS マネージ API を使用してアイテムを取得する |
メールを更新する |
Bind の後に Update |
EWS マネージ API を使用してアイテムを更新する |
メールを削除する |
Bind の後に Delete |
EWS マネージ API を使用してアイテムを削除する |
EWS を使用して、代理人としてメール アイテムを取得、更新、削除する
EWS マネージ API を使用すると、代理人アクセスを使用していない場合と同じように、メール アイテムを取得、更新、削除できます。 唯一の違いは、サービス オブジェクトが代理ユーザーを対象にしている点です。 GetItem 要求に含まれるアイテム ID は、メールボックス所有者の受信トレイ フォルダー内のメールボックス ストアにあるアイテムを一意に識別します。
表 3. 代理人としてメールを操作するための EWS 操作
タスク | EWS 操作 | コード例 |
---|---|---|
メールを取得する |
GetItem |
EWS を使用してアイテムを取得する |
メールを更新する |
GetItem の後に UpdateItem |
EWS を使用してアイテムを更新する |
メールを削除する |
GetItem の後に DeleteItem |
EWS を使用してアイテムを削除する |