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

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

SendMail/RcvMailメソッドでOffice365 OAuth2認証でアクセスする方法を説明します。

OAuth2認証でSendMail/RcvMailメソッドを実行するには以下の手順が必要です。

Azure AD によって提供されるOAuth認証サービスを使用して、 BASP21 Pro がSMTP/POPプロトコルを使用してメールを送受信することができます。

basp21p.iniパラメータは、以下のように設定が必要です。
basp21p.iniパラメータ名前説明
client_idクライアントIDクライアントID
client_secretクライアントシークレットクライアントシークレット
refresh_tokenリフレッシュトークンリフレッシュトークン
token_uriアクセストークン取得URLOAuth 2.0 トークン エンドポイント (v2)
https://login.microsoftonline.com/(テナントID)/oauth2/v2.0/token
serveroffice365 SMTPサーバーSmtp.office365.com
TLS Smtp.office365.com:587
mailfromMailFrom送信元メールアドレス,office365アカウント:XOAUTH2
popserveroffice365 POPサーバーOutlook.office365.com:995



basp21p.iniファイルに設定が必要なパラメータを取得するために 承認エンドポイント/トークンエンドポイントを呼出します。
その際にコマンドプロンプトで curl コマンドを使います。
curl コマンドは、Windows 10に標準インストールされています。
コマンドプロンプトで curl -V で確認できます。

C:\>curl -V
curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL
Release-Date: [unreleased]
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL

C:\>
インストールされてない場合は、インストールが必要です。
参考: curlのインストール

注:BASP21 Pro の実行には、curl コマンドは使いません。
curlは、Azure ADからOAUth2パラメータ取得に必要です。


参考: OAuth を使用して IMAP、POP、または SMTP 接続を認証する

重要: Azure AD が発行するトークンの有効期間について
更新トークンの有効期限は90日です。
更新トークンの有効期限が切れると以下のようなエラーでメソッドが失敗します。
-86	OAUTH2認証エラー。

(ログ)
2020/11/02 16:20:07.216 3948-6294376 office365(32bit WOW64) RcvMail HTTP > POST /a7a81c19-a273.....
2020/11/02 16:20:07.528 3948-6294376 office365(32bit WOW64) RcvMail HTTP < HTTP/1.1 400 Bad Request
2020/11/02 16:20:07.528 3948-6294376 office365(32bit WOW64) RcvMail ERROR:-52 [SYSTEM]server error HTTP/1.1 400 Bad Request
2020/11/02 16:20:07.528 3948-6294376 office365(32bit WOW64) RcvMail end -86  (842msec)

トークンサーバーのアクセスでHTTP 400エラーとなります。


参考: Microsoft ID プラットフォームでの構成可能なトークンの有効期間 (プレビュー)

office365 OAuth2認証は、バージョン 1,0,2007,17以降でサポートされます。

■ Azure ADアプリケーションを登録[クライアントID]と[クライアントシークレット]取得(ブラウザ)

[クライアントID]と[クライアントシークレット]は、ブラウザを使って取得します。
Azure Portalにログインして、アプリケーション登録します。

1. アプリケーションの登録。
任意の名前でかまいません。

リダイレクトURL。http://localhost/myapp/。



2. クライアントIDとテナントIDをコピー。




3. クライアントシークレット作成&コピー
任意の説明。任意の有効期限。追加をクリック。
ここで1年や2年を指定すると期限後に BASP21 Pro メールによるSMTP/POP3 アクセスが失敗します。
その場合、新規にクライアントシークレット作成して、 承認エンドポイントから[認証コード]を取得する必要があります。




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



4. APIのアクセス許可の追加
[APIのアクセス許可]-[アクセス許可の追加]をクリック。




[Microsoft Grapf]-[委任されたアクセス許可]をクリック。




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





■ 承認エンドポイントから[認証コード]を取得(ブラウザ)

[認証コード]は、ツールとブラウザを使って取得します。
この処理は、再取得が必要になったとき、実行が必要です。

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

使用するscope は、以下の通りです。
POP ..... https://outlook.office.com/POP.AccessAsUser.All
SMTP .... https://outlook.office.com/SMTP.Send

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


