🚕

[GAS × Slack]Gmailで特定の送信元からのメールを受信した場合にSlack通知する

2023/07/23に公開
1

概要

特定のGmailで特定の宛先からのメールを受信した場合にSlack通知するGoogle Apps Script(GAS)のサンプルコード(覚え書き)。

通知内容は、
受信日時、送信者、タイトル、メールURL
→ メールへのリンクも貼って、クリックすると該当メールをすぐに開けるようにしました。

トリガー機能を使って、10分おきに検知するようにしています。

設定手順

1. ソースコードの作成

まずは、GASのコードをスクリプトエディタに書き込みます。

(1) スプレッドシートを開いて、「拡張機能」(①) > 「Apps Script」(②)をクリック

(2) スクリプトエディタが開くので、以下のコードを貼り付け

貼り付けるコード
// メールを開くための共通部分
const baseUrl = 'https://mail.google.com/mail/u/0/#inbox';
// 送信元: Gmailの検索ボックスにおける検索条件を踏襲
const senders = 'from:hogehoge@gmail.com OR from:fugafuga@gmail.com';

/**
 * 対象のメールが存在する場合にSlackに通知
 */
function sendSlack(){
  const body = search();
  if(body){
    // スクリプトプロパティの取得
    const webhookUrl = PropertiesService.getScriptProperties().getProperty("SLACK_WEBHOOK_URL");
    // Slack側で設定済の箇所はコメントアウト: こちらで上書き可能
    const jsonData =       {
        // "channel": "#重要メール",
        // "icon_url": "xxxxxxxxxxxxxxxxx",
        "text": body,
	/* @channelの通知を入れたい場合 */
	// "text":"<!channel> "+body, 
        // "username": "メール受信のお知らせですよ"
      };
    const payload = JSON.stringify(jsonData);
    // オプション
    const options =
      {
        "method": "post",
        "contentType": "application/json",
        "payload": payload
      };
    
    // Slackへメッセージ送信
    UrlFetchApp.fetch(webhookUrl, options);

  }else{
    // 該当のメールが存在しない場合はコンソールログを出力
    console.log('There are not messages.');
  }
}

/**
 * メール検索
 */
function search() {
  const now = new Date();
  // 10分前(Unixタイム): Gmailでの時分秒単位での検索はUnixタイムにする必要あり
  const tenMinBeforeUnix = Math.floor((now.getTime() - 600000)/1000); 
  const query = `after:${tenMinBeforeUnix} AND (${senders})`;
  const threads = GmailApp.search(query);
  let body = '';

  for(const thread of threads){

    const messages = thread.getMessages();

    let sender = '';
    let receivedDate = '';
    for(const message of messages){
      sender = message.getFrom();
      receivedDate = Utilities.formatDate(message.getDate(), "JST", "yyyy/MM/dd HH:mm:ss");
    }
    
    const subject = thread.getFirstMessageSubject();
    const mailUrl = `${baseUrl}/${thread.getId()}`;
    body = `${body}\n受信日時:${receivedDate}\n送信者:${sender}\nタイトル:${subject}\nメールURL:${mailUrl}\n\n`;
  }
  return body;
}

2. Slackの設定

続いて、Slack側の設定を行います。

(1) 通知用チャンネルの作成

① まずは、通知用のチャンネルを作成します。Slackを開いたら、「チャンネルを追加する」(①) > 「新しいチャンネルを作成する」(②)をクリック。

② チャンネル名を入力(今回は「重要メール」にしました)し(①)、「次へ」をクリック(②)

(3) 可視性の選択をし(①)、「作成」をクリック(②)

(4) 必要に応じて、メンバーの追加を実施。作成者自身は最初から追加されているので、その点は大丈夫です。

(2) Incoming WebHooksの追加と設定

GAS → Slackへメッセージ送信できるようにするため、Incoming WebHooksを追加します。

①左メニューの「アプリを追加する」をクリックし(①)、開いたメニューの検索ボックスに「Incoming WebHooks」と入力すると(②)、「利用可能なアプリ」下に「Incoming WebHooks」が出るので、その下の「追加」をクリック(③)

②説明等を一通り確認した後、「Slackに追加」をクリック

③投稿するチャンネルを選択し(①)、「Incoming Webhook インテグレーションの追加」をクリック(②)

④通知時の各種設定を行います。今回は、「名前をカスタマイズ」(①)、「アイコンをカスタマイズする」(②)に変更を入れました。
後続のスクリプトプロパティの設定で使用するWebhook URLをコピーするため、「URLをコピーする」をクリックし(③)、「設定を保存する」をクリック(④)。

※この設定により、通知時の内容が以下のように変わります。

3. GASの設定

(1) スクリプトプロパティの設定

①Apps Scriptの画面に戻り、左メニューの「プロジェクトの設定」(歯車マーク)をクリック

②画面を下方にスクロールし、「スクリプトプロパティを追加」をクリック

③プロパティ欄に「SLACK_WEBHOOK_URL」と入力し(①: コード内で使ってます)、値欄に「2-(2)Incoming WebHooksの追加」でコピーしたWebhook URLを貼り付け(②)、「スクリプトプロパティを保存」をクリック(③)

(2) トリガーの設定

10分おきに検知できるようトリガーの設定を行います。

①Apps Scriptの画面にて、左メニューの「トリガー」をクリック

②「新しいトリガーを作成します。」をクリック(トリガーの設定がない場合)

③以下の通り設定し(①)、「保存」をクリック(②)

※①設定内容

項目名 設定値 備考
実行する関数を選択 sendSlack ソースコードのSlack通知用のメソッド
実行するデプロイを選択(デプロイ時に実行) Head デフォルトのまま
イベントのソースを選択 時間主導型
時間ベースのトリガーのタイプを選択 分ベースのタイマー デフォルトのまま
時間の感覚を選択(分) 10分おき
エラー通知設定 今すぐ通知を受け取る

これで、対象の送信元からメールが来るとSlackに以下のような通知が飛んでくるはずです!

参考

1. Gmailの検索関連

2. GAS関連

3. Slack関連

4. その他

①アイコンは以下のサイト様より頂戴しました!

  • メール | カクレノ
    ②通知にメンションをつける記述を追加(ただし、コメントアウト)しました

Discussion

hashimoto_mhashimoto_m

こんにちわ!
Slackへの投稿の件名のあとに、Gmail URLではなく、本文をそのまま投稿したい場合の
記述を教えていただきたいです。
いろいろ試したのですがうまくいかず、お待ちしております。