ITインフラエンジニアのおつむの整理

ITインフラエンジニア(現ニート)の頭の整理場所。ほぼ日記になる予定。

チャットツール(Slack等)と連携したGmail整理用GASスクリプト

背景など

  • メインのメールでGmailを使用しており、基本的にInboxは空にして何を読んでいないか把握できるようにしたい
  • 良く届くメールやアラートメールは自動でアーカイブしたい。 ただちゃんと認識もしたい
  • Gmailの機能で自動ラベル付け・自動既読。GASスクリプトを定期的に実行し、ラベル付けしたメールをチャットツール(SlackやMattermost)に通知し、自動でアーカイブさせる

スクリプト内容

function myFunction() {
    //notification
    var pcg1 = "<channelName1>"; //★1
    var pug1 = "<webhookURL1>"; //★1
    var threads1 = GmailApp.search('label:#notification in:inbox'); //★2
    webhook(pcg1, pug1, threads1);
    
    //alert
    var pcg2 = "<channelName2>"; //★1
    var pug2 = "<webhookURL2>"; //★1
    var threads2 = GmailApp.search('label:#alert in:inbox'); //★2
    webhook(pcg2, pug2, threads2);
    
}

function webhook(postChannelGmail, postUrlGmail, threads) {
    var count = threads.length;
    Logger.log(postChannelGmail + "対象件数:" + threads.length); 

    for(var i = 0; i < count; i++) {
        var lastDate = threads[i].getLastMessageDate();
        var message  = threads[i].getMessages()[0]; // Get first message

        var datetime = lastDate.getFullYear() + "/" + (lastDate.getMonth() + 1) + "/" + lastDate.getDate()
        + " " + lastDate.getHours() + ":" + lastDate.getMinutes() + ":" + lastDate.getSeconds();

        Logger.log(datetime + " 件名:[" + threads[i].getFirstMessageSubject() + "]");

        //slackに通知
        sendHttpPost("* _**From**_ :" + message.getFrom() + "\n* _**Title**_ :" + threads[i].getFirstMessageSubject() + " \n* _**Full Text**_ :" + threads[i].getPermalink(), "Gmail",postChannelGmail, postUrlGmail);

        //アーカイブ
        threads[i].moveToArchive();
    }
  }
  
  function sendHttpPost(message, username, postChannel, postUrl)
  {
    var jsonData =
    {
       "channel" : postChannel,
       "username" : username,
       "text" : message
    };
    var payload = JSON.stringify(jsonData);
    var options =
    {
      "method" : "post",
      "contentType" : "application/json",
      "payload" : payload,
      "validateHttpsCertificates" : false
    };
  
    UrlFetchApp.fetch(postUrl, options);
  }

使い方

  • ★1の部分にチャットツールのチャンネル名、webhook設定したチャンネルのURLを入れる
  • ★2のところでチャットツールへ通知したいGmailのフィルターを設定している。自分は通知用(label:#notification in:inbox)、アラート用(label:#alert in:inbox)にチャンネルを分けて設定してる。1つでいい場合は該当の4行を削除すればいいよ。
  • 上記の通り、Gmailのラベルでフィルターしてる。なのでGmailの自動処理設定でラベル付け、自動既読を設定する。
  • 後は当該スクリプトをGASに登録して、定期的に実行している(自分は5分ごとにしている)

所感

  • 一時期メールが何百通も未読になってしまい、余裕があるタイミングで一気に確認してアーカイブしたりしてた。確認が大変なので適当な確認になってたし、ちょっと重要なメールを見逃していたりしてだいぶうんざりしてたんだけど、これができるようになり整理方法が増えたのがだいぶでかい。
  • あと自分でdockerで構築しているMattermost環境があるのでそれを有効活用したいってのもあった
  • ただまずは自分のGmailの分類を決める事が必要なので、どっちかというとそっちの方が大変よ、、、全く決まってないとき自分は二日間くらいかけて管理方法を決めたりしてました。(結局その時と管理方法も変わりましたが。たぶんこれからも変わりそう)
  • これのほかにも定期的に届いて残す必要のないメールを定期的に削除するGAS、未読メールは特定の時間にチャットツールにリマインドするGASもあります。気が向いたらまた投稿します。