Slackからメールに自動送信してみた


# はじめに
社内コミュツールとしてSlackが導入され、社内のコミュニケーションが多少なりとも活性化してきました。
SlackのAppやワークフロービルダーを使って既存プロセスを楽にしようと考える人も出てきて、ツールが変われば人も変わるなーと実感しています。

そんな中でも依頼は「社内メール」という文化は残っており、最後は誰かがメールを送らないといけません。。。
なのでSlackで簡素化した申請プロセスの申請内容をSlackから社内メールに自動送信するようにしてみました。

# 環境
今回は以下の環境を利用しました。

Slack（Outgoing Webhook）
Sendgrid
Google Apps Script（Node.js）

順番に設定内容を記載します。

# 1.Slack
チャンネルで特定のキーワードに対して反応するOutgoing Webhookを設定します。
Outgoing WebhookはSlackのApp管理ページから「App ディレクトリを検索」で検索できます。

## 1-1.設定内容
チャンネル：Outgoing Webhookを動かすチャンネルを指定します。
プライベートチャンネルは指定できませんでした。

引き金となる言葉：トリガーとなるキーワードを指定します。

URL：あとで作るGoogle Apps Scriptの`Current web app URL:`を指定します。

![スクリーンショット 2020-01-17 11.39.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203854/8f649629-5b9e-b214-02e4-652ccfbd47b0.png)


# 2.Sendgrid
メール配送はSendgridを使いました。
https://sendgrid.kke.co.jp/

詳細は割愛しますが、必要となるのはAPIキーです。
ダッシュボートの「Settings」-「API Keys」でKeyを作成してください。
注意：Keyは作成時しか表示されません。


# 3.Google Apps Script
Slackの投稿を受け取ってメールを送信するスクリプトはGoogle Apps Scriptに構築しました。

## 3-1.環境変数
環境変数は以下を設定します。
環境変数の設定はGoogle Apps Scriptの「ファイル」-「プロジェクトのプロパティ」-「スクリプトのプロパティ」から設定できます。

■VERIFY_TOKEN
検証用トークンです。自身で設定したOutgoing WebhookからのPOSTかどうか検証します。
これを設定しないとどこからでもPOSTできるようになってしまいます。
設定値はOutgoing Webhookの設定ページにあるTokenを指定します。

■SEND_GRID_ENDPOINT
SendgridのURLを指定します。
```https://api.sendgrid.com/v3/mail/send```

■SEND_GRID_API_KEY
Sendgridのダッシュボードで取得したAPIキーを指定します。

## 3-2.スクリプト
`doPost（POST、Verify処理）`と、`sendMail（メール送信処理）`の２つに分けています。
メールの`to`,`subject`,`from_name`,`from`はご自身の環境に合わせて設定してください。

`PropertiesService.getScriptProperties().getProperty('XXX')`で環境変数を取得しています。

```javascript:code.gs
function doPost(e) {
  var verify_token = PropertiesService.getScriptProperties().getProperty('VERIFY_TOKEN');
  if (verify_token != e.parameter.token) {
    throw new Error("invalid token.");
  }
  
  var message = e.parameter.text;  
  sendEmail(message);
}

function sendEmail(message){
  var sendgrid_endpoint = PropertiesService.getScriptProperties().getProperty('SEND_GRID_ENDPOINT');
  var sendgrid_apikey = PropertiesService.getScriptProperties().getProperty('SEND_GRID_API_KEY');
  var to = "送信先メールアドレス";
  var subject = "メールタイトル"; 
  var from_name = "送信者名";
  var from = "送信元メールアドレス";
  
  var body = {
    "personalizations": [
      {
        "to": [
          {
            "email": to
          }
        ],
        "subject": subject
      }
    ],
    "from": {
      "email": from,
      "name" : from_name
    },
    "content": [
      {
        "type": "text/html",
        "value": message
      }
    ]
  }
  var payload = JSON.stringify(body);
  UrlFetchApp.fetch(sendgrid_endpoint, {
    method: 'POST',
    headers: { "Content-Type": 'application/json',
             "Authorization": "Bearer "+ sendgrid_apikey},
    payload: payload
  });
}
```

## 3-3.有効化
Google Apps Scriptのメニューの「公開」-「ウェブ アプリケーションを導入…」からスクリプトを有効化します。
`Who has access to the app:`は`Anyone, even anonymous`を選択してください。

<img width="421" alt="スクリーンショット 2020-01-17 13.31.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203854/7a20bfed-91a2-868f-51bb-b4b04d3c5cfd.png">

こちらに出力される`Current web app URL:`を 1-1.のURLに指定します。
これで設定は完了です。

# 4.動作確認
Outgoing Webhookで設定したチャンネルで`引き金となる言葉`を投稿して、内容がメールで送信されるか確認します。
うまく送信されない場合は各設定値と、Google Apps Scriptのログを確認してみてください。

# 最後に
Slack投稿をメールに自動送信してみました。
今回はVerifyのためにtokenを使いましたが、Verifyすら不要であれば変数なしでもいけそうです。
セキュリティには十分注意して使いましょう。