LoginSignup
6
5

More than 3 years have passed since last update.

SendGrid,Heroku,Gmailを使って無料で特定のメールだけをSlackチャンネルに転送する

Last updated at Posted at 2019-10-08

はじめに

今まで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でメール内容受け取り、任意チャンネルに投稿する

概要図

summary.png

手順

※各サービスのアカウント作成とfreenomでのドメイン取得方法に関しては割愛します。

※今回用に事前にfreenomで以下ドメインを取得しました。
2019-10-06_21h45_14.png

SendGrid : Domain Authentication設定

SendGridでメールを受け取るためのドメインの設定をします。

SendGrid管理画面からSender Authenticationをクリック
2019-10-06_21h41_18.png

Authentication Your Domainをクリック
2019-10-06_21h41_55.png

Nextをクリック
2019-10-06_21h44_09.png

Domain You Send Fromに取得したドメインを入力しNextをクリック
2019-10-06_21h45_36.png

ここまで来たら以下画像のように3件のCNAMEレコードが表示されるのでfreenomで追加します。
2019-10-06_21h46_12.png

CNAMEレコード追加
2019-10-08_16h34_56.png

SendGridでVerifyをクリックし3件全てVerifiedになったらOKです。
※注意※ドメイン取得から使用できるようになるまで最大3日程度かかる場合があります。
2019-10-08_16h40_36.png

Slack : Incoming Webhookの設定

チャンネルにIncoming Webhookアプリを追加、Webhook URLを取得します。

2019-10-08_16h45_53.png

2019-10-08_16h46_22.png

2019-10-08_16h46_49.png

2019-10-08_16h47_19.png

Webhook URLをゲット☆
2019-10-08_16h48_21.png

プログラム作成

※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

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をクリック

2019-10-08_17h41_38.png

Add Host & URLをクリック
2019-10-08_17h44_16.png

こんな感じで設定
2019-10-08_17h45_56.png

ここまでで、とりあえずem8892.takahirosato.tkに送られるメールは全てSlackのテストチャンネルに転送されるようになりました。

↓こんな感じで届きます。
2019-10-08_17h51_13.png

Gmail : フィルタリング & 転送

Gmailで受け取ったメールから特定のメールだけを転送するよう設定します。

Gmailの設定からメール転送とPOP/IMAPをクリック

2019-10-08_17h57_57.png

転送先アドレスを追加をクリックしアドレス入力
※@の前は何でも良いです
2019-10-08_17h55_44.png

続行
2019-10-08_17h54_53.png

確認コードがSlackに届きます

2019-10-08_18h01_17.png

確認コードを入力して転送先アドレス設定完了

2019-10-08_18h02_53.png

新規フィルタ作成
検索フォームの▼をクリック
2019-10-08_18h07_21.png

含むに【TEST】を入力しフィルタを作成をクリック
2019-10-08_18h07_47.png

次のアドレスに転送するにチェックを入れ、先程登録したアドレスを設定しフィルタを作成をクリック
2019-10-08_18h08_16.png

ここまでで、このGmailアカウントに送られたメールの内、件名に【TEST】が含まれるものだけがSlackのテストチャンネルに送られるようになりました。

めでたい

終わりに

実際に職場のメールとSlackで2ヶ月ほど使用しましたが、Herokuの1月当たりの無料使用可能時間(550時間)の内、数十時間程度しか使用してなかったので、Zapierと比べてかなり余裕ありそうです。
また、今回はSlackへの転送でしたが、SendGridとHerokuの組み合わせはかなり色々できそうだなと思いました。
添付ファイルも受け取れるので、添付Excelの中身を見てSlackに報告なんてこともやってます。
GASにAPI作ってスプレッドシートに書き込むみたいなのも楽しそう。

6
5
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
6
5