はじまり
いつもの仕事で、本当に無駄だなぁと思う仕事の1つにセミナーのアンケートを手書きで書いてもらう作業があるんです。
その紙のアンケートを回収して、メアドを打ち込んで「今日はありがとうございました」ってメール送ってるんですよ。
で、だいたいの人が字が汚いとか数字の0
かアルファベットのo
か分からないとかで、Mail Delivery Subsystem
からメール来ちゃうんです。
いつもこの失敗したメールを見つけたら、その人のメアドから電話番号を引っ張ってきて、電話してメアド聞くという超無駄な作業してます。
こういう無駄な仕事するたびに、「こんなの絶対人間のやる仕事じゃないよな」と思いならが惰性で人生を過ごしてきちゃってました。
で、最近Google Apps Scriptという神ツールを見つけて、これめっちゃ勉強して、まずはMail Delivery Subsystem
からメールきたメアドを取得するスクリプト書いてみました。
最終型
もちろん取得するだけだと意味ないので、最終型として以下のようなものを作ろうと思ってます。
- 失敗してたメアドをスプレッドシートに書いてく (自動で書かれてれば、マスターのシートとvlookup組んでおけば電話番号もスグ分かる)
- 毎日xx時間おきにこのスクリプトを実行 (トリガー設定)
- ただし、すでに取得したメアドはスルーする
- UI上からポチってしたら、初回の実行出来て、トリガー設定できる
今日のゴール
gasを使って、Mail Delivery Subsystem
から来た送信失敗したメアドと日時を取得する。
頑張るぞい。
まずはスクリプトを作ってく
自分のGoogleドライブから、まずは「Googleスプレッドシート」を新しく作ります。
スクリプトエディタを開く
「ツール」>「スクリプトエディタ」でスクリプトを開きます。
とりあえずコードをガリガリ書いてく
↓ 今回の完成形です。
// Mail Delivery Subsystem から来たメールを検索
var searchString = "from:'Mail Delivery Subsystem'";
function mainFunction() {
var myThreads = GmailApp.search(searchString, 0, 1); // まずは直近の1件を取得
// メールが見つからなければ終わる
if (myThreads.length === 0) {
Logger.log("送信に失敗したメールはありませんでした");
return 0;
}
for (var n in myThreads) {
var thread = myThreads[n];
var msgs = thread.getMessages();
var failedMailAddress = "";
var date = "";
for(m in msgs) {
var msg = msgs[m];
var tmpAddress = getFailedMailAddress(msg.getBody());
// 複数スレッドになると、うまく取れない場合があるので、取得可能な場合のみ
if (tmpAddress !== '') {
failedMailAddress = tmpAddress;
}
date = msg.getDate();
}
Logger.log(date);
Logger.log(failedMailAddress);
}
}
/**
* 送信が失敗したメールアドレスを返す
*/
function getFailedMailAddress(body)
{
var reg = /<b>.*?<\/b>/;
if (body.match(reg) === null) return '';
return body.match(reg)[0].replace('<b>', '').replace('<\/b>', '');
}
丁寧に解説していきます
1. 検索するメール条件を指定
このvar
というよく見る文字はvar
のあとに書いた文字列(変数名)になにか数値や文字を入れる箱の宣言だと思ってください。
今回はvar searchString = "from:'Mail Delivery Subsystem'";
とすることで、今後、searchString
と書いて呼び出すと、自動的にコードが実行されるときにはfrom:'Mail Delivery Subsystem'
という文字列が使われるようになります。
もうお決まりごとなので覚えておきましょう!
また、今回はここで、from:'Mail Delivery Subsystem'
と書いてるのは、Gmailの検索と一緒で、ここから来たメールを探すよーということを宣言しておきました。
2. 送信に失敗してたメールを探す
var myThreads
はさっきと一緒ですので気にしなくてOKです。
ここで、GmailApp
という新しい文字が出てきました。
これはGoogleAppsScriptが用意してるクラスというもので、Gmailのメールを取得したり、メールを送信したりできるという便利アイテムです。
詳しくは、[公式のドキュメント](https://developers.google.com/apps-script/reference/gmail/gmail-![error]()
app)に書いてあります。
このクラスというのは、.
のあとになにか書くと、そのクラスが持ってる関数を呼び出せます。
今回のGmailApp.search
は、Gmailを検索するよ。という関数です。
関数には、引数
というものがあって、そこら辺は関数の呼び出し方に書いてあります。
第一引数に検索条件を書いて、第二、第三引数にどこから何件取得するかを書きます。 (今回は1件だけ)
次の行に書いてあるif (myThreads.length === 0)
ってのは、もし検索条件に引っかかるものが1件もなかったら。
という意味になります。
3. メール送信に失敗してた日付とメアドを取得してみる
いよいよ本題です。
検索結果が見つかると、myThreads
にはデータが入ってきます。
これをfor
という構文を使って中に入ってるデータ分だけ回して処理します。
ほかはすべてこれまでのvar
を使ってるだけなので特に変わったことはしてません。
途中で、メールの文章から送信に失敗したメアドを取得するために、getFailedMailAddress
という関数を呼んでますが、これは自分で作ったオリジナルの関数です。
基本的に、今すべてmainFunction
の中に処理を書いていってますが、1つの関数の中に処理がたくさん書かれると、この関数の役割が何なのか分からなくなってくるので、処理ごとに関数に切り出すのがGoodです。
ちなみに、getFailedMailAddress
はこんな感じです。
関数の中で、正規表現という技術を使って、メールの中から<b>
タグに囲まれた部分を返してます。
正規表現はこのサイトを参考にさせてもらいました。
実際に動かしてみよう
「実行」>「関数を実行」>「mainFunction」をクリックすると、勝手に実行されます。
ただ、最初の実行時にはこんな感じで、承認を求められますので、手順に沿って承認していきましょう。
まずは承認します。
自分のアカウントを選択します。
詳細をクリック
ページへ移動をクリック
自分のGmailへGoogleAppsScriptsがアクセスすることを許可
実行結果を見てみよう
「表示」>「ログ」か、macならCommand+Enterでログの画面が開きます。
取得出来てますね!!!
次回の野望
次は完成形を目指して以下を実装します。
- 失敗してたメアドをスプレッドシートに書いてく (自動で書かれてれば、マスターのシートとvlookup組んでおけば電話番号もスグ分かる)
- 毎日xx時間おきにこのスクリプトを実行 (トリガー設定)
- ただし、すでに取得したメアドはスルーする
- UI上からポチってしたら、初回の実行出来て、トリガー設定できる