次の方法で共有


OAuth を使用して IMAP、POP、SMTP 接続を認証する

OAuth 認証を使用して IMAP、POP、または SMTP プロトコルに接続し、Office 365 ユーザーの電子メール データにアクセスする方法について説明します。

以下に示すように、IMAP、POP、SMTP プロトコルの OAuth2 サポートは、Microsoft 365 (Office on the webを含む) と Outlook.com ユーザーの両方で使用できます。

OAuth 2.0 プロトコルに慣れていない場合は、Microsoft ID プラットフォームの概要に関する記事の「OAuth 2.0 プロトコル」を参照してください。 OAuth 2.0 プロトコルを実装してユーザーを認証し、セキュリティで保護された API にアクセスする Microsoft 認証ライブラリ (MSAL) の詳細については、「 MSAL の概要」を参照してください。

Microsoft Entra (Microsoft Entra) によって提供される OAuth 認証サービスを使用して、アプリケーションが IMAP、POP、または SMTP プロトコルに接続して、Office 365のExchange Onlineにアクセスできるようにします。 アプリケーションで OAuth を使用するには、次の操作を行う必要があります:

  1. アプリケーションをMicrosoft Entraに登録します
  2. トークン サーバーからアクセス トークンを取得します。
  3. アクセス トークンを使用して接続リクエストを認証します。

アプリケーションを登録する

OAuth を使用するには、アプリケーションを Microsoft Entra に登録する必要があります。

Microsoft ID プラットフォームにアプリケーションを登録する」に記載されている手順に従って、新しいアプリケーションを作成します。

アクセス トークンを取得する

MSAL クライアント ライブラリのいずれかを使用して、クライアント アプリケーションからアクセス トークンを取得できます。

または、次のリストから適切なフローを選択し、対応する手順に従って基になる ID プラットフォーム REST API を呼び出して、アクセス トークンを取得できます。

  1. OAuth2 認証コード フロー
  2. OAuth2 デバイス認可付与フロー

アプリケーションを承認し、アクセス トークンを要求するときは、Outlook リソース URL を含む完全なスコープを指定してください。

プロトコル アクセス許可のスコープの文字列
IMAP https://outlook.office.com/IMAP.AccessAsUser.All
POP https://outlook.office.com/POP.AccessAsUser.All
SMTP AUTH https://outlook.office.com/SMTP.Send

さらに、offline_access のスコープをリクエストすることもできます。 ユーザーが offline_access スコープを承認すると、アプリは Microsoft ID プラットフォーム トークン エンドポイントから更新トークンを取得できます。 更新トークンは長時間使用されます。 以前のアクセス トークンの有効期限が切れると、アプリは新しいアクセス トークンを取得できます。

または、 OAuth2 クライアント資格情報付与フロー を使用して、OAuth2 承認コード フローまたは OAuth2 デバイス承認付与フローではなく、アクセス トークンをフェッチすることもできます。

接続リクエストの認証

Office 365 向けの IMAP および POP メール設定を使用して、Office 365 メール サーバーへの接続を開始します。

SASL XOAUTH2

OAuth 統合では、アプリケーションで SASL XOAUTH2 形式を使用してアクセス トークンをエンコードおよび送信する必要があります。 SASL XOAUTH2は、ユーザー名とアクセス トークンを次の形式で一緒にエンコードします。

base64("user=" + userName + "^Aauth=Bearer " + accessToken + "^A^A")

^AControl + A (%x01) を表します。

たとえば、アクセス トークン test@contoso.onmicrosoft.com を使用して EwBAAl3BAAUFFpUAo7J3Ve0bjLBWZWCclRC3EoAA にアクセスする SASL XOAUTH2 形式は次のようになります。

base64("user=test@contoso.onmicrosoft.com^Aauth=Bearer EwBAAl3BAAUFFpUAo7J3Ve0bjLBWZWCclRC3EoAA^A^A")

base64 エンコードの後、この形式は次の文字列に変換されます。 改行は読みやすくするために挿入されます。

dXNlcj10ZXN0QGNvbnRvc28ub25taWNyb3NvZnQuY29tAWF1dGg9QmVhcmVy
IEV3QkFBbDNCQUFVRkZwVUFvN0ozVmUwYmpMQldaV0NjbFJDM0VvQUEBAQ==

Office 365 内の共有メールボックスの SASL XOAUTH2 認証

OAuth を使用して共有メールボックスにアクセスする場合、アプリケーションはユーザーの代わりにアクセス トークンを取得する必要がありますが、SASL の userName フィールドXOAUTH2エンコードされた文字列を共有メールボックスのメール アドレスに置き換える必要があります。

IMAP プロトコル Exchange

IMAP サーバー接続を認証するには、クライアントは次の形式の AUTHENTICATE コマンドで応答する必要があります:

