2024年2月にGmailのポリシー変更が行われます。
本当にこのポリシーが適用されると、かなりの数のメールが届かなくなるでしょう。
個人的には、これだけでもプログラムからのメール送信にリスクを感じています。
セキュリティなんて、今後さらに厳しくなる一方です。
サイト・サービス運営者は、そのための対応をその都度取ることになります。
SMTPを用いたメール送信のリスク
今後に予想されるのは、TLS 1.3への強制対応でしょうか。
現在、TLS 1.2が広く普及しています。
でも、TLS 1.2はそこそこ古い技術です。
数年後には、TLS 1.3への対応が求められることになるのでしょう。
もしくは、TLS 1.2で致命的なセキュリティホールが見つかった場合ですね。
この場合、世の中は一気にTLS 1.3への移行を急ぐでしょう。
そうなると、TLS 1.2までしか対応できていないとメール送信をできなくなります。
古いOSなどでは、TLSのアップデートもそうそう簡単にはできません。
その結果、SMTPを用いたメール送信ができなくなります。
もう、メール送信には本当にウンザリです。
そうかと言って、メールがなくなることはないでしょうから・・・
GASによるメール送信
GASについては、次の記事で説明しています。
GASを用いた方法だと、ウンザリすることから解放されるかもしれません。
この方法なら、24時間で500通以内を無料でメール送信できます。
個人や小規模サービスなら、これで十分だとは思います。
課金すれば、送信できる件数を増やすことは可能です。
その方法ですが、以下の二つのクラスを用いる方法があります。
- GmailApp
- MailApp
両方ともの前提条件として、Gmailのアカウントが作成済みとなります。
GmailAppクラスによるメール送信
function sendEmail() { var subject = "メールの件名"; var body = "メールの本文"; var recipient = "recipient@example.com"; GmailApp.sendEmail(recipient, subject, body); }
MailAppクラスによるメール送信
function sendEmail() { var subject = "メールの件名"; var body = "メールの本文"; var recipient = "recipient@example.com"; MailApp.sendEmail(recipient, subject, body); }
MailAppとGmailAppは似ています。
GmailAppの方が、メール送信時に小細工ができます。
その小細工により、送信元メールアドレスとエイリアスを変更できるのです。
MailAppは、小細工ができません。
そのため、Gmailのメールアドレスとアカウント名がそのまま表示されます。
GASによるメール送信の動作検証
動作検証としては、実際の利用に沿って行います。
あくまで、GASはSMTPの代わりです。
プログラムからSMTPにアクセスしていた箇所をGASへのアクセスに変えます。
そのため、GASをAPI化する必要があります。
GASをAPI化するには、大きく分けて2つの方法があります。
- ウェブアプリ
- 実行可能 API
実行可能 APIは、GCPでプロジェクトを作成する必要があります。
GCPでプロジェクトについては、以下の記事内で説明しています。
簡単に言うと、手間が多くなり面倒ということです。
それに対して、ウェブアプリは簡単にできます。
その代わりセキュリティ面で劣ると言われています。
しかし、独自で認証を行えばそこはカバー可能です。
ということで、今回はウェブアプリでGASをデプロイします。
そうすると、次のように長いURLを取得できます。
このURL対して、プログラムからアクセスすることになります。
なお、GASのコードは以下のようにしています。
function doPost(e) { // リクエストからデータを取得 var key = e.parameter.key; // 認証キー var recipient = e.parameter.recipient; // 受信者のメールアドレス var subject = e.parameter.subject; // メールの件名 var body = e.parameter.body; // メールの本文 if (key=="一意の文字列") { // メールを送信 MailApp.sendEmail(recipient, subject, body); // 応答を返す return ContentService.createTextOutput("メール送信成功"); } else { // 応答を返す return ContentService.createTextOutput("認証失敗"); } }
あとは、取得したURLに向けてHTTPアクセスを行うだけです。
TLS 1.2とかTLS 1.3とか関係ありません。
Pythonでは、以下のコードでアクセス可能です。
import requests def send_email(key, recipient, subject, body): url = 'https://script.google.com/macros/s/●●●/exec' data = { 'key': key, 'recipient': recipient, 'subject': subject, 'body': body } response = requests.post(url, data=data) print(response.text) # 使用 key = "一意の文字列" email = "example@example.com" subject = "タイトル" body = "メール本文" send_email(key, email, subject, body)
「一意の文字列」は、GAS上の内容を同じモノにします。
これでセキュリティ的には、かなりレベルアップです。
そもそも、URL自体が第三者からは予測できませんけどね。
あと、Gmailアドレスに送信した場合、次のようなメールヘッダーの内容になります。
MailAppだと、2024年2月以降も問題ありません。
そりゃ、Gmailから送信しているのと同じことなので当然ですかね。
なお、「●●●@gmail.com」のGmail送信済みに該当メールがあることを確認できます。