
OAuth2認証でSendMail/RcvMailメソッドを実行するには以下の手順が必要です。
| basp21p.iniパラメータ | 名前 | 説明 |
|---|---|---|
| client_id | クライアントID | Google OAuthクライアントID |
| client_secret | クライアントシークレット | Google Oauthクライアントシークレット |
| refresh_token | リフレッシュトークン | リフレッシュトークン。有効期限は無期限 注※ |
| token_uri | アクセストークン取得URL | Google Token API https://accounts.google.com/o/oauth2/token |
| server | Gmail SMTPサーバー | smtp.gmail.com:465 TLS smtp.gmail.com:587 |
| mailfrom | MailFrom | 送信元メールアドレス,Gmail(G Suite)アカウント:OAUTHBEARER|XOAUTH2 |
| popserver | Gmail POP3/IMAP4サーバー | POP3 pop.gmail.com:995 IMAP4 imap.gmail.com:993 |
| imapoption | IMAP4オプション | IMAP4 のみ。受信フォルダ(imapfolder=)や受信件数の上限など |
注※ Google ユーザーのアカウントを安全に保護するため、ユーザーのパスワードが変更されると、
特定のサービスにアクセスするために発行されたOAuth 2.0 トークンが自動的に取り消されます。
その場合、[認証コード]を取得(ブラウザ)から再度実行が必要です。
basp21p.iniファイルに設定が必要なパラメータを取得するために
Google API を呼出します。
その際にコマンドプロンプトで 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:\>インストールされてない場合は、インストールが必要です。
1. 新しいプロジェクトを作成します。
任意の名前でかまいません。

2. OAuth同意画面を[作成]。
G Suite なら [User Type]は、内部を選択できます。
Gmail無料アカウントは、外部しか選択できません。

3. アプリケーション名を入力。
任意の名前でかまいません。他の項目は、入力不要です。[保存]します。

4. OAuthクライアントIDを作成
[認証情報]-[認証情報を作成]-[OAuthクライアントID]をクリック。

[アプリケーションの種類]-[ウェブアプリケーション]を選択します。
[名前]は、任意な名前を入力します。
[承認済みのリダイレクトURI]は、http://localhost/notarealpage を入力します。

[クライアントID]と[クライアントシークレット]をコピーして保存します。

ツール(gmail-oauth2.vbs ファイル)のダウンロードは、 こちら。
リフレッシュトークン再取得が必要になったときは、
このステップから再度実行します
再取得が必要なケースは、Googleアカウントのパスワードが変更されたとき、
リフレッシュトークンを紛失した場合です。
1. ツールで認証コードを取得
gmail-oauth2.vbs ファイルをエディタで開いて、●●部分を埋め込みます。
gmail-oauth2.vbs ファイルの内容。 ''============================================== '' ログファイルセット LOGFILE="C:\●●slog.txt" '' curl トレースファイルセット CURLTRACE1="--trace-ascii C:\●●clog1.txt" CURLTRACE2="--trace-ascii C:\●●clog2.txt" 'クライアントIDをセット CID="●●" 'クライアントシークレットをセット CSS="●●" '==============================================gmail-oauth2.vbs ファイルをダブルクリックして実行します。
2.認証コード取得
ブラウザが自動起動しますので認証コードを取得します。
ブラウザでURLを叩くと同意画面が表示されます。
使用するアカウントを選択。

[許可]をクリック。

アカウントIDを選択、認証後に、
以下のエラーがブラウザで表示されます。
HTTP エラー 404.0 - Not Found
探しているリソースは削除されたか、名前が変更されたか、または一時的に使用不可能になっています。

