4
9

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.

【GAS】Gmailを定期的に確認し新規メールをSlackに通知する

Posted at

はじめに

背景

普段メルマガなどメールが大量にきて、スマホの通知がうるさいので止めたい
送信元ごとすべて止めるとたまにくる重要メールなどに気づけない
スマホのメール取得間隔を伸ばすとすぐに見たいメールが来ない
なので、一旦アーカイブして、定期的にメールの件名を取得し、slackに通知するようにした

参考にさせていただいたもの

【決定版】GAS で Gmail の検索結果をスプレッドシートに抽出する方法
【初心者向け】GASを使ってSlackへ自動通知

設計概要

下記の動作を行う

  • Gmailのラベル毎に新規に受信したメールを確認する
  • 該当するメールがあれば、件名を抽出し、ラベル毎にslackに通知する
  • 確認間隔は12時間ごと

#事前準備

Gmailの設定

すぐに通知が不要なメールは下記のフィルタを設定

  • 受信トレイをスキップ(アーカイブ)
  • 任意ラベルをつける

slackの設定

左カラムの下側にある「Add Apps」をクリック
「incoming-webhook」を検索して、インストール

image.png"

incoming-webhook の設定画面で、「Add Configuration」をクリック

image.png

投稿したいチャンネルを選択し、「Add Incoming WebHooks integration」をクリック
※ここでは gmail チャンネルを選択
image.png

すると「Webhook URL」が作成される。
後ほど使用するので控えておく

GAS設定

Google Drive から新規をクリックし、Google Apps Script を選択
下記のスクリプをコピペ 
※一部修正箇所あり(2行目)

mail.gs
function sendToSlack(message) {
  var postUrl = '<Slack Webhook URL>'; // 先程取得した Slack の Webhook URLを指定する
  var username = 'GmailBot';      // 通知時に表示されるユーザー名
  var icon = ':hatching_chick:';  // 通知時に表示されるアイコン
  
  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : message
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}

function main() {
  var messages = 'Gmail Check Start!\n';
  var after = parseInt(((new Date()).getTime() - 13 * 60 * 60 * 1000) / 1000);  //13時間前を指定
  
  var labels = GmailApp.getUserLabels();  //ラベル一覧を取得
  for (var i = 0; i < labels.length; i++) {
    var targetLabel = "label:" + labels[i].getName();
    var searchTarget = targetLabel + ' after:' + after
    var subjects = ''
    
    var loopcount = 0;
    GmailApp
    .search(searchTarget, 0, 10)
    .forEach(function (thread) {
      thread.getMessages().forEach(function (message) {
        var subject = message.getSubject();  //メールの件名を取得
        subjects += subject + "\n"
        loopcount++;
      });
    });
    
    if (loopcount === 0) continue;
    messages += "\n" + targetLabel + "\n" + subjects
  }
  
  sendToSlack(messages)
}

テスト実行

main 関数を指定し、実行ボタン▶ をクリック
※初回のみ権限許可について、同意が求められるので、同意する

image.png

slack に正しく投稿されたら成功!

こんな感じになるはず
image.png

定期実行

プロジェクトのトリガーをクリック
image.png

トリガーを追加をクリックし、下記画像のように設定
image.png

同様に実行時間を「午後10時~11時」に設定したトリガーを追加する
※トリガーはこの範囲で実行されるため、毎回変動する
※そのため、gasプログラムのafterを13時間としている

さいごに

複数のアカウントを確認する方法を調べましたが、よくわからず。
とりあえずは、各アカウントごとに同様の設定をするしかなさそう。
どなたか、方法をご存知であればご教示下さい。

4
9
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
4
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?