当ブログのおすすめ記事はこちら!
  • 【学生でもできる】エンジニアとして海外ノマドワークをする方法と実際に感じたこと

Gmailをスクレイピングして重要なメールをSlackで通知させる【便利ツール】

SHARE

Gmailをスクレイピングして重要なメールをSlackで通知させる【便利ツール】



こんにちはTakumi(@ynwa_ynwa_0826)です。

今日はGmailをスクレイピングして、重要なメールだけを抽出しslackで通知させる方法を紹介します。
僕はすごく不注意で忘れっぽい性格なので、自分にメールがきてても無視しがちです笑
んでもって、会社のメールアドレスには大量にメールがくる。。。1日100件以上来るので、その中から重要なものを探り出すなんて無茶です。
なんで、重要なメールだけスマホに通知がくるといいなあと思いました。
しかし!実はGmail上にそんな感じの機能ってあるんじゃないかなあと思ったんですがなかったんですね。

ということで、自分で作ってみました。とっても簡単な原理なので誰でもできます。
使用するツールはGoogle App Script(以下GAS)とslackですね。webhookっていうツールを使い、slackとGASを繋ぎ、GASの中でスクレイピングしたgmailをslackで通知させるイメージです。GASではJavascriptが動くので言語はJSとなります。

これで重要なメールに全部気づけるようになり、怒られなくなったので忘れっぽいひとにおすすめです!

目次

  1. Webhookの準備
  2. Gmail上の準備
  3. Google App Scriptに記述

Webhookの準備

 

まずはwebhookというslack上のサービスを利用可能にします。
このサービスを使うことで、外部からslackに何かしてあげることができるようになります。
ので、今後も使う機会があるかもですね。

gmailの通知がくるチャンネルを用意します。今回はシンプルに「gmail」としておきます。

 

左サイドバーの下の方に「App」というところがあるのでそこの「+ Add apps」をクリックして「webhook」と検索してみて下さい。

Add Configurationを選択し、ここから先程作った「gmail」を選択しましょう

 


またここのwebhook URLは後ほど使用します。

Gmail上の準備

 

次はGmailで準備を行います。Gmail上でラベルを作り、そのラベルに該当したメールが届いたときにslackに通知させる流れにします。これがシンプルといった理由です笑

ラベルですが、まず検索窓の「検索オプション」を押します。

そしてここからラベルの条件を選ぶことができます。
自分の場合は、だいたい自分にとって重要なメールが「自分の名前が入っているメール」なので、その場合にラベルがつくようになってます。

 

これで、該当の重要なメールが届いた瞬間にラベルがつくようになりました。次はGASでこのラベルのついたメールをslackに送りつけましょう。

Google App Scriptに記述

 

 

Google App Scriptとは、googleのサービスの一部でサーバーを用意せずともそこにソースコードを書いておくだけで、プログラムを実行してくれるスグレモノです。
しかもバッチ機能といって、数時間に1度実行のように設定することもできます!!!
これが無料で使えるなんてすごい時代ですね。

では実際に使っていきます。
まずGASのホームページ行ってみましょう。

ちょっとわかりにくいかもですが、トップページの1番下にスクロールして、ここからダッシュボードに飛んで書いたコードを管理できます。

 

新規スクリプトを開きましょう。
そしてこのようにソースコードを書いていきます

function myFunction() {
 var postChannelGmail = "#gmail";
 var postUrlGmail = "先程用意したwebhookのURL";
  // 指定のラベルを準備
  var threads = GmailApp.search('is:unread label:Name newer_than:1d');
  
  var count = threads.length;
  Logger.log("対象件数:" + threads.length); 

  for(var i = 0; i < count; i++) {
      var lastDate = threads[i].getLastMessageDate();
      
      var datetime = lastDate.getFullYear() + "/" + (lastDate.getMonth() + 1) + "/" + lastDate.getDate()
      + " " + lastDate.getHours() + ":" + lastDate.getMinutes() + ":" + lastDate.getSeconds();

      Logger.log(datetime + " 件名:[" + threads[i].getFirstMessageSubject() + "]");
     
     //slackに通知
      sendHttpPost("件名:" + threads[i].getFirstMessageSubject() + " link:" + threads[i].getPermalink(), "GMAIL",postChannelGmail, postUrlGmail);
      
      //既読にする。
      threads[i].markRead();
  }

}

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
  };

  UrlFetchApp.fetch(postUrl, options);
}

3行目の
var postUrlGmail = “先程用意したwebhookのURL”;
にwebhookで準備されたURLを書いておいて下さい。ここに向かってGASはデータを投げます。

5行目の
var threads = GmailApp.search(‘is:unread label:Name newer_than:1d’);
でどんなものをslackに送るのか、対象を指定しています。
この場合だと、「既読がついていない」「labelの名前が”Name”」「受信して1日以内」
こんな感じで条件をつけています。

そして、最後にバッチ処理の設定をしておきます。僕の場合は5分に一回くらいでいいかなと思ったので、5分に一回該当のメールをチェックしてもあれば飛んできます

マイトリガーの設定からgmailのトリガーを編集を押します。

 

時間の間隔が選べるようになります。また今回の関数はmyFunctionがメインなので、それを5分とか1分おきに回すようにしましょう。

これで完成です!
お疲れ様でした。

ほかにもslackだけではなくて、chatworkと連動させることもできたりします。
もし機会があればそちらも記事にしていきます。



スポンサードリンク


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です