ブラウザのURL欄の code= 部分(xxxxxxx)を 認証コードとして 変数ACCにセットします。
http://localhost/notarealpage?code=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx&scope=https://mail.google.com/
以下のようにgmail-oauth2.vbs ファイル内にセットします。
gmail-oauth2.vbs ファイルの内容。 ' フェーズ�@で取得した認証コードをセット 初期値は"" (変更前) ACC="" (変更後) ACC=".......認証コード..............." '==============================================
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:\>gmail-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=http://localhost/notarealpage" -d "grant_type=authorization_code"
-d "access_type=offline" https://accounts.google.com/o/oauth2/token
curl grant_type=authorization_code..... done.
{
"access_token": "...............",
"expires_in": 3599,
"refresh_token": "..............",
"scope": "https://mail.google.com/",
"token_type": "Bearer"
}
access_token=.................
refresh_token内容を 変数REFに設定
refresh_token=..................
done.
このjsonレスポンスで必要なものは、リフレッシュトークンのみですgmail-oauth2.vbs ファイルの内容。 ' フェーズ�Aで取得したリフレッシュトークンをセット 初期値は"" (変更前) REF="" (変更後) REF=".......リフレッシュトークン..............." '==============================================リフレッシュトークンには、有効期限はありません。
以下のような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://accounts.google.com/o/oauth2/token
curl grant_type=refresh_token..... done.
{
"access_token": ".....",
"expires_in": 3599,
"scope": "https://mail.google.com/",
"token_type": "Bearer"
}
リフレッシュトークンによるアクセストークン取得テスト完了
access_token=......
-------------- basp21p.ini -------------
[gmail]
# yyyy/mm/dd Gmail OAuth2
allow=all
client_id=.....
client_secret=......
token_uri=https://accounts.google.com/o/oauth2/token
refresh_token=.....
----------------------------------------
done.
最後に表示される basp21p.ini ファイルの設定項目をbasp21p.ini ファイルにコピペします。
basp21p.iniファイルに取得済みのパラメータを設定します。 [global] license=.... allow=all [gmail1] allow=all logfile=c:\wk\gmail1-log.txt server=smtp.gmail.com:465 ########## パスワード部分に OAUTHBEARER あるいは XOAUTH2 を指定 mailfrom=送信元<○○1@△△.com>,○○1@△△.com:OAUTHBEARER client_id=クライアントID1 client_secret=クライアントシークレット1 refresh_token=リフレッシュトークン1 token_uri=https://accounts.google.com/o/oauth2/token [gmail2] allow=all logfile=c:\wk\gmail2-log.txt server=TLS smtp.gmail.com:587 ########## パスワード部分に OAUTHBEARER あるいは XOAUTH2 を指定 mailfrom=送信元<○○2@△△.com>,○○2@△△.com:XOAUTH2 client_id=クライアントID2 client_secret=クライアントシークレット2 refresh_token=リフレッシュトークン2 token_uri=https://accounts.google.com/o/oauth2/tokenメール送信vbscriptサンプルは以下のようになります。
'' gmailsend.vbs
Set bobj = CreateObject("basp21pro")
bobj.Env="gmail1"
mailto="送信先アドレス1"
subject="件名1"
body="ハローgmail1"
files=""
rc = bobj.SendMail(mailto,subject,body,files)
Wscript.Echo "done rc1=" & rc
' Gmailアカウント切替
bobj.Env="gmail2"
mailto="送信先アドレス2"
subject="件名2"
body="ハローgmail2"
files=""
rc = bobj.SendMail(mailto,subject,body,files)
Wscript.Echo "done rc2=" & rc
SMTPプロトコルのコマンドシーケンスは、以下のようになります。
C: EHLO localhost S: 250-smtp.gmail.com at your service, [xx.xx.xx.xx] S: 250-SIZE 35882577 S: 250-8BITMIME S: 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH S: 250-ENHANCEDSTATUSCODES S: 250-PIPELINING S: 250-CHUNKING S: 250 SMTPUTF8 C: AUTH OAUTHBEARER bixhPXRi...................... または C: AUTH XOAUTH2 dXNlcj10Y...................... S: 235 2.7.0 Accepted C: MAIL FROM:[接続が続きます...]
basp21p.iniファイルに取得済みのパラメータを設定します。 [global] license=.... allow=all [gmail1] allow=all logfile=c:\wk\gmail1-log.txt popserver=pop.gmail.com:995 client_id=クライアントID1 client_secret=クライアントシークレット1 refresh_token=リフレッシュトークン1 token_uri=https://accounts.google.com/o/oauth2/tokenメール受信vbscriptサンプルは以下のようになります。
'' gmailrcv.vbs
Set bobj = CreateObject("basp21pro")
bobj.Env="gmail1"
''''' パスワードとして XOAUTH2(固定値)を指定
ar = bobj.RcvMail("xxx@xxxx.co.jp","XOAUTH2","stat")
POP3プロトコルのコマンドシーケンスは、以下のようになります。
S: +OK Gpop ready for requests from ..... C: AUTH XOAUTH2 dXNlcj10Y..................... S: +OK Welcome. C: STAT S: +OK 255 10389053 [接続が続きます...]
POP3 と IMAP4 の設定の違いは以下のとおりです。
| 項目 | POP3 | IMAP4 |
|---|---|---|
| popserver | pop.gmail.com:995 | imap.gmail.com:993 |
| client_id / client_secret / refresh_token | 取得済みの値 | 同左(共通) |
| scope | https://mail.google.com/ | 同左 |
| RcvMail のパスワード | XOAUTH2 | XOAUTH2 |
| ユーザ名の recent: 接頭辞 | 指定可(直近30日分を取得) | 指定不要(指定しても自動で取り除きます) |
注:Gmail の IMAP4 はポート 993 (SSL/TLS) のみです。ポート 143 (STARTTLS) では接続できません。
basp21p.iniファイルの設定例です。popserver を imap.gmail.com:993 にします。 [gmail-imap] allow=all logfile=c:\wk\gmail-imap-log.txt popserver=imap.gmail.com:993 client_id=クライアントID1 client_secret=クライアントシークレット1 refresh_token=リフレッシュトークン1 token_uri=https://accounts.google.com/o/oauth2/token imapoption=imapfolder=INBOX,imapmaxhits=500メール受信vbscriptサンプルは以下のようになります。
'' gmailimap.vbs
Set bobj = CreateObject("basp21pro")
bobj.Env="gmail-imap"
user = "xxx@gmail.com"
'' メール数と総バイト数
''''' パスワードとして XOAUTH2(固定値)を指定
ar = bobj.RcvMail(user,"XOAUTH2","STAT")
If isarray(ar) Then
msg= "done: メール数:" & replace(ar(0)," "," バイト数:")
Else
msg = bobj.lastmsg
End If
wscript.echo msg
'' 新着メールを受信(受信済みのファイルはスキップ)
files = bobj.RcvMail(user,"XOAUTH2","SAVENEW","c:\mail\gmail-inbox")
'' サーバ側で検索して該当メールだけ受信
'' 10/1 以降の未読で、件名に「請求書」を含むメール
files = bobj.RcvMail(user,"XOAUTH2", _
"SAVESEARCH UNSEEN SINCE 2026/10/01 SUBJECT ""請求書""","c:\mail\seikyu")
If isarray(files) Then
For Each f In files
arr = bobj.ReadMail(f,"subject:from:date:")
Next
End If
'' 未読メール数のみ
ar = bobj.RcvMail(user,"XOAUTH2","COUNT UNSEEN")
wscript.echo "未読 " & ar(0) & " 件"
'' フォルダ一覧
ar = bobj.RcvMail(user,"XOAUTH2","FOLDERS")
IMAP4プロトコルのコマンドシーケンスは、以下のようになります(STAT の例)。
S: * OK Gimap ready for requests from ..... C: B0001 AUTHENTICATE XOAUTH2 dXNlcj10Y..................... S: B0001 OK xxx@gmail.com authenticated (Success) C: B0002 CAPABILITY S: B0002 OK Success C: B0003 EXAMINE "INBOX" S: B0003 OK [READ-ONLY] INBOX selected. (Success) C: B0004 FETCH 1:* (UID INTERNALDATE RFC822.SIZE) S: B0004 OK Success C: B0005 LOGOUT S: B0005 OK 73 good day (Success)IMAP4 で使える RcvMail コマンド
| コマンド | 説明 | 戻り値の配列 |
|---|---|---|
| STAT | メール数と総バイト数 | "件数 総バイト数" |
| LIST [n[-n2]] | Subject、From、Date ヘッダー | POP3 と同じ形式の後ろにタブ区切りで "UID: UIDVALIDITY-UID" |
| SAVE / SAVD n[-n2] | 受信(SAVD は受信後に削除) | ファイル名 |
| SAVEALL / SAVEALLD | 全メールを受信(D は受信後に削除) | ファイル名 |
| SAVENEW / SAVENEWD | 受信済みファイルがないメールを受信(D は受信後に削除) | ファイル名 |
| DELE n[-n2] | 削除 | 削除件数 |
| DELU ファイル名,... | 受信したファイル名のメールをサーバから削除 | 削除件数 |
| SEARCH 検索条件 | サーバ側で検索 | LIST と同じ形式 |
| COUNT 検索条件 | サーバ側で検索して件数のみ返す | 件数 |
| SAVESEARCH / SAVESEARCHD 検索条件 | サーバ側で検索して受信(D は受信後に削除) | ファイル名 |
| FOLDERS | フォルダ一覧 | フォルダ名 |
受信したメールファイル名は次の形式です。 受信日時_imap_UIDVALIDITY-UID 例:20261016091530_imap_14-4521 UID はフォルダごとの番号です。フォルダごとに保存ディレクトリ(dirname)を分けてください。 参照のみのコマンドでは、フォルダを読み取り専用で開くため、受信しても既読になりません。 メールファイルの形式は POP3 と同じです。ReadMailメソッドとSortMailメソッドがそのまま使えます。 Gmail のフォルダ(ラベル) Gmail では、ラベルが IMAP4 のフォルダになります。主なフォルダ名は以下のとおりです。 INBOX 受信トレイ [Gmail]/すべてのメール アーカイブ済みを含むすべてのメール [Gmail]/送信済みメール 送信済み [Gmail]/迷惑メール 迷惑メール [Gmail]/ゴミ箱 ゴミ箱 ラベル名 ユーザが作成したラベル(例:"請求書"、"取引先/A社") 日本語のフォルダ名もそのまま指定できます。 例:imapoption=imapfolder=[Gmail]/すべてのメール フォルダ名は Gmail の表示言語によって異なります。FOLDERS コマンドで確認してください。 [Gmail]/すべてのメール は件数が多いため、SINCE などで対象を絞り込んで使ってください。 Gmail は日本語(UTF-8)のサーバ側検索に対応しています。 日本語を含む SUBJECT/FROM/TO/BODY/TEXT などの条件も、サーバ側で高速に検索します。 例:SAVESEARCH SINCE 2026/10/01 SUBJECT "請求書" Gmail での削除 Gmail では、INBOX から削除(DELE、DELU、SAVD、SAVESEARCHD など)したメールは、 Gmail の設定により、アーカイブ([Gmail]/すべてのメール に残る)またはゴミ箱へ移動されます。 Gmail の [設定]-[メール転送と POP/IMAP]-[IMAP アクセス] で動作を確認してください。受信フォルダや受信件数の上限などは、imapoptionパラメータで指定します。 詳細は、imapoptionパラメータと RcvMailメソッドを参照してください。