Gmail で特定のラベルが付いたメールだけを Slack に流したい時があります。
たとえば「問い合わせ」「障害連絡」「重要」などのラベルだけを通知すれば、メールをずっと開いていなくても見逃しにくくなります。
今回は、Google Apps Script(GAS)を使って、Gmail の特定ラベルを Slack に通知するシンプルな方法をまとめます。
事前準備
先に Slack 側で Incoming Webhook を作成しておきます。
Webhook URL が発行されたら、そのURLに対して JSON を POST するだけでメッセージを送れます。
GAS 側では、Gmail のラベル名と Webhook URL を用意しておきます。
サンプルコード
function postLabeledGmailToSlack() {
const labelName = '重要';
const doneLabelName = 'slack_posted';
const webhookUrl = 'https://hooks.slack.com/services/XXXXX/XXXXX/XXXXX';
const label = GmailApp.getUserLabelByName(labelName);
if (!label) return;
let doneLabel = GmailApp.getUserLabelByName(doneLabelName);
if (!doneLabel) {
doneLabel = GmailApp.createLabel(doneLabelName);
}
const threads = label.getThreads(0, 20);
threads.forEach(thread => {
const messages = thread.getMessages();
const lastMessage = messages[messages.length - 1];
const subject = thread.getFirstMessageSubject();
const from = lastMessage.getFrom();
const body = lastMessage.getPlainBody().slice(0, 200);
const permalink = thread.getPermalink();
const payload = {
text:
'Gmail通知\n' +
'件名: ' + subject + '\n' +
'送信者: ' + from + '\n' +
'本文抜粋: ' + body + '\n' +
'リンク: ' + permalink
};
UrlFetchApp.fetch(webhookUrl, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload)
});
thread.addLabel(doneLabel);
});
}
コードのポイント
GmailLabel では、ラベルが付いたスレッドを getThreads() または getThreads(start, max) で取得できます。
大量に処理する可能性があるなら、範囲指定できる getThreads(start, max) のほうが扱いやすいです。
また、GmailThread では getMessages() でメッセージ一覧が取れます。
件名は getFirstMessageSubject()、最新時刻は getLastMessageDate()、スレッドのリンクは getPermalink() で取れるので、通知文を組み立てやすいです。
Slack通知で気をつけたいこと
Slack Incoming Webhook は、Webhook URL に JSON を POST すればメッセージが送れます。
その代わり、Webhook URL 自体が秘密情報なので、GitHub など公開リポジトリに載せないよう注意が必要です。
リクエストが壊れていると、400 / 403 / 404 などのエラーが返ることもあるので、うまく飛ばない場合はレスポンス確認もしておくと安心です。
トリガー設定して自動化する
このスクリプトは、Apps Script の時間主導トリガーを設定しておけば自動化できます。
たとえば 5分おき、10分おきなどで動かせば、ほぼリアルタイムに近い形で Gmail → Slack 通知ができます。
問い合わせ窓口や監視通知の一次受けに使うとかなり便利です。
まとめ
GAS と Slack Incoming Webhook を組み合わせると、Gmail の特定ラベルだけを簡単に通知できます。
メール全部を追いかけるより、ラベル単位で通知するほうが運用しやすいので、個人的にもかなり使い勝手がいいやり方です。
「必要なメールだけSlackに流したい」という時は、この形がかなりシンプルでおすすめです。