office365-oauth2.vbs ファイルの内容。
''==============================================
'' ログファイルセット
LOGFILE="C:\●●slog.txt"
'' curl トレースファイルセット
CURLTRACE1="--trace-ascii C:\●●clog1.txt"
CURLTRACE2="--trace-ascii C:\●●clog2.txt"

'クライアントIDをセット
CID="●●"
'クライアントシークレットをセット
CSS="●●"
'テナントIDをセット
TID="●●"
'==============================================

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


2.認証コード取得
ブラウザが自動起動しますので認証コードを取得します。

ブラウザでURLを叩くと同意画面が表示されます。
使用するアカウントを選択。
このとき、BASP21 Pro で使うメールアドレスで認証してください。

ツールで再度、認証コード取得からやり直す場合は、 以下のように2つの変数をクリアしてください。

office365-oauth2.vbs ファイルの内容。
'' 変数クリア
ACC=""
REF=""




[承諾]をクリック。




ブラウザのURL部分で表示される認証コードをコピーして、 office365-oauth2.vbs ファイル内にセットします。
?code=xxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxの部分です。

office365-oauth2.vbs ファイルの内容。

' フェーズ@で取得した認証コードをセット 初期値は""
(変更前)
ACC=""

(変更後)
ACC=".......認証コード..............."
'==============================================


■ トークンエンドポイントから[トークン]と[リフレッシュトークン]を取得(curl)

ツールでcurl コマンドを実行して、トークンエンドポイントにアクセスしてリフレッシュトークンを取得します。
このステップ実行の前に、 curlコマンドが実行可能かどうかチェックします。
コマンドプロンプトで curl -V で確認できます。
C:\>curl -V
curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL
Release-Date: [unreleased]
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL

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

前のステップで取得した認証コードの寿命が数分と短いので このステップで失敗する場合は、新しい認証コードを再取得してトライしてください。

以下のようなjsonレスポンスがログファイル(LOGFILE変数にセットしたファイル)に表示されればOK。

2020/nn/nn 13:00:30:Aリフレッシュトークン取得フェーズ
curl --trace-ascii C:\WK\clog1.txt -d "code=......" -d "client_id=......." -d "client_secret=....."
 -d "redirect_uri=...." -d "grant_type=authorization_code"
 -d "access_type=offline......" https://login.microsoftonline.com/..../oauth2/v2.0/token

curl grant_type=authorization_code..... done.

{
{
  "token_type":"Bearer",
  "scope":"https://outlook.office365.com/POP.AccessAsUser.All https://outlook.office365.com/SMTP.Send",
  "expires_in":3599,
  "access_token": "...............",
  "refresh_token": "..............",
}
access_token=.................
refresh_token内容を 変数REFに設定
refresh_token=..................

done.
このjsonレスポンスで必要なものは、リフレッシュトークンのみです
リフレッシュトークンをoffice365-oauth2.vbs ファイルにセットします。
office365-oauth2.vbs ファイルの内容。

' フェーズAで取得したリフレッシュトークンをセット 初期値は""
(変更前)
REF=""

(変更後)
REF=".......リフレッシュトークン..............."
'==============================================

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


ツールで curl コマンドを実行して、アクセストークンを取得テストします。
oofice365-oauth2.vbs ファイルをダブルクリックして実行します。

以下のようなjsonレスポンスがログファイルに表示されればOK。

2020/nn/nn 13:01:02:Bリフレッシュトークンによるアクセストークン取得テスト
curl --trace-ascii C:\WK\clog2.txt -d "client_id=....." -d "client_secret=....."
 -d "grant_type=refresh_token" -d "refresh_token=....." 
https://login.microsoftonline.com/.../oauth2/v2.0/token

curl grant_type=refresh_token..... done.

{
  "token_type": "Bearer",
  "scope": "https://outlook.office365.com/POP.AccessAsUser.All https://outlook.office365.com/SMTP.Send",
  "access_token": ".....",
  "expires_in": 3599
}

リフレッシュトークンによるアクセストークン取得テスト完了
access_token=......

-------------- basp21p.ini -------------
[office365]
# 2020/../.. Office365 OAuth2
allow=all
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
refresh_token=.....
----------------------------------------
done.
最後に表示される basp21p.ini ファイルの設定項目をbasp21p.ini ファイルにコピペします。

■ 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
refresh_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
refresh_token=リフレッシュトークン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")
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
   [接続が続きます...]


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

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