無料でSlack(プライベートチャンネル含む)へGmailを通知する(slack + mail)
だいぶ前に上記を書きましたが、たまたま今回使うシーンがありました。
が、今回やりたかったのは、タイトルの通り、新着メールを
通知するというもの。
上記の記事では特定の時刻に定期実行(デイリーで1回程度に頻度)することが前提。
ただし、今回やりたいのは、新着メール受信して、即時でslack通知する
、ということ。
そのためには、
1. 新着メールの存在を
2. 定期実行(分単位)したgasで監視して、
3. メールがあるならslack通知する、
といった手段をとる必要があります。
で、
意外とサクッとできたので、備忘録として、書き溜めておきます。
基本的な流れは上記の記事と同じです。
上記の記事と違う点
以下の二つ。
-
新着メール
をGmailApp.search
で取得する - 下記gasを動かすトリガーを1分、5分と言ったインターバルで設定する(ここは必要に応じて変えてください
ことのみ。
script
function sendEmailsToSlack() {
var label = GmailApp.getUserLabelByName('stores.jp');
var messages = [];
var searchCondition = 'label:[対象ラベル名] is:unread '; // 対象ラベルの未読メッセージ という指定をする
var threads = GmailApp.search(searchCondition, 0, 50);
if (threads.length == 0) return // 未読メッセなければ、終了。
for (var i = 0; i < threads.length; i++) {
messages = messages.concat(threads[i].getMessages())
threads[i].markRead(); // 既読にする
}
var message = messages[messages.length - 1];
Logger.log(message);
var output = '\n' + message.getPlainBody();
Logger.log(output);
// payloadの設定は必要に応じてカスタマイズしてください。
var today = new Date();
var payload = {
"username": "問い合わせあり",
"attachments": [
{
"color": "#36a64f",
"title": "以下の内容で問い合わせがありました",
"fields": [
{
"value": output,
"short": false
}
],
}
],
"channel" : "#[通知したいチャンネル名]:", //if send public channel
// "channel" : "@[通知したいチャンネル名]:", //if send private channel
"icon_emoji": ":mailbox:"
};
var options = {
'method' : 'post',
'payload' : Utilities.jsonStringify(payload),
};
var webhookUrl = 'https://hooks.slack.com/services/TS9K2E1LY/hogehoge/xxxxxxxxxxxxxx'; // 通知したいslackチャンネルの の incoming webhook url
UrlFetchApp.fetch(webhookUrl, options);
}