Exchange Online 開発
注意 (重要) : クラウドの Exchange Online に対するデータアクセスには、今後 Microsoft Graph を使用してください。(2022/09/30 以降、Exchange Online 上で新規の EWS アプリの作成はできません。また、2026 年 01 月以降、Exchange Online の EWS の呼び出しはブロックされます。)
こんにちは。
今回は、SOAP の Exchange Web Services (EWS) における OAuth Token 認証の手順を紹介します。
「Office 365 API 入門」にも記載しましたが、今後、Exchange Online (Office 365) の開発で API を使用する際は、可能な限り、Basic Auth ではなく、ここで紹介する OAuth を使った Token Auth を使用してください。(二要素認証、AD 連携、デバイス認証など、さまざまなメカニズムとの組み合わせが考えられるためです。)
EWS の SOAP API は、「Office 365 API 入門」で紹介した Exchange の REST API と異なり、今風でないアクセス スタイルかもしれませんが、高度な処理を実装する際に、今でも、この SOAP API が必要になることがあります。
このため、実アプリを開発する上で、今後もおぼえておいて損はないでしょう。
では、手順を記載します。(というほど、実は、大げさな話ではありません。。。)
まず、「Office 365 API 入門」で解説した手順で、Azure Active Directory に Application を登録し、必要な Permission を設定し、ブラウザー (Browser Component など) を使って Access token を取得します。(手順は「Office 365 API 入門」を参照してください。)
この際、今回は、EWS.AccessAsUser.All を設定します。SOAP API を使用するので (CRUD 処理ではないので)、下図の通り、Full Access の Permission を設定しておいてください。(GA 版で変更されました。)
ブラウザー (Browser Component など) で Access token を取得する際、下図のような Office 365 (Azure AD) の SignIn 画面 (下図) が表示されるので、ここに ID / パスワードを入力してログインします。
もちろん、MSAL (Microsoft Authentication Library) や Office 365 API の Library などを使って Access token を取得しても構いません。
補足 : Azure AD v2 endpoint を使用する場合には、scope として
https://outlook.office.com/EWS.AccessAsUser.All
を設定します。
あとは、下記の通り、取得した Access Token を Authorization Header に設定して SOAP の処理 (EWS) を呼び出せば OK です。
下記では、SOAP を使用してメールの送信をおこなっています。
POST https://outlook.office365.com/EWS/Exchange.asmxContent-Type: text/xml; charset=utf-8Accept: text/xmlAuthorization: Bearer eyJ0eXAiOiJKV...<?xml version="1.0" encoding="utf-8"?><soap:Envelope . . . > <soap:Header> <t:RequestServerVersion Version="Exchange2007_SP1" /> <t:TimeZoneContext> <t:TimeZoneDefinition Id="Tokyo Standard Time" /> </t:TimeZoneContext> </soap:Header> <soap:Body> <m:CreateItem MessageDisposition="SendAndSaveCopy"> <m:SavedItemFolderId> <t:DistinguishedFolderId Id="sentitems" /> </m:SavedItemFolderId> <m:Items> <t:Message> <t:Subject>test mail</t:Subject> <t:Body BodyType="Text">Are you busy ?</t:Body> <t:ToRecipients> <t:Mailbox> <t:EmailAddress>tsmatsuz@microsoft.com</t:EmailAddress> </t:Mailbox> </t:ToRecipients> </t:Message> </m:Items> </m:CreateItem> </soap:Body></soap:Envelope>
補足 : SOAP なので、.NET (C#, Visual Basic) の開発者は、WCF を使って処理しても構いません。ただし、WCF で Header を処理する際は、OperationContext などを使った特別な処理が必要です。
なお、EWS Managed API (.NET の API) を使用する場合は、以下の通り、Microsoft.Exchange.WebServices.Data.OAuthCredentials を使用します。
. . .using Microsoft.Exchange.WebServices.Data;. . .static void Main(string[] args){ string emailAddress = @"tsmatsuz@o365demo01.onmicrosoft.com"; ExchangeVersion ver = new ExchangeVersion(); ver = ExchangeVersion.Exchange2007_SP1; ExchangeService sv = new ExchangeService(ver); sv.TraceEnabled = true; // for debugging sv.Credentials = new OAuthCredentials("eyJ0eXAiOiJKV..."); sv.Url = new Uri(@"https://outlook.office365.com/EWS/Exchange.asmx"); EmailMessage msg = new EmailMessage(sv); msg.Subject = "test mail"; msg.Body = new MessageBody(BodyType.Text, "Are you busy ?"); msg.ToRecipients.Add("tsmatsuz@microsoft.com"); msg.SendAndSaveCopy(); Console.WriteLine("送信完了"); Console.ReadLine();}. . .
Exchange Web Services (EWS) および Managed API では、この他に、Office Add-ins (Office アドイン) の Mail Add-ins の Token の妥当性検証など、Office Add-ins と連携した認証・認可なども可能です。
さまざまな最新テクノロジに対応していますので、今でも高度な処理が必要になった際には現役で使用して頂けます !
Categories: Uncategorized
3 replies»