AUTHENTICATE XOAUTH2 <base64 string in XOAUTH2 format>

認証が成功するクライアントとサーバーのメッセージ交換の例:

[connection begins]
C: C01 CAPABILITY
S: * CAPABILITY … AUTH=XOAUTH2
S: C01 OK Completed
C: A01 AUTHENTICATE XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0Q2cBAQ==
S: A01 OK AUTHENTICATE completed.

認証エラーが発生するクライアントとサーバーのメッセージ交換の例:

[connection begins]
S: * CAPABILITY … AUTH=XOAUTH2
S: C01 OK Completed
C: A01 AUTHENTICATE XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0Q2cBAQ==
S: A01 NO AUTHENTICATE failed.

POP プロトコル Exchange

POP サーバー接続を認証するには、クライアントは次の形式の AUTH コマンドで応答する必要があります。

AUTH XOAUTH2 
<base64 string in XOAUTH2 format> 

認証が成功するクライアントとサーバーのメッセージ交換の例:

[connection begins] 
C: AUTH XOAUTH2  
S: + 
C: dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYX 
JlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0 
Q2cBAQ== 
S: +OK User successfully authenticated. 
[connection continues...] 

認証エラーが発生するクライアントとサーバーのメッセージ交換の例:

[connection begins] 
C: AUTH XOAUTH2  
S: + 
C: dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlY 
XJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMj 
l0Q2cBAQ= 
S: -ERR Authentication failure: unknown user name or bad password. 

SMTP プロトコル Exchange

SMTP サーバー接続を認証するには、クライアントは次の形式の AUTH コマンドで応答する必要があります:

AUTH XOAUTH2 <base64 string in XOAUTH2 format>

認証が成功するクライアントとサーバーのメッセージ交換の例:

[connection begins]
C: auth xoauth2
S: 334
C: dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlY
XJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMj
l0Q2cBAQ==
S: 235 2.7.0 Authentication successful
[connection continues...]

認証エラーが発生するクライアントとサーバーのメッセージ交換の例:

[connection begins]
C: auth xoauth2
S: 334
C: dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlY
XJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMj
l0Q2cBAQ==
S: 535 5.7.3 Authentication unsuccessful [SN2PR00CA0018.namprd00.prod.outlook.com]

クライアント資格情報付与フローを使用して SMTP、IMAP、および POP 接続を認証する

Exchange のサービス プリンシパルは、アプリケーションが SMTP、POP、および IMAP プロトコルを使用してクライアント資格情報フローを介して Exchange メールボックスにアクセスできるようにするために使用されます。

POP、IMAP、または SMTP のアクセス許可を Entra AD アプリケーションに追加する

  1. Azure portalで、Microsoft Entra アプリケーションの管理ビューで [API アクセス許可] ブレードを選択します。

  2. [アクセス許可の追加] を選択します。

  3. [組織で使用する API] タブを選択し、「Office 365 Exchange Online」を検索します。

  4. [アプリケーションのアクセス許可] をクリックします。

  5. POP アクセスの場合は、POP.AccessAsApp アクセス許可 を選択します。 IMAP アクセスの場合は、IMAP.AccessAsApp アクセス許可 を選択します。 SMTP アクセスの場合は、SMTP を選択 します。SendAsApp アクセス許可。

    pop-imap-permission

  6. アクセス許可の種類を選択したら、[アクセス許可の 追加] を選択します。

これで、SMTP、POP、または IMAP アプリケーションのアクセス許可が Entra AD アプリケーションのアクセス許可に追加されます。

POP または IMAP 経由で Exchange メールボックスにアクセスするには、Entra AD アプリケーションがテナントごとにテナント管理者の同意を得る必要があります。 詳細については、「 テナント管理者の同意プロセス」を参照してください。

ISV/パートナーが [任意の組織のディレクトリ内のアカウント] オプションを使用してMicrosoft Entra アプリケーションを登録した場合は、承認要求 URL を利用して、次の手順に従ってこのアプリケーションを追加し、同意する必要があります。

POP と IMAP のガイダンス

OAuth 2.0 テナント承認要求では、POP アプリケーション スコープと IMAP アプリケーション スコープの両方について、scope クエリ パラメーターを https://ps.outlook.com/.default にする必要があります。 OAuth 2.0 承認要求 URL を次の例に示します。

https://login.microsoftonline.com/{tenant}/v2.0/adminconsent?client_id=<CLIENT_ID>&redirect_uri=<REDIRECT_URI>&scope=https://ps.outlook.com/.default
SMTP ガイダンス

OAuth 2.0 テナント承認要求では、 scope クエリ パラメーターは SMTP に対してのみ https://outlook.office365.com/.default する必要があります。 OAuth 2.0 承認要求 URL を次の例に示します。

