📬

GASを利用してメールのバウンス(送信失敗)を検知する方法

2023/06/13に公開

はじめに

メール送信に際し、送信先のアドレスが間違っている場合や、何らかの理由でメールが相手に届かなかった場合、それは「バウンス(bounce)」と呼ばれます。この記事では、Google Apps Script (GAS) を利用して、バウンスしたメールを自動的に検知する方法後ご紹介します。

下記の関数では送信失敗を検知できないため、GmailApp.searchを使用してメールボックスから検索する方法で実装しました。

GmailApp.sendEmail(email, subject, message);

バウンスメールのチェック処理

以下のコードはGASを使用したバウンスメールのチェック処理です。

// 不明なメールアドレスをチェック
function checkBouncedEmails(email) {
  // GmailAppを使って、バウンスしたメールを含むスレッドを取得
  var threads = GmailApp.search('from:(mailer-daemon@googlemail.com)');

  if (!threads.length) return ;
  
  // 各スレッドをループします(最新で1件にしてますが、自由に変更してOKです)
  // 全件の場合は threads.length を使用する
  for (var i = 0; i < 1; i++) {
    // スレッド内のメッセージを取得
    var messages = threads[i].getMessages();
    
    // 各メッセージをループします
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];

      // メールの本文を取得します
      var body = message.getPlainBody();

      // メールの日付を取得し、JST(日本時間)に変換
      var date = message.getDate();
      date = new Date(date.getTime() + (9 * 60 * 60 * 1000));

      // 現在の日付と時間を取得し、JSTに変換
      var now = new Date();
      now = new Date(now.getTime() + (9 * 60 * 60 * 1000));

      // 5分以内のメールをチェック
      if (now.getTime() - date.getTime() <= 5 * 60 * 1000) {
        // メールの本文に特定のフレーズと送信したメールアドレスが含まれているかをチェック
        if ((body.includes('アドレス不明') && body.includes('配信されませんでした')) || body.includes('メールはブロックされました。') && body.includes(email)) {
          // メールの本文を改行で分割し、最初の7行を取得
          var lines = body.split('\n');
          var firstLines = lines.slice(0, 7).join('\n');
          // ここで行いたい処理を記述
        }
      }
    }
  }
}

解説

バウンスメールのチェック処理では、指定した送信元アドレス(mailer-daemon@googlemail.com)からのバウンスメールを検索し、メールの本文に特定のフレーズが含まれているかをチェックしています。具体的には、「アドレス不明」と「配信されませんでした」のフレーズが含まれているか、または「メールはブロックされました。」のフレーズが含まれているかを確認します。さらに、送信したメールアドレスも一致するかどうかをチェックしています。

条件について

また、自分用に入れた条件なので、こちらは自由に書き換えてOKです。
コードですと下記の部分を変更すればOKです。

(body.includes('アドレス不明') && body.includes('配信されませんでした')) || body.includes('メールはブロックされました。')

bodyについて

上から7行にしている理由はちょうどテキストが下記のようになるので、7にしていますが、bodyが取得したい場合はこの処理は不要です。

** アドレス不明 **

アドレスが見つからなかったか、メールを受信できないアドレスであるため、メールは test-test@test.jp に配信されませんでした。
  var lines = body.split('\n');
  var firstFiveLines = lines.slice(0, 7).join('\n');

使用例と注意点

  1. メール送信
  2. 待機
  3. 送信失敗メールチェック

上記の流れが基本なのですが、メール送信(バウンスメールの送信)までにラグがあるため念の為10秒の待機を入れています。

   GmailApp.sendEmail(email, subject, message);
   Utilities.sleep(10000); // 10秒待つ(メール送信待ち)
   checkBouncedEmails(email);

終わりに

このコードは、特定の送信元(mailer-daemon@googlemail.com)からのバウンスメールを検索し、該当メールの本文に特定のフレーズが含まれているかをチェックしています。もしバウンスメールが検知された場合、その詳細な情報をログに記録する場合などにご活用ください。

この方法を活用することで、メールの送信失敗を自動的に検知し、迅速に対処することができます。

以上が、GASを利用してメールのバウンスを検知する方法のご紹介でした。是非、お試しください。

Discussion