3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GmailでMail Delivery Subsystemから来たメアドをgasで取得する【初心者向け】

Posted at

はじまり

いつもの仕事で、本当に無駄だなぁと思う仕事の1つにセミナーのアンケートを手書きで書いてもらう作業があるんです。
その紙のアンケートを回収して、メアドを打ち込んで「今日はありがとうございました」ってメール送ってるんですよ。

で、だいたいの人が字が汚いとか数字の0かアルファベットのoか分からないとかで、Mail Delivery Subsystemからメール来ちゃうんです。

いつもこの失敗したメールを見つけたら、その人のメアドから電話番号を引っ張ってきて、電話してメアド聞くという超無駄な作業してます。
こういう無駄な仕事するたびに、「こんなの絶対人間のやる仕事じゃないよな」と思いならが惰性で人生を過ごしてきちゃってました。

で、最近Google Apps Scriptという神ツールを見つけて、これめっちゃ勉強して、まずはMail Delivery Subsystemからメールきたメアドを取得するスクリプト書いてみました。

最終型

もちろん取得するだけだと意味ないので、最終型として以下のようなものを作ろうと思ってます。

  • 失敗してたメアドをスプレッドシートに書いてく (自動で書かれてれば、マスターのシートとvlookup組んでおけば電話番号もスグ分かる)
  • 毎日xx時間おきにこのスクリプトを実行 (トリガー設定)
  • ただし、すでに取得したメアドはスルーする
  • UI上からポチってしたら、初回の実行出来て、トリガー設定できる

今日のゴール

gasを使って、Mail Delivery Subsystemから来た送信失敗したメアドと日時を取得する。
頑張るぞい。

まずはスクリプトを作ってく

自分のGoogleドライブから、まずは「Googleスプレッドシート」を新しく作ります。

スクリーンショット 2019-06-11 20.01.33.png

スクリプトエディタを開く

「ツール」>「スクリプトエディタ」でスクリプトを開きます。

スクリーンショット 2019-06-11 20.02.10.png

とりあえずコードをガリガリ書いてく

↓ 今回の完成形です。


// 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. 検索するメール条件を指定

スクリーンショット 2019-06-11 20.29.32.png

このvarというよく見る文字はvarのあとに書いた文字列(変数名)になにか数値や文字を入れる箱の宣言だと思ってください。
今回はvar searchString = "from:'Mail Delivery Subsystem'";とすることで、今後、searchStringと書いて呼び出すと、自動的にコードが実行されるときにはfrom:'Mail Delivery Subsystem'という文字列が使われるようになります。

もうお決まりごとなので覚えておきましょう!

また、今回はここで、from:'Mail Delivery Subsystem'と書いてるのは、Gmailの検索と一緒で、ここから来たメールを探すよーということを宣言しておきました。

2. 送信に失敗してたメールを探す

スクリーンショット 2019-06-11 20.29.41.png

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. メール送信に失敗してた日付とメアドを取得してみる

いよいよ本題です。

スクリーンショット 2019-06-11 20.29.50.png

検索結果が見つかると、myThreadsにはデータが入ってきます。
これをforという構文を使って中に入ってるデータ分だけ回して処理します。

ほかはすべてこれまでのvarを使ってるだけなので特に変わったことはしてません。
途中で、メールの文章から送信に失敗したメアドを取得するために、getFailedMailAddressという関数を呼んでますが、これは自分で作ったオリジナルの関数です。

基本的に、今すべてmainFunctionの中に処理を書いていってますが、1つの関数の中に処理がたくさん書かれると、この関数の役割が何なのか分からなくなってくるので、処理ごとに関数に切り出すのがGoodです。

ちなみに、getFailedMailAddressはこんな感じです。

スクリーンショット 2019-06-11 20.29.56.png

関数の中で、正規表現という技術を使って、メールの中から<b>タグに囲まれた部分を返してます。
正規表現はこのサイトを参考にさせてもらいました。

実際に動かしてみよう

「実行」>「関数を実行」>「mainFunction」をクリックすると、勝手に実行されます。

ただ、最初の実行時にはこんな感じで、承認を求められますので、手順に沿って承認していきましょう。

まずは承認します。

スクリーンショット 2019-06-11 20.08.35.png

自分のアカウントを選択します。

自分のアカウント洗濯.png

詳細をクリック

詳細前.png

ページへ移動をクリック

詳細後.png

自分のGmailへGoogleAppsScriptsがアクセスすることを許可

許可.png

実行結果を見てみよう

「表示」>「ログ」か、macならCommand+Enterでログの画面が開きます。

実行結果.png

取得出来てますね!!!

次回の野望

次は完成形を目指して以下を実装します。

  • 失敗してたメアドをスプレッドシートに書いてく (自動で書かれてれば、マスターのシートとvlookup組んでおけば電話番号もスグ分かる)
  • 毎日xx時間おきにこのスクリプトを実行 (トリガー設定)
  • ただし、すでに取得したメアドはスルーする
  • UI上からポチってしたら、初回の実行出来て、トリガー設定できる
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?