OAuth 2.0認証を用いたGmail経由でメール送信を行う方法の紹介になります。
Gmailのメールアドレスと利用するのに時間制限があるアクセストークンを用いて、Gmail経由でメール送信を行う方法になります。
SMTP-AUTHのXOAUTH2認証を利用するので、Perlで標準ライブラリを用いてメールを送る場合、少し低レベルなAPIを用いてコマンドを作成します。
プログラム自体はそれほど複雑なものではありませんが、事前の設定が多く複雑なものになります。アクセストークンの取得などを自動化しようとすると、その分だけプログラムは複雑なものになっていくでしょう。
ここでは利用できるアクセストークンを既に取得した状態でメール送信を行うプログラムを紹介します。メール送信の方法として参考にしていただけると嬉しいです。
セキュアなメール送信ですが、実際に利用する場合はセキュリティの必要性と設定の複雑さの手間等も検討しても良いかもしれません。
アクセストークンを取得するまでの準備
アクセストークンを取得するまでプロセスをかなり大雑把に紹介します。
1.Google Cloud Platform(GCP)でプロジェクトの作成やOAuthクライアントIDの作成等を行なって、OAuthクライアントIDやOAuthシークレットキーを取得します。jsonファイルでダウンロードができます。このファイルはシークレットキーがあるので、他のユーザーに見えないようにし、github等で公開しないようしてください。
2.OAuthクライアントIDを用いて認可コードを取得するURIを生成してWebブラウザでアクセスします。スコープはIMAP、POP、SMTPアクセスのために"https://mail.google.com/"を指定します。
3.URIを用いてWebブラウザでアクセスしたら、アクセス権の承認を行います。警告のページが出た場合は、自分のプロジェクトであることを確認し、「詳細」から承認のページへのリンクを表示できます。
4.アクセス権を承認し、リダイレクトが行なわれたら、リダイレクトされたURIのcodeパラメータから認可コードを取得します。
5.認可コードとクライアントID・シークレットキーを用いて、アクセストークンとリフレッシュトークンを取得ができます。GCPでのOAuth同意画面の設定でユーザーの種類が「外部」で公開ステータスが「テスト」の場合は7日でリフレッシュトークンが失効されます。
5-2.アクセストークンを再発行する場合、リフレッシュトークンとクライアントID・シークレットキーを用いて、アクセストークンを再発行できます。
OAuth2.0認証でGmail経由したメール送信を行うPerlプログラム
OAuth2.0認証(XOAUTH2認証方式)でGmail経由でメール送信を行うPerlプログラムは以下のようになります。
oauthmail.pl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#!/usr/bin/perl -w use Net::SMTP; use Net::Cmd; use MIME::Base64; $access_token = 'access_token'; # base64("user=" {User} "^Aauth=Bearer " {Access Token} "^A^A") $authstr = sprintf("user=%s\001auth=Bearer %s\001\001", $user, $access_token); $smtp = Net::SMTP->new('smtp.gmail.com', Port => 587, Timeout => 30, Debug => 1, ); $smtp->starttls(); if($smtp->command('AUTH XOAUTH2 ' . encode_base64($authstr, ''))->response() != CMD_OK){ print "Authorized Error: ","\n"; print $smtp->message, "\n"; $smtp->command("\r\n")->response(); die $smtp->message; } $smtp->mail($sender); $smtp->to($receiver); $smtp->data(); while(<>){ $smtp->datasend($_); } $smtp->dataend(); $smtp->quit; |
このプログラムは標準入力からヘッダー行を含むメールの内容を受け取り、Gmailを経由してメール送信を行うことができます。
このプログラムのパラメータとして、$user, $access_token, $sender, $receiverの4つのパラメータが必要になります。
それぞれのパラメータは
$user: googleアカウント(末尾が@gmail.comになるでしょう)
$access_token: アクセストークン
$sender: 送信者
$receiver: 宛先
になります。
プログラムを簡単にするためにアクセストークンを埋め込んでいます。アクセストークンを読み取り、有効期限がない場合、リフレッシュトークンからアクセストークンを更新し、更新したアクセストークンを読み取る機能を追加するとより実用的になります。
補足として、$smtp->command()はNet::SMTPの継承元のNet::Cmdのメソッドになります。XOAUTH2認証は標準ライブラリでサポートされていないため、そのためのコマンドを自力で作ります。
コマンドを自力で作成するためにbase64エンコードをする必要がありますが、encode_base64関数は2引数で利用する必要があります。これは長すぎる文字列が自動的に改行されるため、2引数目に空文字列を指定して改行されないようにするためです。
このプログラムはNet::SMTP->newでDebug機能がONになっているので、必要がなければ、Debugを0にしてDebug機能をOFFにしてください。
メールのテスト
簡単なメールのテストとしてSenderとReceiverを自分自身に設定して試してみるとよいでしょう。
プログラムは標準入力からメールのヘッダー行と本文を入力することで利用できます。
content.txt
1 2 3 |
Subject: test message mail test |
コマンド例
1 |
perl oauthmail.pl < content.txt |
でメールを送信できます。また、別の方法として、sedコマンドでヘッダー行を追加して
1 |
echo "mail test" | sed "1i Subject: test message\n" | perl oauthmail.pl |
のようにしてメールを送信できます。
最後に、Gmailでメールが届いたかどうかを確認にしたらメールのテストは完了で良いでしょう。