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 の概要」を参照してください。

Azure Active Directory が提供する OAuth 認証サービスを使用して、アプリケーションが Office 365 で Exchange Online にアクセスするために、IMAP、POP、または SMTP プロトコルに接続できるようにします。 OAuth をアプリケーションで使用するには、次の手順を実行する必要があります。

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

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

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

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

登録が完了したら、API を呼び出すアクセス許可を委任されたユーザーに付与するには、次の変更を行います。

  1. Microsoft Graph APIアクセス許可を割り当てます。
    1. 新しいアプリケーションの登録については、 API のアクセス許可 に移動します。
    2. [アクセス許可を追加] を選択します。
    3. Microsoft Graph を選択します。
    4. [委任されたアクセス許可] を選択します。
    5. 使用するプロトコルに応じて、IMAP を検索 します。AccessAsUser.AllSMTP。送信、または POP。AccessAsUser.All を選択します。
    6. 変更を保存するには、[ アクセス許可の追加] を選択します。
    7. 必要に応じて、組織にアクセス許可を付与するには、[ 管理者の同意の付与] を選択します。
  2. Exchange Onlineのユーザー サインインを有効にします。
    1. Azure AD で、 エンタープライズ アプリケーション に移動します。
    2. Office 365 Exchange Onlineを検索します。 フィルターを [すべてのアプリケーション] に変更する必要がある場合があります。
    3. アプリケーションOffice 365 Exchange Online 選択し、このアプリの [プロパティ] で、[ユーザーのサインインを有効にする] 設定が [はい] に設定されていることを確認します。

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

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

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

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

OAuth2 クライアント資格情報付与フローを介した IMAP、POP、SMTP AUTH プロトコルへの OAuth アクセスはサポートされていません。 アプリケーションで Microsoft 365 組織内のすべてのメールボックスへの永続的なアクセスが必要な場合は、Microsoft Graph API を使用してユーザーなしでのアクセスを許可し、詳細なアクセス許可を有効にして、管理者に対して特定のメールボックス セットへのアクセスをスコープに設定することをお勧めします。

アプリケーションを承認し、アクセス トークンをリクエストする場合は、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 プラットフォーム トークン エンドポイントから更新トークンを取得できます。 更新トークンは長時間使用されます。 以前のアクセス トークンの有効期限が切れると、アプリは新しいアクセス トークンを取得できます。

接続リクエストの認証

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 XOAUTH2 エンコード文字列の userName フィールドを、共有メールボックスのメール アドレスに置き換える必要があります。

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]

関連項目