メールが届かない!?SMTPを使わないGASによるメール送信 | ジコログ

メールが届かない!?SMTPを使わないGASによるメール送信

メールが届かない!?SMTPを使わないGASによるメール送信 セキュリティ

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送信済みに該当メールがあることを確認できます。

タイトルとURLをコピーしました