[ホーム] [会社概要] [製品] [サポート]
[BASP21 Pro] [FAQ] [アプリケーションガイド] [ユーザガイド] [リファレンス] [サンプル]
[FTP オブジェクト] [ソケット オブジェクト]

BASP21 Pro Office365 SMTP/POP3 OAuth2認証 (SendMail/RcvMail)

SendMail/RcvMailメソッドでOffice365 OAuth2認証でアクセスする方法を説明します。
認可フローのタイプは、クライアント資格情報付与フロー(クライアントクレデンシャルフロー)方式です。
Entraアプリケーションによって提供されるOAuth認証サービスを使用して、 BASP21 Pro がSMTP/POPプロトコルを使用してメールを送受信することができます。

参考: OAuth を使用して IMAP、POP、または SMTP 接続を認証する(マイクロソフト社)

Oauth2認証名称について、この文書では、マイクロソフト社の名称を用います。
Oauth2認証フロー名称認可コードフロークライアントクレデンシャルフロー
マイクロソフト社実装名称認証コードフロークライアント資格情報付与フロー
BASP21 Pro OAuth2認証リンクbasp21poauth2-365.html本ページ

本ページで説明するEntraアプリケーションおよびBASP21 Pro設定は、クライアント資格情報付与フローです。
BASP21 Proアプリケーションコードの変更は不要です。

注意:クライアント資格情報付与フロー方式は、BASP21 Proバージョン1,0,2501,4以降でサポートされます

認証コードフローとクライアント資格情報付与フローの違いを説明します。
項目認証コードフロークライアント資格情報付与フロー
アクセス許可の種類
参考: アクセス許可の種類(マイクロソフト社)
委任されたアクセス許可。
ユーザがアクセスできるメールボックスのみアクセス可能。
ユーザの同意画面でサインインが必要
管理者の同意が必要。
サービスプリンシパルでメールボックスのアクセス許可付与必要
アクセス許可APIの種類Microsoft Graph(3)
Smtp.Send,offline_access,POP.AccessAsUserAll
Office 365 Excange Online(2)
POP.AccessAsApp,SMTP.SendAsApp
アクセス対象メールアドレス設定方法リフレッシュトークン取得時の同意画面でサインインしたメールアドレス 管理者によるEntraアプリケーションのサービス プリンシパル登録
Add-MailboxPermissionコマンド、Add-RecipientPermissionコマンドで アクセス対象メールボックスへのアクセス許可
アクセストークン取得方法リフレッシュトークン使用 クライアントID、クライアントシークレット使用
リフレッシュトークンの更新90日毎に取得更新が必要。basp21p.iniに設定 不要
クライアントシークレット削除、有効期限切れ対応basp21p.iniに新クライアントシークレット設定必要 basp21p.iniに新クライアントシークレット設定必要
アクセス対象メールアドレス追加方法リフレッシュトークン取得時の同意画面で対象メールアドレスでサインオン
リフレッシュトークン取得して、basp21p.iniに新たなエントリ追加が必要。
サービスプリンシパルにメールアドレス許可追加
Add-MailboxPermissionコマンド、Add-RecipientPermissionコマンド
basp21p.iniは、リフレッシュトークンなしのため変更不要
メリット対象メールアドレス追加は、ユーザに委任のため、管理者許可が不要。
リフレッシュトークン取得時にメールアカウントでサインイン
basp21p.iniは、リフレッシュトークンなしのため変更不要
デメリット90日毎にリフレッシュトークン取得処理&basp21p.iniファイル設定が必要 対象メールアドレス追加時に管理者のメールアクセス許可操作が必要

クライアント資格情報付与フローでSendMail/RcvMailメソッドを実行するには以下の手順が必要です。


basp21p.iniパラメータは、以下のように設定が必要です。
basp21p.iniパラメータ名前説明
client_idクライアントIDクライアントID
client_secretクライアントシークレットクライアントシークレット
token_uriアクセストークン取得URLOAuth 2.0 トークン エンドポイント (v2)
https://login.microsoftonline.com/(テナントID)/oauth2/v2.0/token
serveroffice365 SMTPサーバーTLS Smtp.office365.com:587
popserveroffice365 POPサーバーOutlook.office365.com:995
oauth2_opttoken=nocacheオプション。アクセストークンをキャッシュせずに、毎回取得する

以下のように、Envエントリを分けて、旧方式と新方式の使い分けが可能です。

bobj.Env="office365-NEW"

bobj.Env="office365-OLD"

