概要
メールの内容をSlackのチャネルに飛ばすにはSlackデフォルトのメールアプリがあります。
ただこちらは有料版限定でしか使えません。gmail限定ですが今回GASを使って擬似的にメール内容をSlackに飛ばすように実装してみました。
やりたいこと
タイムゾーンを日本にする
初期設定ではUTCで時刻を取得されてしまうのでJSTで固定する
- appsscript.jsonを開く
- timeZone"を Asia/Tokyo
に変更する
通知
はじめはWebhockで通知していましたが、メールの内容が長くなると読みにくいです。
こちらはスニペッドで表示させるためにSlack Appを導入してトークンを手に入れます。
- OAuth & Permissions
- Bot User OAuth Token このトークンをコピーしておく
スクリプト
以下は変数となります。
{{BOT_USER_OAUTH_TOKEN}}:Slack Bot のトークン
{{DST_MAIL_ADDRESS}}:送信先アドレス
{{DST_CHANELL}}:送信先Slackチャネル
//var const SLACK_OAUTH_ACCESS_TOKEN = '{{BOT_USER_OAUTH_TOKEN}}' function main() { // 未読メールを検索 const threads = GmailApp.search('in:Inbox is:Unread', 0, 100) threads.forEach((thread) => { thread.getMessages().forEach((message) => { if (!message.isUnread()) { return } const text = createMessage(message) const toMail = message.getTo() const fromMail = message.getFrom() createFile(text, toMail, fromMail) message.markRead() }) }) } function createMessage(message) { //メール内容を作成 return `[送信元] ${message.getFrom()}` + `\n[日付] ${message.getDate()}` + `\n[件名] ${message.getSubject()}` + `\n ${message.getPlainBody()}` } function createFile(text, toMail, fromMail) { // メール内容により宛先チャネルを分ける if (toMail.match(/{{DST_MAIL_ADDRESS}}/)){ var channel = '{{DST_CHANELL}}'; } // その他はrandom else{ var channel = 'random'; } var content = text; postFileToSlackChannel(channel, content); } function postFileToSlackChannel(channel, content){ var payload = { 'token' : SLACK_OAUTH_ACCESS_TOKEN, 'channels' : channel, 'content' : content, 'filename':'mail.txt', 'title': 'mail' }; var options = { 'method' : 'post', 'contentType': 'application/x-www-form-urlencoded', 'payload' : payload }; // スニペッドとしてアップロード var response = UrlFetchApp.fetch('https://slack.com/api/files.upload', options); Logger.log(response); }
宛先チャネルを増やす場合は // メール内容により宛先チャネルを分ける
部分でif文を分けることで複数の宛先を管理できます