はじめに
今までZapierとgmailを使って特定のメールをSlackチャンネルに転送をしていました。
Zapierは設定がとっても楽チンで非常に良かったんですが、
無料プランだと1月当たり100通しか転送できず別の方法を考えることにしました。
Slackも無料プランのためEmailアドオンが使うことができず、
それでも無料でチャンネルにメール転送したいと思い実際にやってみました。
(個人アカウントへの転送はSlackが無料プランでもメールアドレス発行出来るので出来ます)
本記事での目標
Gmailで件名に【TEST】が入っているメールを受け取ったら、
Slackのテストチャンネルに、送信元、件名、本文が自動で投稿されるようにする。
目次
今回使用するもの、サービス
- SendGrid(Parse Webhook) : メール受け取り、Herokuに用意したAPIにPOSTする
- Heroku(Node, Express) : 受け取ったメールをパース、整形し、Slackのincomig-webhookにPOSTする
- freenom : 無料ドメイン取得、Parse Webhookを利用するため必要
- gmail : メールをフィルタリングし、Slackに送りたいメールだけ転送する
- Slack : Incoming Webhookでメール内容受け取り、任意チャンネルに投稿する
概要図
手順
※各サービスのアカウント作成とfreenomでのドメイン取得方法に関しては割愛します。
※今回用に事前にfreenomで以下ドメインを取得しました。
SendGrid : Domain Authentication設定
SendGridでメールを受け取るためのドメインの設定をします。
SendGrid管理画面からSender Authenticationをクリック
Authentication Your Domainをクリック
Domain You Send Fromに取得したドメインを入力しNextをクリック
ここまで来たら以下画像のように3件のCNAMEレコードが表示されるのでfreenomで追加します。
SendGridでVerifyをクリックし3件全てVerifiedになったらOKです。
**※注意※**ドメイン取得から使用できるようになるまで最大3日程度かかる場合があります。
Slack : Incoming Webhookの設定
チャンネルにIncoming Webhookアプリを追加、Webhook URLを取得します。
プログラム作成
※nodeは10.13.0を使用しています。
適当なディレクトリを作成し、必要モジュールをインストール
- express : Webアプリケーションフレームワーク
- multer : メールがmultipart/form-data形式で飛んでくるため使用
- axios : Incoming WebhookへPOSTするため使用
- html-to-text : HTML形式メール対応のため使用
$ mkdir test
$ cd test
$ npm -y init
$ npm i --save express multer axios html-to-text
$ touch index.js
プログラム本体:index.js
const multer = require("multer");
const axios = require("axios");
const htmlToText = require("html-to-text");
const app = require("express")();
app.set("port", process.env.PORT || 3000);
const webhookUrl =
"https://hooks.slack.com/services/*********/*********/**********************"; // 各自webhookUrlを設定ください
app.post("/", multer().any(), (req, res) => {
(async () => {
try {
await axios.post(webhookUrl, {
text: `
From : ${req.body.from}
Subject : ${req.body.subject}
Body :
${req.body.text || htmlToText.fromString(req.body.html)}
`
});
res.status(200).send({ success: true });
} catch (e) {
console.error(e);
res.status(500).send({
success: false,
error: e
});
}
})();
});
app.listen(app.get("port"), () => {
console.log(`Express server listening on port ${app.get("port")}`);
});
Herokuデプロイ
※Heroku CLIをインストールしておいてください(https://devcenter.heroku.com/articles/heroku-cli)
Heroku上で空のアプリを用意しておいてください。
今回はアプリ名takahirosato-test-appで作成しました。
login
$ heroku login
さっき作ったtestディレクトリ下で以下実行
$ git init
$ heroku git:remote -a takahirosato-test-app
node_modulesをignore
$ echo "/node_modules/" > .gitignore
Procfile作成
$ echo "web: node index.js" > Procfile
commit & push
$ git add .
$ git commit -am "make it better"
$ git push heroku master
エラーがでなければオッケイ☆
SendGrid : Inbound Parse設定
SendGrid管理画面からInbound Parseをクリック
ここまでで、とりあえずem8892.takahirosato.tkに送られるメールは全てSlackのテストチャンネルに転送されるようになりました。
Gmail : フィルタリング & 転送
Gmailで受け取ったメールから特定のメールだけを転送するよう設定します。
Gmailの設定からメール転送とPOP/IMAPをクリック
転送先アドレスを追加をクリックしアドレス入力
※@の前は何でも良いです
確認コードがSlackに届きます
確認コードを入力して転送先アドレス設定完了
次のアドレスに転送するにチェックを入れ、先程登録したアドレスを設定しフィルタを作成をクリック
ここまでで、このGmailアカウントに送られたメールの内、件名に【TEST】が含まれるものだけがSlackのテストチャンネルに送られるようになりました。
めでたい
終わりに
実際に職場のメールとSlackで2ヶ月ほど使用しましたが、Herokuの1月当たりの無料使用可能時間(550時間)の内、数十時間程度しか使用してなかったので、Zapierと比べてかなり余裕ありそうです。
また、今回はSlackへの転送でしたが、SendGridとHerokuの組み合わせはかなり色々できそうだなと思いました。
添付ファイルも受け取れるので、添付Excelの中身を見てSlackに報告なんてこともやってます。
GASにAPI作ってスプレッドシートに書き込むみたいなのも楽しそう。