GASを利用してメールのバウンス(送信失敗)を検知する方法
はじめに
メール送信に際し、送信先のアドレスが間違っている場合や、何らかの理由でメールが相手に届かなかった場合、それは「バウンス(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');
使用例と注意点
- メール送信
- 待機
- 送信失敗メールチェック
上記の流れが基本なのですが、メール送信(バウンスメールの送信)までにラグがあるため念の為10秒の待機を入れています。
GmailApp.sendEmail(email, subject, message);
Utilities.sleep(10000); // 10秒待つ(メール送信待ち)
checkBouncedEmails(email);
終わりに
このコードは、特定の送信元(mailer-daemon@googlemail.com)からのバウンスメールを検索し、該当メールの本文に特定のフレーズが含まれているかをチェックしています。もしバウンスメールが検知された場合、その詳細な情報をログに記録する場合などにご活用ください。
この方法を活用することで、メールの送信失敗を自動的に検知し、迅速に対処することができます。
以上が、GASを利用してメールのバウンスを検知する方法のご紹介でした。是非、お試しください。
Discussion