27
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SlackAdvent Calendar 2017

Day 7

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

Last updated at Posted at 2017-12-06

slackのガラケー対応を考えてみる

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

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

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

展望

スクリーンショット 2017-11-28 16.50.04.png だいたいこんな感じの展望にしました。ちなみにまだメールからSlackにメッセージする方法は確立していませんが、調べた感じZapierでできそうです。 ただ、Slackからメール転送を送る方法を確立している人は全くいなかったため今回の方法に至った次第です。

使ったもの

手順

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

1.Google Apps Scriptを起動する。

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

2.ライブラリを導入する。

Google Apps Script(以下GAS)のメニュー画面からリソース→ライブラリで以下のポップアップが起動しますので、ライブラリを追加にこちらのコードを入れます。するとSlackAppというライブラリが導入できますので、バージョンを最新にしてあげて導入しましょう。
スクリーンショット 2017-11-28 16.48.55.png

3.自身のSlackのAPI KEYを準備する

方法は下記の二つあります。どちらか好きな方を選びましょう

⑴自身のSlackの全てを掌握できるLegacyTokenを取得

こちらは簡単で、https://api.slack.com/custom-integrations/legacy-tokens から取得できます。こちらでも作れますが、メール転送くらいの機能にSlackを全参照できるTokenは必要ありませんので、推奨はしません。

⑵機能を限定したTokenを発行する

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

Slack APIにアクセスし、横メニューからBuilding Slack apps → Create Slack Appでアプリを新規作成し、こちらの権限一覧を参考に下記のようにAPIのスコープを設定してあげましょう。
例↓
スクリーンショット 2017-11-28 17.22.36.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を導入します。
スクリーンショット 2017-11-28 20.28.53.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のメニューから 公開 → ウェブアプリケーションとして導入を選択します。
プロジェクトバージョンを必ず最新に設定して、公開してあげます。
スクリーンショット 2017-11-29 2.03.23.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面白い。というかこれとGASがなんでもやってくれすぎてすごい。

参考リンク

お世話になった記事。以下のリンクを参考にすれば他のSlackBotも実装できます。

27
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?