https://login.microsoftonline.com/{tenant}/v2.0/adminconsent?client_id=<CLIENT_ID>&redirect_uri=<REDIRECT_URI>&scope=https://outlook.office365.com/.default 

"この組織のディレクトリ内のアカウントのみ" を使用してアプリケーションを独自のテナントに登録した場合は、Microsoft Entra 管理センター内のアプリケーション構成ページを使用して管理者の同意を付与できます。承認要求 URL アプローチを使用する必要はありません。

granting-consent-for-tenant

Exchange でサービス プリンシパルを登録する

テナント管理者がMicrosoft Entra アプリケーションに同意したら、PowerShell を介して Exchange に Entra AD アプリケーションのサービス プリンシパルExchange Online登録する必要があります。 この登録は、 New-ServicePrincipal コマンドレットによって有効になります。

New-ServicePrincipal コマンドレットを使用するには、ExchangeOnlineManagement をインストールし、次のスニペットに示すようにテナントに接続します。

Install-Module -Name ExchangeOnlineManagement -allowprerelease
Import-module ExchangeOnlineManagement 
Connect-ExchangeOnline -Organization <tenantId>

これらの手順を実行した後も New-ServicePrincipal コマンドレットの実行中にエラーが発生する場合は、操作を実行するための十分なアクセス許可が Exchange Online でユーザーにないためである可能性があります。

Exchange でのMicrosoft Entra アプリケーションのサービス プリンシパルの登録を次の例に示します。

New-ServicePrincipal -AppId <APPLICATION_ID> -ObjectId <OBJECT_ID> [-Organization <ORGANIZATION_ID>]

テナント管理者は、上記で参照されているサービス プリンシパル識別子を、テナント上の Entra AD アプリケーションのエンタープライズ アプリケーション インスタンスで見つけることができます。 テナントのエンタープライズ アプリケーション インスタンスの一覧は、Azure Portal の [Microsoft Entra] ビューの [エンタープライズ アプリケーション] ブレードにあります。

登録されたサービス プリンシパルの識別子は、Get-ServicePrincipal コマンドレットを使用して取得できます。

Get-ServicePrincipal | fl

OBJECT_IDは、アプリケーション登録の Enterprise Application ノード (Azure Portal) の [概要] ページのオブジェクト ID です。 [アプリの登録] ノードの [概要] ページのオブジェクト ID ではありません 。 正しくないオブジェクト ID を使用すると、認証エラーが発生します。

テナント管理者は、アプリケーションからアクセスを許可される特定のメールボックスをテナントに追加できるようになりました。 この構成は、 Add-MailboxPermission コマンドレットを使用して行われます。

次の例は、アプリケーションのサービス プリンシパルに 1 つのメールボックスへのアクセス権を付与する方法を示しています。

Add-MailboxPermission -Identity "john.smith@contoso.com" -User 
<SERVICE_PRINCIPAL_ID> -AccessRights FullAccess

Exchange サービス プリンシパルの作成時にはさまざまな ID が使用され、後でメールボックスのアクセス許可を付与するときにも使用されます。 次の例は、さまざまなステージで正しい ID を使用するのに役立つ場合があります。 この例では、Microsoft Entraコマンドレットを使用するため、まだインストールしていない場合は、Microsoft Entra PowerShell モジュールをインストールする必要があります。 詳細については、「PowerShell for Graph Microsoft Entraインストールする」を参照してください。

$AADServicePrincipalDetails = Get-AzureADServicePrincipal -SearchString YourAppName

New-ServicePrincipal -AppId $AADServicePrincipalDetails.AppId -ObjectId $AADServicePrincipalDetails.ObjectId -DisplayName "EXO Serviceprincipal for EntraAD App $($AADServicePrincipalDetails.Displayname)"

$EXOServicePrincipal = Get-ServicePrincipal -Identity "EXO Serviceprincipal for EntraAD App YourAppName"

Add-MailboxPermission -Identity "john.smith@contoso.com" -User $EXOServicePrincipal.Identity -AccessRights FullAccess

Microsoft Entra アプリケーションは、OAuth 2.0 クライアント資格情報付与フローを使用して、SMTP、POP、または IMAP プロトコルを使用して許可されたメールボックスにアクセスできるようになりました。 詳細については、 Microsoft ID プラットフォームのアクセス許可と同意に関するページの手順を参照してください。

アクセス トークン要求の本文ペイロードの scope プロパティで https://outlook.office365.com/.default を使用する必要があります。

生成されたアクセス トークンは、前に説明したように、SASL XOAUTH2形式で SMTP、POP、IMAP 接続を認証するためのトークンとして使用できます。

注:

SendAs でクライアント資格情報付与フローを使用する場合は、送信者に SendAs アクセス許可を付与する必要があります: Add-RecipientPermission (ExchangePowerShell)

関連項目