Send emails to this channel を使ってメールをslackに通知するメモ

新卒にやり方を共有した時のメモ。

仕事中大体の情報はslackでやりとりすることが多いのですが、重要な情報がメールだけで来ていたときに問題が起きる、ということもあるかもしれないので、見る必要がありそうなメールをslackに転送します。

## やり方
### slackのメールアドレスを取得
slackのチャンネル宛にメールを送る方法を使います。(メールによってはIDパスワード等が含まれるような場合もあると思うので、プライベートチャンネルに通知するのがおすすめです。)

まず、通知を飛ばしたいチャンネルの`Send emails to channel`をクリックします。
![send_email_to_slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883734/acb9033a-4fb4-b4b1-fdcf-63a807882bf3.png)

↓のような画面が表示されるので、Get Channel Email Addresをクリックします。
![send_email_to_slack_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883734/73b48ab9-f6f4-4379-aaf3-ddd4bb47da47.png)

チャンネルのメールアドレスが表示されるので、このアドレス宛にメールを送ればslack通知されます。
![send_email_to_slack_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883734/ea2ac04a-c99b-444e-5f47-5d9e1bc2b79c.png)

### slackのメールアドレス宛にメールを送信
メールの宛先に先ほどのslackチャンネルのアドレスを追加すればOKです。

たったこれだけでSlack通知ができてしまうのですが、より実用的になるようにGASを使ったアプリのslack通知もやってみます。gmailの検索条件に当てはまるメールをslackに通知する、という例でslack通知をやってみましょう。
ソースコードは[【GAS】Gmailで自由に転送する](https://qiita.com/golyat/items/45aec273f6d0288f3402)を参考にしています。

ドライブを開き、`新規> その他> GoogleAppsScript`をクリックします。
![gastest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883734/1c125e54-2db9-67ab-3296-b46c82cd5ea3.png)

以下をコード.gsにコピペ

```javascript
function transferEmail() {
  const addressTo = "*******";// CHANGE_ME slackのアドレスをコピペ
  const searchCondition = "******";// CHANGE_ME

  const now = Math.floor(new Date().getTime()/1000); 
  const intervalTime = 0.5; //0.5時間毎に実行されるようにトリガーを設定
  const term = now - 3600 * intervalTime;
  const str = searchCondition + ' ' + 'after:' + term;

  const myThreads = GmailApp.search(str, 0, 30);
  const myMsgs = GmailApp.getMessagesForThreads(myThreads);

  if(myMsgs.length == 0)
    return null;

  myMsgs.map(function(msgs) {
    const msg = msgs[0];   
    MailApp.sendEmail({
      to: addressTo,
      subject: msg.getSubject(),
      body: msg.getPlainBody(),
      attachments: msg.getAttachments()
    });
  });
}

```

addressToに先ほどコピーしたslackチャンネルのアドレス、searchConditionにメールの検索条件をコピペします。
検索条件はgmailの画面を開いて実際に検索してみるのが早いです。
例えば自分宛のメールをslackに転送したい場合は、gmailアプリの画面で `to hogehoge@example.com` という条件を作成して、それをそのままコピペすればOKです。
フィルタ設定とかしている人はそこで条件作成していると思うので、それを貼り付ければOKです。

![transferMail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883734/e13e016e-43c9-1944-bc98-2bcfc7f6ce9f.png)


```javascript
  const searchCondition = "to hogehoge@example.com";// CHANGE_ME
```

みたいにすればOKです。

ソースコードの修正が完了したら、トリガーを実行しますが、その前に一度実行して動作確認してみましょう。
`実行> transferEmail` から実行すると、以下の様な許可が求められるので、ログインして許可します。

![transfarEmailTest - Google Chrome 2020-12-14 11.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883734/9ff196dd-0d73-189c-03fe-a2ac2ea690e6.png)

![ログイン - Google アカウント - Google Chrome 2020-12-14 11..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883734/5d7f8ffa-1132-3aa5-9bbc-311f33edd3cf.png)

許可後、該当のチャンネルに投稿されれば動作確認完了です。

次にトリガーを設定します。上記例では30分毎にメールをチェックするようにしているので、30分毎のトリガーをセットしておきましょう。（`const intervalTime = 0.5;` を書き換えれば好きな時間でのトリガーのセット可能です。）

![transfarEmailTest - プロジェクトのトリガー - Apps Script - Go.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883734/ecc2fbe8-ddfc-f63c-8929-37d786f98f7e.png)


### 通知の様子
こんな感じで通知が飛びます。
![send_email_to_slack5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883734/59cc310a-a8e9-f699-7955-e0da316a9bc6.png)

開くとこんな感じ。
上に送信元のアドレス、件名、日付、下に本文が確認できます。
![send_email_to_slack_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883734/6d79f0cc-d35b-488d-cb74-6e43f20b4fb3.png)


## どういうところで使えそうか。
- GASでアプリ作ってみたけど、通知は簡単でいい。
- メールソフト開きたくないので、見る必要のあるメールはslack転送したい。
- メールで来る問い合わせを専用のチャンネルに通知したい。
- 勤怠メールの宛先に追加して、勤怠情報をチームチャンネルにも通知したい。
- 今までメールに通知する形で運用していたツール等をslackに移行するのがめんどい。


## 欠点
以下の様な欠点もあります。それは困る、という場合はwebhook等利用してアプリを作成しましょう。

- 単体だとメンションが出来ない(多分)。
- フォーマットが固定

## まとめ
slackへのメール通知をwebhook使わずにやってみました。
今回はメールを単純に転送するだけでしたが、`MailApp.sendEmail` の宛先をslackチャンネルのアドレスにすることで、GASで作ったアプリのslack通知も簡単に実現できます。

また、今までメールに通知していたような情報（環境メンテナンス等の情報、リリースに関連するチェック、各種お知らせ等）については、GASを書く必要すらなく、宛先にslackチャンネルのアドレスを追加するだけでslack通知できます。もしくは今回実装したメール転送アプリを利用することで既存の仕組みに手を入れることなくslack通知することも可能です。

通知をなるべく1カ所に集約したいという人は多いと思うので、確認のために毎日メールアプリ開きたくない、という人はぜひ試してみてください。