show log include yuh

勉強したことの復習を兼ねて、IT関係(ネットワーク/サーバ/アプリケーション)についてまとめてます。たまに趣味のこと

スポンサーリンク

GASを使ってメール内容をSlackチャネルに表示させる

概要

メールの内容をSlackのチャネルに飛ばすにはSlackデフォルトのメールアプリがあります。
ただこちらは有料版限定でしか使えません。gmail限定ですが今回GASを使って擬似的にメール内容をSlackに飛ばすように実装してみました。

やりたいこと

  • gmailアドレスをエイリヤスで作り、メルマガを種類により分別してチャネルに通知
    f:id:yunabe_net:20220209224625p:plain

  • GASを定期的に動かしてメールを見に行くので、リアルタイムでは受信することはできません。

タイムゾーンを日本にする

初期設定では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文を分けることで複数の宛先を管理できます