-------------- basp21p.ini -------------
[office365-NEW]
server=TLS Smtp.office365.com:587
popserver=Outlook.office365.com:995
client_id=xxxxx
client_secret=xxxx
token_uri=https://login.microsoftonline.com/xxxxx/oauth2/v2.0/token

[office365-OLD]
server=TLS Smtp.office365.com:587
popserver=Outlook.office365.com:995
client_id=xxxxx
client_secret=xxxx
token_uri=https://login.microsoftonline.com/xxxxx/oauth2/v2.0/token
refresh_token=xxxxx
----------------------------------------


■ Entraアプリケーションの登録[クライアントID],[オブジェクトID],[クライアントシークレット],[テナントID](ブラウザ)

[クライアントID]と[クライアントシークレット]は、ブラウザを使って取得します。
Microsoft Entra 管理センター(https://entra.microsoft.com/#home)にログインして、アプリケーション登録します。

1. アプリケーションの登録
任意の名前でかまいません。
リダイレクトURLも任意な存在しないURLで構いません。http://localhost/myapp/。




2. クライアントIDとテナントID、オブジェクトID、テナントIDをコピー




3. クライアントシークレット作成&コピー
[証明書またはシークレットの追加]をクリック。




[新しいクライアントシークレット]をクリック。







シークレットをコピーします。




4. APIのアクセス許可の追加
[APIのアクセス許可]-[アクセス許可の追加]をクリック。
Microsoft Graph User.Read は、デフォルトで追加されるようです。 この項目は、そのままで構いません。




[所属する組織で使用しているAPI]-[Office 365 Excange Online]をクリック。




以下の2つを選択して追加します。



APIアクセス許可の要求項目の選択方法は、[アクセス許可を選択する]テキストボックスに、
POP でエンターキー、
  POP.AccessAsApp
を選択。

次にSMTP を入力して
  SMTP.SendAsApp
を選択します。



次に組織に管理者の同意を与えます。







状態の文字がグリーンになっているか確認します。



■ アプリケーションのサービス プリンシパル登録(PowerShell)

Entraアプリケーションのサービス プリンシパル登録は、PowerShell管理者モードを使って実行します。
ブラウザでサインインを求められたら、 Entra管理者でサインインする必要があります。
参考: Exchange Online PowerShell に接続する
PowerShellコマンド内で、以下のIDやメールアドレスを使います。

・テナントID
・EntraアプリケーションID(クライアントID)
・EntraアプリケーションオブジェクトID  ....エンタープライズアプリケーションの概要画面からコピペしてください。
・BASP21 Proで使うメールアドレス

(1)PowerShellを管理者で起動

(2)モジュールをインストール (初回のみ)
PS > Install-Module -Name ExchangeOnlineManagement

続行するには NuGet プロバイダーが必要です
PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet
プロバイダーが必要です。NuGet プロバイダーは 'C:\Program Files\PackageManagement\ProviderAssemblies' または
'C:\Users\CSJW10-08\AppData\Local\PackageManagement\ProviderAssemblies'
に配置する必要があります。'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet
プロバイダーをインストールすることもできます。今すぐ PowerShellGet で NuGet
プロバイダーをインストールしてインポートしますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y

信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit
ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
PS >

(3)モジュールをロード  (初回のみ)
PS > Import-module ExchangeOnlineManagement

(4)テナントに接続  テナントIDを指定

PS > Connect-ExchangeOnline -Organization テナントID

ブラウザが開くので管理者でログインしてください。

----------------------------------------------------------------------------------------
This V3 EXO PowerShell module contains new REST API backed Exchange Online cmdlets which doesn't require WinRM for Client-Server communication. You can now run these cmdlets after turning off WinRM Basic Auth in your client machine thus making it more secure.

Unlike the EXO* prefixed cmdlets, the cmdlets in this module support full functional parity with the RPS (V1) cmdlets.

V3 cmdlets in the downloaded module are resilient to transient failures, handling retries and throttling errors inherently.

REST backed EOP and SCC cmdlets are also available in the V3 module. Similar to EXO, the cmdlets can be run without WinRM basic auth enabled.

For more information check https://aka.ms/exov3-module
----------------------------------------------------------------------------------------


(5)Entra アプリケーションのサービス プリンシパルの登録
EntraアプリのアプリケーションIDとオブジェクトIDを指定。

PS > New-ServicePrincipal -AppId アプリケーションID -ObjectId アプリケーションオブジェクトID


注意:ここで以下のエラーが発生することがあります。
エラー: AADServicePrincipalNotFound。クライアント アプリケーション ID 'xxxxxxxxxxx' のオブジェクト ID 'xxxxxx'の ServicePrincipal は、
このテナントに登録されていません。
このエラーの回避策ですが、 オブジェクトIDが誤っていますので、 Entraアプリケーションの管理画面から、 エンタープライズアプリケーションの概要画面からコピペしてください。
以下のように[アプリ登録]-[概要]からコピペすると違うオブジェクトIDとなります。
(6)アプリケーションのサービス プリンシパルに 1 つのメールボックスへのアクセス権を付与。 PS > Add-MailboxPermission -Identity メールアドレス -User アプリケーションオブジェクトID -AccessRights FullAccess (7)アプリケーションのサービス プリンシパルに SendAs (メールボックス所有者として送信する) 権限の付与。 PS > Add-RecipientPermission -Identity メールアドレス -Trustee アプリケーションオブジェクトID -AccessRights SendAs (8)テナント切断 PS > Disconnect-ExchangeOnline

■ トークンエンドポイントからアクセストークン取得テスト(VBScript+curl)

VBScriptスクリプトを実行して、アクセストークンテストを実行します。

ツール(office365-oauth2-2025.vbs ファイル)のダウンロードは、 こちら。

使用するscope は、以下の通りです。
POP・SMTP共通 ..... https://outlook.office365.com/.default

1. ツールで認証コードを取得
office365-oauth2-2025.vbs ファイルをエディタで開いて、●●部分を埋め込みます。


office365-oauth2-2025.vbs ファイルの内容。
''==============================================
DATEX = Replace(Date(),"/","")
ENTRAAPP="●●" '.... Entra アプリケーション名 コメントとして使うので任意な名前で構いません
CID="●●"  '... クライアントID
CSS="●●"  '... クライアントシークレット
TID="●●"  '... テナントID
'' ログファイル
LOGFILE="C:\●●\#EAP#-vbslog#DATE#.txt"
LOGFILE=Replace(LOGFILE,"#EAP#",ENTRAAPP)
LOGFILE=Replace(LOGFILE,"#DATE#",DATEX)
'  
'' curl トレースファイル
CURLTRACE="--trace-ascii C:\●●\#EAP#-curllog#DATE#.txt"
CURLTRACE=Replace(CURLTRACE,"#EAP#",ENTRAAPP)
CURLTRACE=Replace(CURLTRACE,"#DATE#",DATEX)
'==============================================

office365-oauth2-2025.vbs ファイルをダブルクリックして実行します。


以下のようにアクセストークンとbasp21p.ini設定項目がログファイル(LOGFILE)に書込みがあればOK。

-------------- basp21p.ini -------------
access_token=.................

[office365-20250104]
# 2025/01/04 Office365 OAuth2 BTEST-06
allow=all
sslver=12
server=TLS Smtp.office365.com:587
popserver=Outlook.office365.com:995
client_id=xxxxx
client_secret=xxxx
token_uri=https://login.microsoftonline.com/xxxxx/oauth2/v2.0/token
----------------------------------------
この basp21p.iniの設定項目をbasp21p.ini ファイルにコピペします。
従来の方式の basp21p.ini 設定のリフレッシュトークン項目(refresh_token=)は、もう必要ありません。

refresh_token=項目があると、リフレッシュトークンを使ってアクセストークンを取得する従来の処理が実行されます。
これは、互換性維持のためで、バージョン1,0,2501,4以降でもリフレッシュトークンを使った旧方式をサポートします。

■ SendMailサンプル(VBScript)

アクセストークン取得テストが完了したら準備完了です。
これでSendMailメソッドの実行準備ができました。
basp21p.ini ファイルとoffice365送信メールスクリプトのサンプル。
logfileパラメータでログファイルを指定して実行結果を確認できます。

basp21p.iniファイルに取得済みのパラメータを設定します。
[global]
license=....
allow=all
[office365]
allow=all
mailfrom=account,account:XOAUTH2
logfile=c:\wk\office365-log.txt
server=TLS Smtp.office365.com:587
popserver=Outlook.office365.com:995
client_id=....
client_secret=....
token_uri=https://login.microsoftonline.com/..../oauth2/v2.0/token
メール送信vbscriptサンプルは以下のようになります。
'' office365mailsend.vbs
Set bobj = CreateObject("basp21pro")
bobj.Env="office365"
mailto="送信先アドレス"
subject="件名1"
body="ハローoffice"
files=""
rc = bobj.SendMail(mailto,subject,body,files)
Wscript.Echo "done rc1=" & rc
SMTPプロトコルのコマンドシーケンスは、以下のようになります。
C: AUTH XOAUTH2
S: 334
C: dXNlcj10Y......................
S: 235 2.7.0 Authentication successful
C: MAIL FROM: 
   [接続が続きます...]


■ RcvMailサンプル(VBScript)

basp21p.ini ファイルとoffice365受信メールスクリプトのサンプル。
logfileパラメータでログファイルを指定して実行結果を確認できます。

basp21p.iniファイルに取得済みのパラメータを設定します。
[global]
license=....
allow=all
[office365]
allow=all
logfile=c:\wk\office365-log.txt
popserver=outlook.office365.com:995
client_id=クライアントID1
client_secret=クライアントシークレット1
token_uri=https://login.microsoftonline.com/..../oauth2/v2.0/token
メール受信vbscriptサンプルは以下のようになります。
'' office365rcv.vbs
Set bobj = CreateObject("basp21pro")
bobj.Env="office365"
''''' パスワードとして XOAUTH2(固定値)を指定
ar = bobj.RcvMail("xxx@xxxx.co.jp","XOAUTH2","stat")
If isarray(ar) Then
  msg= "done: メール数:" & replace(ar(0)," ","   バイト数:")
Else
  msg = bobj.lastmsg
End If
wscript.echo msg
POP3プロトコルのコマンドシーケンスは、以下のようになります。
S: +OK The Microsoft Exchange POP3 service is ready.
C: AUTH XOAUTH2
S: +
C: dXNlcj10Y.....................
S: +OK User successfully authenticated.
C: STAT
S: +OK 255 10389053
   [接続が続きます...]


■ Test-MsPopConnectionを使ったPop接続テスト(PowerShell)

Entraアプリケーションの構成が正しいかどうか以下のコマンドレットでチェックできます。


(1)PowerShellを管理者権限で起動

(2)Mail.Protocolsをインストール (初回のみ)
PS > Install-Module Mail.Protocols

信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。
このリポジトリを信頼する場合は、Set-PSRepository コマンドレットを実行して、リポジトリの InstallationPolicy
 の値を変更してください。'PSGallery' からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y

(3)Test-MsPopConnection実行
PS > Test-MsPopConnection
Please input log file path. If empty, it applies the default path of the app. Typically under \logs of current directory.: ログファイルフルパス
Please input the Azure Cloud Instance of interest. (1. AzurePublic, 2. AzureChina, 3. AzureUsGovernment.): 1
Please input the mailbox to connect.: メールアドレス
Please input the authentication type. (1. OAuth, 2. Basic Auth **has deprecated in most tenants**.): 1
Do you want to access the mailbox as user delegation (login window will prompt for authentication)
        or as app (a secret will be needed for authenticaiton)? (1. User delegation, 2. App.): 2
Please input your tenant Id. Input empty string if your app is registered as a multiple-tenant app.: テナントID
Please input your client Id (aka application id).: クライアントID
Please input the secret of the registered app.: クライアントシークレット
  C Connecting to server 'outlook.office365.com' on port 995.
  S +OK The Microsoft Exchange POP3 service is ready. [VABZA...]
  C AUTH XOAUTH2
  S +
  C xxxxxxxxxxxxxxxxxxxxxx
  S +OK User successfully authenticated.
  C LIST
  S +OK 480 62669336
  S 1 35884
  S 2 119995

エラーの場合は、以下のようになります。
  S -ERR Authentication failure: unknown user name or bad password.
It is not a valid AccessToken. A valid AccessToken must have either a roles or scp claim.
  C Connection is closed.
警告: Something is wrong. Please review the log 指定したログファイルフルパス
PS >

認証コードフロー方式は、Test-MsPopConnectionは、失敗するようです。


エラーの場合、チェック項目は、以下のとおりです。

(1)アプリケーションID、やクライアントID、オブジェクトIDの確認

(2)サービス プリンシパル登録の確認
・ExchangeOnlineに接続
PS > Connect-ExchangeOnline -Organization <テナントID>

・Entra アプリケーションのサービス プリンシパル登録の確認
PS > Get-ServicePrincipal | fl

・アプリケーションのサービス プリンシパルのメールボックスへのアクセス権確認
PS > Get-MailboxPermission -Identity メールアドレス | FL
PS > Get-RecipientPermission -Identity メールアドレス | FL

(3)EntraアプリケーションAPI許可に管理者の同意があるか確認



[ホーム] [会社概要] [製品] [サポート]
[BASP21 Pro] [FAQ] [アプリケーションガイド] [ユーザガイド] [リファレンス] [サンプル]
[FTP オブジェクト] [ソケット オブジェクト]

Copyright © 2001-2025 B21Soft, Inc. All Rights Reserved.