園児ニアのメモ

ただのエンジニア。何でも屋みたいな扱い受けてます。

【GAS】自動送信じゃないGmailをSNSに通知

私はそんなにメールを使わないのですが、
メールを使う営業の方からしてみればセミナーに参加した時などの自動送信メールに埋もれた個人宛の返信待ちのメールを見逃しがちなのでは?という発送で作りました。

GoogleAppScript(以下GAS)はGmailを持っていれば使えるのでエンジニア以外でも使えるのがいいですね。

機能としては

  • 個人宛の場合に必ず入っている単語、ここでは苗字を含む未読のメールを20件まで検索
  • 検索結果から特定のアドレスや単語を含むメールを排除し、10分以内に受け取ったものだけにする。
    • 残ったメール内容は何回も通知しないように既読にします。
  • 残ったメール内容をSNSに通知する。

GASとSNSの準備

以下、今回使うGASとChatWorkについての記事です。
GASを使用する準備は以下を参考にどうぞ。
madgenius.hateblo.jp

下のソースの最後にも同じ内容が入っていますが、GASでChatWorkに投稿する方法は以下を参考にしてください。
madgenius.hateblo.jp

その他APIが公開されているTwitterやSlackなども投稿部分の改変次第で利用可能です。

ソース

以下、実際にソース内容です。

function MinuteCheckGMail() {
    /*---------------------------------------*
     * 未読で苗字を含んでいるメールを新規100件取得
     *---------------------------------------*/
    var strTerms = 'is:unread "あなたの苗字"'; //未読で苗字を含むもの
    var myThreads = GmailApp.search(strTerms, 0, 20); //条件にマッチしたスレッドを100件取得
    var myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納
    var valMsgs = [];
    var dateNow = new Date();
    
    /*---------------------------------------*
     * 10分以上前のものや自動配信のものを除外
     * 除外されないものはChatWorkに送るので既読にする
     *---------------------------------------*/
    var j = 0;
    for(var i = 0;i < myMsgs.length;i++){
        var myThread = myThreads[i];
        var myMsg = myMsgs[i];
        if (myMsg != null) {
            var date = myMsg[0].getDate();
            var from = myMsg[0].getFrom();
            var subject = myMsg[0].getSubject();
            var body = myMsg[0].getPlainBody();
            if (!from.match(/block_user@gmail.com/)) { //特定のアドレスからの通知を拒否
                //自動送信のニュースを拒否(Googleカレンダー,ChatWorkなど)
                if (!body.match(/配信停止/) && !body.match(/受信設定/) && !body.match(/通知設定/)) {
                    //受信日時が今じゃないなら拒否(10分前のものまで受けとる)
                    if (dateNow.getFullYear() == date.getFullYear()) {
                        if (dateNow.getMonth() == date.getMonth()) {
                            if (dateNow.getDate() == date.getDate()) {
                                if (dateNow.getHours() == date.getHours()) {
                                    if (dateNow.getMinutes()-10 <= date.getMinutes()) {
                                        myThread.markRead(); //ChatWorkに送信したものは既読にする
                                        valMsgs[j] = [];
                                        valMsgs[j][0] = date;
                                        valMsgs[j][1] = from;
                                        valMsgs[j][2] = subject;
                                        valMsgs[j][3] = body;
                                        j++;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    
    /*---------------------------------------*
     * 自分宛ての新着メールをチャットワークに送信する
     *---------------------------------------*/
    if (valMsgs.length > 0) {
        for (var i = 0; i < valMsgs.length; i++) {
            var valMsg = valMsgs[i];
            if (valMsg != null) {
                var strBody = "";
                strBody += "[info][title]"+valMsg[1]+"[/title]";
                strBody += "受信日時:"+valMsg[0].getFullYear()+"/"+valMsg[0].getMonth()+"/"+valMsg[0].getDate()+" "+valMsg[0].getHours()+":"+valMsg[0].getMinutes()+":"+valMsg[0].getSeconds()+"\n";
                strBody += "タイトル:"+valMsg[2]+"\n";
                strBody += "本文  :"+"\n"+valMsg[3];
                strBody += "[/info]";
                
                //ChatWorkに予定一覧を投稿する
                var client = ChatWorkClient.factory({token:"????????"});
                client.sendMessage({
                    room_id:00000000,
                    body:strBody
                });
            }
        }
    }
}
  • 実行時に認証するGoogleのアカウントに紐づくGmailを確認します。
    • タイマー設定は毎分にしてください。
  • 「'is:unread "あなたの苗字"';」の部分の「あなたの苗字」を苗字に変えてください。
  • 「if (!from.match(/block_user@gmail.com/)) {」の部分が特定のアドレスからの受信は通知しないように設定している部分です。
    • 複数設定する場合は「if (!from.match(/block_user@gmail.com/) && !from.match(/block_user_2@gmail.com/)) {」のようにしてください。
  • 「if (!body.match(/配信停止/)) {」の部分で「配信停止」を含むメールを除外しています。

動作

hogehoge@gmailから自分が認証したアカウントに「あなたの苗字」の部分を「苗字」に変えて送信した場合です。
f:id:nanokanato:20170828113954p:plain:w300

たまに2分ほど遅れて通知がきますが、未読であればちゃんと通知してくれます。
一応、同じhogehoge@gmailから「このメールは自動送信です。配信停止はこちら」みたいなメールを送りましたが、それは除外しているのでSNSに通知がきませんでした。

余談

GASでTwitterにツイートする記事です。
ツイート部分のアドレス(/update.json)を自分宛にDMを送信などにすれば使えます。
仕事のメールはChatWorkに、個人のメールはTwitterのDMになど変更可能です。
madgenius.hateblo.jp