Slackメッセージをメール転送する

# slackのガラケー対応を考えてみる
「いきなり何を言ってるんだ」と思うかもしれませんが、私が大学のサークルコミュニティでSlackを導入する際に、思わぬ障壁となったのが「ガラケー」の存在であります。

時は2017年12月。今時ガラケーしか使わない大学生が存在するのかと思いましたがそれはさておき、その人にだけ重要な情報が伝わらないのは非常に問題があります。

と言う訳で考えたのがSlackメッセージをメールで転送する方法です。

# 展望
<img width="1319" alt="スクリーンショット 2017-11-28 16.50.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/169644/9eb9a3fe-6a6f-e359-3ec9-a71a430530c3.png">
だいたいこんな感じの展望にしました。ちなみにまだメールからSlackにメッセージする方法は確立していませんが、調べた感じZapierでできそうです。
ただ、Slackからメール転送を送る方法を確立している人は全くいなかったため今回の方法に至った次第です。

# 使ったもの
- [Slack BotをGASでいい感じで書くためのライブラリ](https://qiita.com/soundTricker/items/43267609a870fc9c7453)
    - SlackBotをGASで超簡単にかけるようにしてくれるやつ
- [GoogleAppsScript(Qiitaの入門記事に飛びます)](https://qiita.com/t_imagawa/items/47fc130a419b9be0b447)
    - JSで色々かけるやつ


# 手順
では、実際に作っていくことにしましょう。今回はノンプログラマでもわかるよう丁寧に説明していきます。

## 1.Google Apps Scriptを起動する。
`Google Drive → 新規　→ Google Apps Script`で起動できます。
この際、自身のGoogleAccountにApps Scriptを紐づけている必要があります(詳しくは上記入門記事参照)。

## 2.ライブラリを導入する。
Google Apps Script(以下GAS)のメニュー画面から`リソース→ライブラリ`で以下のポップアップが起動しますので、ライブラリを追加に[こちら](https://qiita.com/soundTricker/items/43267609a870fc9c7453#library%E3%82%92%E5%B0%8E%E5%85%A5)のコードを入れます。するとSlackAppというライブラリが導入できますので、バージョンを最新にしてあげて導入しましょう。
<img width="700" alt="スクリーンショット 2017-11-28 16.48.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/169644/68049115-e34f-76b6-f5b9-47efdb98f289.png">

## 3.自身のSlackのAPI KEYを準備する
方法は下記の二つあります。どちらか好きな方を選びましょう
### ⑴自身のSlackの全てを掌握できるLegacyTokenを取得
こちらは簡単で、https://api.slack.com/custom-integrations/legacy-tokens から取得できます。こちらでも作れますが、メール転送くらいの機能にSlackを全参照できるTokenは必要ありませんので、推奨はしません。

### ⑵機能を限定したTokenを発行する
slackでは、SlackAppを作成してあげることで、機能を限定したAPIを発行できるようになっています。

[Slack API](https://api.slack.com)にアクセスし、横メニューから`Building Slack apps → Create Slack App`でアプリを新規作成し、[こちら](https://api.slack.com/docs/oauth-scopes)の権限一覧を参考に下記のようにAPIのスコープを設定してあげましょう。
**例↓**
<img width="728" alt="スクリーンショット 2017-11-28 17.22.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/169644/9c24eb1d-23e1-31d8-989b-f19241997ba5.png">

APIのスコープ設定(上記画面)は個別のアプリ管理画面から`OAuth & Permissions`にアクセスすると、そのスコープの`OAuth Access Token`の下の方の`Scopes`に表示されています。

## 4.取得したSlack API TokenをGASに導入する
`OAuth & Permissions`で取得できるAPI Tokenをコピーして、GASのメニュー画面から`ファイル → プロジェクトのプロパティ → スクリプトのプロパティ`の順にアクセスします。
`行を追加`をクリックし、以下のようにAPI TokenがGAS内で参照できるようにしてあげます。

## 5.Outgoing Webhooksを導入する
自身のSlackにOutgoing Webhooksを導入します。
<img width="985" alt="スクリーンショット 2017-11-28 20.28.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/169644/f1580990-5d81-2572-9014-fb261a37801e.png">
新しく実装したい場合は自身のslackのappsから`Outgoing Webhooks`を検索して上のようなページに進み、緑色の`Add Configuration`を押します。

新規作成画面に進むと思うので、そこから`Token`を控えておきます。

## 6.コードを書く
```sendMail.gs
function doPost(e) {
  var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');
  var verify_token = "5で控えたToken";
  
  if (verify_token != e.parameter.token) {
    throw new Error("invalid token.");
  }
  
  var app = SlackApp.create(token);
  
  var text = e.parameter.text
  var channel = "#" + e.parameter.channel_name
  var message_link = "http://wakagi.slack.com/messages/" + e.parameter.channel_id
  
  var strTo='example@example.com'; //To
  var strSender="太郎"; //差出人
 
  // メール本文
  var strSubject = "slackからの通知"; //件名
  var strBody = e.parameter.user_name + "からのメッセージ\nチャンネル："+ channel + "\n\n"+ text + "\n\n" + "チャンネルへのリンク：" + message_link + "\nby http://example.slack.com" ;
 
  //メールを送信
  GmailApp.sendEmail(
    strTo,
    strSubject,
    strBody,
    {
      name: strSender
    }
 );}
```

1行ずつ解説していきましょう。

### function doPost(e)
`doPost`メソッドによって、SlackAPIからのPOSTリクエストを受け取ることでスクリプトが発火します。こちらはGASによって定義されています。引数`e`にはslackから送信されてきたPOSTリクエストデータが入ります。

### var verify_token = "5で控えたToken";
Outgoing Webhooks内で生成され、控えたTokenを""に代入しましょう。このTokenでOutgoing Webhooksの一つのConfigurationと結びつけています。

### var app = SlackApp.create(token);
上でtokenに代入した値を使ってSlackAppのライブラリを呼び出しcreateしています。その処理をappに代入しています。

### var text = e.parameter.text
SlackAPIで送信されてきたPOSTリクエストのパラメータは変数`e`に格納されています。`e.parameter.text`でメッセージを取り出します。

```e.parameterの中身の例
token=YGt06HJsGZqpP1V9CUUikqcj
team_id=T0001
team_domain=example
channel_id=C2147483705
channel_name=test
timestamp=1355517523.000005
user_id=U2147483697
user_name=Steve
text=googlebot: What is the air-speed velocity of an unladen swallow?
trigger_word=googlebot:
```

### var strBody = e.parameter.user_name + "からのメッセージ\nチャンネル："+ channel + "\n\n"+ text + "\n\n" + "チャンネルへのリンク：" + message_link + "\nby http://example.slack.com" ;

こちらがメールの本文になります。ここは任意で送信したい内容構成を編集して`strBody`に代入しましょう。

### GmailApp.sendEmail
ここでGmailAppを使用します。GASではGmailAppを使うことでログインしているGoogleアカウントのGmailAPIを承認するだけで使うことができます。
そして、`sendEmail`でメールが送信されます。

## 7.コードを保存して導入
コードを任意のファイル名で保存してあげて、Slackに導入します。
まず、GASのメニューから `公開 → ウェブアプリケーションとして導入`を選択します。
**プロジェクトバージョン**を必ず最新に設定して、公開してあげます。
<img width="462" alt="スクリーンショット 2017-11-29 2.03.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/169644/4bef98a6-a55e-69d1-fb4b-052428512e49.png">
この時、Googleアカウントの承認を色々求められるので、全て承認してあげます。色々注意書きが出ますが、めげずに全て承認してあげましょう。

最後に表示されたURLをコピーしておきましょう。

## 8.コピーしたURLをOutgoing Webhooksに導入
作成したOutgoing Webhooksの`Integration Settings`内の`URL(s)`に先ほど7で取得したURLを入力してあげます。

合わせて`Integration Settings`内の転送対象のChannelと転送するメッセージのトリガーワード(Trigger Word(s):このスクリプトが反応する言葉)を設定しましょう。例えば私の場合、最初に＠channelのつくメッセージを転送したかったので`<!channel>`と入力しました。
@のつくメンションワードを設定する場合は、そのユーザー固有のIDや、独自の記法が必要なので、ご注意ください。
例えば今回の場合@channelは`<!channel>`としてslack上で処理されていますので、Triggerでも同じように指定してあげる必要があります。

最後に必ず全ての設定を保存してあげましょう。

## 9.テストで自分のメールに送ってみる
ここまでできたらstrToに自分のメールアドレスを設定してあげて、Outgoing Webhooksの対象チャンネルにトリガーワードをつけて投稿してみましょう。うまくいっていればメールが送られてくるはずです。

# 感想
SlackAPI面白い。というか[これ](https://qiita.com/soundTricker/items/43267609a870fc9c7453)とGASがなんでもやってくれすぎてすごい。
# 参考リンク
お世話になった記事。以下のリンクを参考にすれば他のSlackBotも実装できます。

- [初心者でも簡単！Google Apps ScriptでGmailを操作してメールを送る方法](https://tonari-it.com/gas-gmail-sendemail/)
- [初心者がGASでSlack Botをつくってみた
](https://tech.camph.net/slack-bot-with-gas/)
- [Slack API 推奨Tokenについて](https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21)
- [SlackのOutgoing Webhookで@つきのmentionを捕まえる](https://beatsync.net/main/log20150926.html)
- [Slack BotをGASでいい感じで書くためのライブラリを作った](https://qiita.com/soundTricker/items/43267609a870fc9c7453)