[GAS × Slack]Gmailで特定の送信元からのメールを受信した場合にSlack通知する
概要
特定の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関連
- Class GmailApp | Apps Script - Google for Developers
- Class GmailThread | Apps Script - Google for Developers
- Class GmailMessage | Apps Script - Google for Developers
- 【GAS】Gmailから条件指定で検索して情報を取得する | レッツ効率の良い人生
3. Slack関連
- chat.postMessage | slack api
- Google Apps Script (GAS) で Slack 連携を実装する前に知っておくとよい 5 つのこと | Qiita
- 【GAS】Googleスプレッドシートを更新したらSlackに通知させる仕組みを作ってみた | Qiita
- SlackのIncoming Webhooksでメンションを飛ばす方法 | Qiita
4. その他
①アイコンは以下のサイト様より頂戴しました!
-
メール | カクレノ
②通知にメンションをつける記述を追加(ただし、コメントアウト)しました
Discussion
こんにちわ!
Slackへの投稿の件名のあとに、Gmail URLではなく、本文をそのまま投稿したい場合の
記述を教えていただきたいです。
いろいろ試したのですがうまくいかず、お待ちしております。