メールをSlackに転送して読む方法

今回はメールをSlackに転送して読む方法を紹介します。

コラボレーションツールとして利用されるシーンも多くなったSlack。
一方で仕事上のお客様とか場合によっては内部でもメールでのやりとりも続いているのがほとんどです。

そんな中でメールもSlackも見てると結構めんどくさいな?と思ったりしません。
僕は思っちゃいます。
どうせならチェックする箇所は一か所にしたいなと。

とういうことで今回は実際に僕もやっているメールをSlackに連携して、Slackで確認する方法を紹介します。
やりたいことがわかっている人は、目次をクリックすると該当の説明部分にジャンプできます。

メールをSlackに転送して読む方法

Slackでのやりとがメインになってくると、できるだけSlack上で解決できたらいいのになーなんんて思うことありませんか?

そんな思いがでてきたので、まずはメールをSlackで確認できるようにしてみました。
僕自身が見つけたやり方は2通り。
簡単なものとちょっと手間なものとあります。

やり方は2通り

自分に届いたメールをSlackで確認する方法は次の2通りです。

Slackでメールをみるやり方
  • Slackの標準アプリ(Email)を使う
  • AWSサービス(SES/Route53/S3/Lambda)を組み合わせて使う

前者はSlackの標準機能なので、無料で利用できます。
後者のAWSサービスを使う場合には多少の費用が必要ですが、それでも月額で$1-$2(約110円~220円)くらいで済みます。
それに加えてAWSサービスの多少の知識とプログラミングのスキルが必要です。

それぞれのやり方を説明していきます。

Slack標準機能でのやり方

Slackでの標準機能のやり方はとても簡単。

Slackメール連携 Slack提供機能 Step1
Slack Appを開いてメールアプリを探す
スクリーンショット 2020-06-10 7.38.14
▲SlackのAppディレクトリ(https://自分のワークスペース/apps)を開きます。
スクリーンショット 2020-06-10 7.38.39
▲検索バーが(虫眼鏡がある入力できる箇所)あるので、そこに「Email」と入力します。
Slackメール連携 Slack提供機能 Step2
メール連携するチャンネルを選択する
スクリーンショット 2020-06-10 7.38.57
▲メールを投稿したいチャンネルを選択します。
この設定をするとメールアドレスが割り振られます。
割り振られれたメールアドレスにメールを転送もしくは送信するとSlackの該当チャンネルに表示される仕組みです。

スクリーンショット 2020-06-10 7.39.24
スクリーンショット 2020-06-10 7.39.36
完了

「Email」を「Slackに追加」するだけです。
そうするとメールアドレスが準備され、そこに紐づけるチャンネルを設定します。

自分のメールボックスに届いたのでSlackで見たいものをルール処理などでSlackから割り当てられたメールに転送するようにすれば完成です。
1チャンネルにつき、1メールアドレスが必要になります。
なので、チャンネル複数に投稿したい場合には、それぞれのチャンネルごとにメールアドレスを準備する必要があります。

なお、Slackのメールアプリを使う場合の制約などは以下になります。
(SlackのEmailアプリのページにも記載あり)

Slack Emailアプリの制限
  • 1チャンネルにつき1つのアプリ設定(インテグレーション)が必要
  • メールのヘッダーと文章は合わせて 1 MB 以下
  • 添付ファイルありの場合は30MB以下
  • メールにつけられる添付ファイルは最大 20 件まで

またメールの内容をSlack投稿の添付ファイルとして扱ってSlack上で表示されます。

AWSサービスを使ったやり方

続いてはAWSにあるサービスを連携させてSlackに表示させるやり方です。
ここは少し前提があります。
以下前提をクリアしている人はすんなりできると思います。
クリアしてない人は、色々ほかで調べたりしないとうまくできない可能性があります。

AWSサービス使うSlack連携の前提
  • 自分で自由に使えるAWSアカウントをすでに持っている
  • ある程度のAWSサービスのことを調べて自分で理解できる
  • Pythonのコードをなんとなく理解できる

今回の仕組みを説明すると、
メールを受信できるドメインをRoute53に登録。
登録したドメインをもとにSESでメール受信ルールを設定。
S3にSESで受けるメールを保管するバケットとプレフィックスを作成して、イベントトリガーでLambdaを実行。
Lambdaにてメール内容を解析してSlackに投稿。
といった流れになります。

順を追って手順と利用したAWSサービスについて簡単な説明を書いていきます。

手順1.ドメインを取得してRoute53に登録する

まずはメールを送信するためのドメインをRoute53に登録します。

Route53とは?

AWSが提供するDNSサービスです。
ドメインを登録して様々なサービスでDNS問い合わせに使えるように設定・管理を行えるサービスです

今回の使い方であればホストゾーンの管理料金が毎月$0.5かかる程度です。

参考
Amazon Route 53 料金表AWS

もし、ご自身で何かしらのドメインをもっていれば、それを使うのもありです。
ただし、地域汎用ドメイン(co.jp)は登録できなかったりと制約もあります。

私は、今回いろいろ考えるよりもということでこれ専用のドメインを取得しました。
取得すると対応するドメインあたりの費用が掛かります。
特に外部に通達して使うものでないので、適当に安いドメインを使いましょう。
今回私は「co.uk」ドメインを取得しました。
これが年額で$9です。
使っている間は利用料として更新タイミングで支払いが発生します。

今回の手順はドメイン取得したうえでRoute53に登録する流れになっています。
Route53はグローバルなので、リージョンは意識しません。

Slackメール連携 Route53設定 STEP.1
ドメイン登録画面を開く
サービスからRoute53を選択してRoute53の管理画面を呼び出します。
mail-slack-002
▲左側ペインの「登録済み」ドメインを選択して画面を開きます。
Slackメール連携 Route53設定 STEP.2
ドメインの取得
mail-slack-003
▲「ドメインの登録」ボタンを押して自分の使いたいドメインを探します。
ドメイン名を入力して利用したいドメインを選択、「チェック」ボタンを押下します。
そうすると該当ドメインが利用可能かどうかのチェックが行われます。
ドメイン名に問題がなければ、「続行ボタン」でドメインを購入を進めます。
mail-slack-008
▲DSNにドメインを登録する際には情報が必要なので、項目に従って入力します。
mail-slack-009
▲確認画面まできて、「注文を完了」を押せばドメイン取得は完了です。
Slackメール連携 Route53設定 STEP.3
DSNにsmtpの受信設定
登録されたドメインはDNS参照できるようになっただけなので、メール受信でるようDSNレコードを追加します。
この時しているするのはSESのエンドポイントになります。
どのリージョンを使うかによって値が異なります。
値はAWSのドキュメントを参照してください。

参考
リージョンと Amazon SESAWS

僕は今回は「米国東部(バージニア北部)」の「us-east-1」を使うことにしました。
以降の各サービスでは、このリージョンを使うことになるので忘れないようしてください。
完了

手順2.S3にメール格納用のバケットを作成する

SES(Simple Email Service)で受信するメールのためにS3にバケットを作成します。

S3とは?

Simple Storage Serviceと呼ばれるンターネット用のストレージサービス。
99.999999999% (9 x 11) の耐久性を実現するように設計されており、世界中の企業向けに何百万ものアプリケーションのデータを保存しています。
料金は保管するデータ量とデータの読み書きによって決まります。

参考
Amazon S3 の料金AWS

SESではメール受信ボックスがないので、個別に作成する必要があります。
S3にメールを保管できるバケットを作ります。

Slackメール連携 S3バケット作成 Step.1
S3管理コンソールを開く
mail-slack-016
▲サービスから「S3」を選択して、管理コンソールを開きます。
「バケットを作成する」をクリックしてバケット作成ウィザードを開きます。
Slackメール連携 S3バケット作成 Step.2
SESでメール保存するバケットを作成する
mail-slack-017
▲各項目に以下のように値を設定してバケットを作成します。

バケット名(必須) 分かりやすいお好きな名前でどうぞ
リージョン(必須) 米国東部(バージニア北部)

勘の良い方はお気づき方と思いますが、添付しているイメージはリージョンが間違っています。
作成の時にリージョンが同一でないとダメだということを意識してなくてキャプチャを撮っていたためです。
実際には「米国東部(バージニア北部)」にバケットを作成しています。

完了

これでS3の設定は完了です。
続いてSESの設定です。

手順3.SESを使ってメール受信時の設定とルールを作成する

続いてSES(Simple Email Service)の設定です。

SESとは?

クラウドベースのEメール送信サービス
送信サービスがメインだが当然受信もできる。
今回のように受信だけの場合には、1,000通で$0.01。
受信メールチャンク(メールに含まれる添付ファイルなども含めた総サイズが256KBを超えると1チャンク)1,000チャンクにつき、$0.09とほとんど料金かからないくらいで使えます。

参考
Amazon SES 料金AWS

リージョンごとの設定となるので、今回は「米国東部(バージニア北部)」で設定をしていきます。

Slackメール連携 SES設定 STEP.1
受信ルールを作成を開始
mail-slack-019
mail-slack-020

▲SES画面の左ペインの「Email Receiving」の下にある「Rule Sets」をクリックしてルール作成画面を呼び出します。
「Create a Receipt Rule」を押下してルール作成に入ります。

Slackメール連携 SES設定 STEP.2
受信アドレスの入力
mail-slack-021
▲ここでSESを使って受信するメールアドレスを設定します。
ドメイン全部での受信を指定するので、ドメインのみを今回は入力し、「Add recipents」ボタンを押下します。
Slackメール連携 SES設定 STEP3.
メールアドレスの検証
mail-slack-023
▲先ほど入力したドメインが上に表示され、Verification statusが「Verify domein」になっているかと思います。
ドメイン検証を完了するために「Verify domein」をクリックします。
mail-slack-024
▲検証画面が表示されます。(キャプチャが行けてないですけど・・・)
今回はRoute53を使っているので、「Use Route53」をクリックします。
mail-slack-025
▲「Domain Verification Record」と「Hosted Zones」で今回使うドメインを選択して「Create Record Sets」でRoute53のDNSエントリーに設定を追加します。
mail-slack-027
▲一旦「pending」になった後、「Verified」になればOKです。
Verifiedにならない場合には何かしら間違っているはずので、設定などを確認してみてください。
Slackメール連携 SES設定 STEP.4
メール受信時アクション設定
mail-slack-028
▲「Next Step」を押下すると、Actions画面に切り替わります。
ここでは先ほど指定したドメイン宛てのメールを受信した際に、どういったアクションをするか設定します。
今回の設定内容は以下です。

(このタイミングでは)指定しない

S3 buket(必須) 先ほど作成したS3バケット
Object Key prefix(任意) 先ほど作成したバケットに作成したprefix
Encrypt Message(任意) チェックしない
SNS topic(任意) 指定しない
Add action(任意)
Slackメール連携 SES設定 STEP.5
Rule details設定
mail-slack-030
▲「Next Step」を押下すると、Rule detail画面に切り替わります。
今回の設定は以下のようにしています。

Rule name(必須) 今回の受信ルール名(お好きな内容でどうぞ)
Enabled(任意) チェック
Require TLS(任意) チェック
Enable spam and virus scanning(任意) チェック
Rule set(必須) default-rule-set
Roule position(必須) Begininng

今回のルールはすべてのメールに対する設定になります。
特定のメールアドレスのみ処理を変えたい場合、例えば「foge1@fogefoge.com」だけは別の処理をしたい場合には、foge1@fogefoge.comでルールセットを作ります。
そして作った「foge1@fogefoge.com」のRoule Positionを今回のルールの前に設定するようにしてください。
SESでは上か順にルールが評価されますので。

mail-slack-031
mail-slack-032

▲「create roure」を押下すすればルールの完成です

完了

手順4.Cloud9を使ってLambda関数を作成してデプロイする

SESとS3の準備が整ったらいよいよ処理を行うためのLambdaを準備します。
今回はソース管理は個人で済ませるので、GitHubは使っていません。
とはいえPCの中でいろいろやるのも面倒なので、Cloud9を使っています。

Cloud9とは?

ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE)です。
コードエディタ、デバッガー、ターミナルが準備されていて、大抵の言語のコーディングが可能なサービス。
料金についてはコーディングを行うためにIDEを立ち上げていた時間分かかります。(利用した分だけ課金)

参考
AWS Cloud9 料金AWS

一度IDEを立ち上げれば、あとはそれに紐づくLambdaなどを簡単に作ることができます。

Slackメール連携 Cloud9設定 STEP.1
Cloud9の管理コンソールからウィザードを実行する
mail-slack-052
▲AWSマネジメントコンソールから「Clodu9」サービスを選択して、Cloud9の管理コンソールを開きます。
「Create Environment」を押下してIDE環境作成ウィザードを開きます。
Slackメール連携 Cloud9設定 STEP.2
IDE環境設定値入力
mail-slack-053
▲Step1 Name environmentが表示されるので値を入力し、次のステップへ進みます。

Name(必須) IDE名(お好きな内容でどうぞ)
Description (任意) 何かメモを入れておけば入れるくらい(今回は入れてません)

mail-slack-054
▲Configure settingsの値を確認して、必要に応じて変更して、次のステップへ進みます。

未使用時にはすぐ停止しておきたいのでデフォルトとの「After 30 minutes」を選択します。

Environment type(必須) 今回は新規に立ち上げるので「Create a new instance for environment (EC2)」を選択します。
既存EC2があり、そちらを利用したい場合には、Connect and run in remote server (SSH)を選択して、必要情報(接続先や鍵情報)を設定します。
Instance type(必須) 今回は大規模に開発するわけではないので、最小スペック「t2.micro」を選択します。
Platform 今回は「Amazon Linux」を選択しました。(Ubuntu Serverでも問題ないかと思います)
Cost-saving setting(必須)

mail-slack-055
▲Review画面でこれまでの設定を最終確認し、問題なければ「Create environment」でIDE環境を立ち上げます。
後は作成完了まで待ちます。

完了

これでコーディング環境ができました。
この後コードを書いていくタイミングでLambdaも同時作成することになります。
その際にLambdaにつける権限(Role)が必要になるので、先にRoleを作成します。

lambda用ロール作成 Step1
ポリシーの作成
mail-slack-059
▲IAM管理コンソール画面に移動して、左側ペインの「ポリシー」を選択します。
ポリシーの作成を選択して、「JSON」タブをクリックして以下のコードを記述します。

やっていること
  • ClouewatchLogsへの書き込み許可
  • 対象のS3バケットからのオブジェクト取得許可
  • SES経由でのメール送信許可
  • SSMからのパラメータ取得

ポリシーの確認で、ポリシー名を任意の名前を入れて作成します。

lambda用ロール作成 Step2
ロールの作成
今度は左側ペインの「ロール」を選択し、「ロールの作成をクリックします」
mail-slack-058
▲AWSサービスの「lambda」を選択し、「次のステップ;アクセス権限」を押下してアクセス権限の設定に移ります。
mail-slack-062
▲ポリシーのフィルタをクリックして「ユーザーによる管理」にチェックをいれ、先ほど作成したポリシーを選択します。
「次のステップ:タグ」押下後の、タグは必要であれば設定します。
「次のステップ:確認」押下後の画面で、ロール名を入力して、ロールを作成します。
これでロールの準備も終わりました。
完了

続いてCloud9の環境にlambda開発環境を作ります。

Slackメール連携 Cloud9上でのlambda関数作成 Step1.
IDE環境を開く
AWSサービスのCloud9を選択し、先ほど作成した環境の「OPEN IDE」をクリックしてIDEを開きます。
Slackメール連携 Cloud9上でのlambda関数作成 Step.2
lambdaの作成
右側にあるlambdaマークをクリックしてlambada作成ウィザードを起動します。
その際に入力する値は次の通りです。

Function name(必須) lambda関数の名前(お好きな内容でどうぞ)
Application name(必須) 初期でFunction nameに入力したものがセットされます。
変更も可能

「Next」を押下して、実行環境の選択に移ります。
今回は「empty-python」でOKです。
「Next」を押下して表示されるトリガー設定画面では「none」のままでOKです。
「Next」を押して表示される設定画面では以下のようにします。

Memory(必須) 初期表示されている128MB
Roele(必須) Choose an existing roleを選択
選択後に表示させる「Existing Role」には先ほど作成したロールを選択します。

「Next」を押して、設定確認画面で設定が想定(入力)したものであることを確認して「Finish」を押せば終了です。

完了

後はCloudformationが自動実行されlambda関数が作成されます。
それと同時にIDE上にlambdaで実行させるPythonの開発環境が準備されます。
今回は、slackwebというライブラリを利用するので、導入します。
画面下側に「bash-」で始まるコンソールが表示されていると思います。
ここで、以下のようにコマンドを入力していきます。

slackwebをpipでinstallするのですが、個別ディレクトリにパッケージを配布するようにしています。

続いてlambda関数ですが、次のようなコードを記述します。

やってること
メイン処理ではS3に格納されたメールを取得してデータを解析
メールアドレスのTo.に指定されている宛先(@より前)を取得してパラメータストアからSlackの投稿先を取得
Slackにメンション付きで投稿

実行環境の大枠ができてきました、あと少しです。
そして、ここで一旦AWS環境を離れて、SlackAPIの設定をしていきます。

手順5.SlackAPIを設定する

受け手となるSlackでの設定をしていきます。
Slack側はアプリケーションを作って、認証キーの取得とWebhookURLを取得します。

Webhookとは?

HTTPのPOSTリクエストを使ってアプリケーションサービスに処理をさせる仕組み。
今回でいえばLambadaからSlackの特定URLに対してリクエストを送って、メッセージを投稿することです。

Slackメール連携 Slack App作成 Step1.
Slack App管理画面を開く
Slack apiのWebページにいきます。

参考
Slack Api Home

スクリーンショット 2020-06-06 10.50.05(2)
▲私はいくつかアプリをつくっているので表示されてます。
最初は多分真っ白で何もないと思います。
Slackメール連携 Slack App作成 Step2.
Appを作成する
「Create New App」から利用するアプリケーションを作成します。

App Name(必須) Slack Appの名前(お好きな内容でどうぞ)
ここで記載した名前がSlack投稿時に表示されます
Development Slack Workspace(必須) 今回のAppを稼働させるSlackのworkspaceを選択します。

「Create App」を押すことでAppの枠が出来上がります。

Slackメール連携 Slack App作成 Step2.
Incoming Webhooksを有効にしてURLを生成する
左側ペインの「Features」下にある「Incoming Webhooks」をクリックして、Webhook設定画面を開きます。
「Active Incoming Webhooks」横のスライドを「OFF」から「ON」にします。
あとは、「Add New Webhook to WorkSpaces」をクリックしてメールを連携したいSlackチャンネルのWebhookを設定していきます。
Slackメール連携 Slack App作成 Step3.
完了

これでSlack側の設定は完了です。
再びAWS環境に戻り、パラメータストアに必要な設定を入れていきます。

手順6.パラメーターストアに必要な情報を保管する

今回のPythonでの設計として、複数のチャンネルに投稿することを前提にしています。
そして、チャネルごとにある程度のカスタマイズを想定しています。

なので、パラメータストアもチャンネルごとの設定を保持するようにしています。

AWS Systems Manager パラメータストアとは?

AWSが提供してくれる設定データ管理と機密管理のための安全な階層型ストレージです。
パスワードや文字列といった定義ファイルに保持していたようなものをパラメータ値として保持できます。

参考
AWS Systems Manager パラメータストアAWS ユーザーズガイド

料金はスタンダードを選択している限りはほぼ無料です。

参考
AWS Systems Manager パラメータストア料金AWS

Slackメール連携 パラメータストアデータ格納 Step1.
AWS Systems Manger管理コンソールを開く
スクリーンショット 2020-06-06 11.43.31
▲サービスメニューからSystemsMangerを選択して管理コンソールを開きます。
左側ペインにあるパラメータストアを選択して画面を開きます。
Slackメール連携 パラメータストアデータ格納 Step2.
WebhookURLの登録
スクリーンショット 2020-06-06 11.25.54
▲「パラメータの作成」をクリックしてパラメータ登録画面を開きます。

名前(必須) /チャンネル名/hook_url
説明(任意) パラメータの説明を必要であれば記載します
利用枠(必須) 標準
タイプ(必須) 文字列 or 安全な文字列
値(必須) Slack Appで取得した投稿したいチャンネルのWebhook URL

タイプで文字列を選んだ場合は、DataTypeは「テキスト」でOKです。
安全な文字列を選んだ場合は、KMSの主要なソースは「現在のアカウント」、KMSキーIDは「alias/aws/ssm」でOKです。
「パラメータの作成」を押下すればパラメータ登録は完了です。
チャンネルが複数ある場合には、必要チャンネル分この作業を繰り返してください。

パラメータストアデータ格納 Step3.
デフォルトメンションIDの登録
プログラム上、常にメンションありでSlackに投稿します。
そのためデフォルトのメンションIDを登録します。
以下の内容でWebhook同様パラメータストアに登録します。

名前(必須) /Slack/common/mention_id
説明(任意) パラメータの説明を必要であれば記載します
利用枠(必須) 標準
タイプ(必須) 文字列 or 安全な文字列
値(必須) 自分のSlackID

SlackIDの確認方法は、Slackの「プロフィールを表示する」を選択します。
表示されたプロフィールの「その他」をクリックして一番下に表示される「メンバーIDをコピー」で確認できます。

POST

SlackIDとして登録するパラメータストアの値には「@ID>」で登録してください。
SlackIDが、「abc1234」だった場合は、「@abc1234>」として登録しないとエラーになります

もし、チャンネルごとにメンション先を変えたい場合には、パラメータストアの名前を「/チャンネル名/mention_id」としてチャンネルごとの設定として追加してください。

完成

これでパラメータ設定完了です。
あとはS3に最終設定を入れれば完了です。

手順7.S3でイベント設定とライフサイクルを設定する

いよいよ最後の設定です。
発火(=処理を実行させるきっかけ)の設定と、オブジェクト削除の設定をします。
S3は何もしないとデータは保管されたままです。
S3のデータはSlackに連携すれば不要なので、一定期間きたら削除するように設定します。
そうすることで費用を抑えることもできます。

Slackメール連携 S3設定 Step1.
S3コンソールを開く
スクリーンショット 2020-06-06 12.18.42
▲S3の管理コンソールを開いて、今回利用するバケットを選択します。
mail-slack-035
▲プロパティタブにあるイベントをクリックします。
Slackメール連携 S3設定 Step2.
イベントの設定
通知の追加を選択して、以下のように設定します。

名前(必須) 分かりやすい名前でお好きなものを登録してください。
イベント(必須) PUTを選択
プレフィックス(必須) メールを転送する先のプレフィックス
送信先(必須) Lambda関数を選択。
Lambdaが選べるようになるので、作成したLambdaを選択

保存で、設定を保存します。
これで発火設定はできました。

Slackメール連携 S3設定 Step3.
ライフサイクルの設定
続いて管理タブをクリックして、ライフサイクルの追加を行います。
「ライフサイクルルールの追加」をクリックします。
①名前とスコープは以下のように入力します。

ルール名を入力する(必須) 分かりやすい名前でお好きなものを登録してください。
ルールスコープを選択(必須) スコープを特定のプレフィックスまたはタグに限定
プレフィックスまたはタグフィルタを追加(必須) メールを転送する先のプレフィックス

次へを選択して、②移行へ。
ここでは何も選択せずに次へ。
③有効期限では以下のように設定します。

現行バージョン チェック
以前のバージョン チェック
オブジェクトの現行バージョンを失効する チェック
次の後に「1」を設定
前のバージョンを完全に削除する チェック
次の後に「1」を設定

次へ進んで確認した上で保存します。
これで1日以上ったものは自動的に削除されていきます。

完了

これでようやく全ての設定完了です。
mail-slack-051
mail-slack-050
▲あとは設定したチャンネルをメールの宛先にしてメールを送信すると、Slackに連携されます。
うまくいかない時はCloudwatchLogsを見てエラーを確認してみてください。

メールをSlackに転送することでチェックする箇所が統一されるのがうれしい

今回紹介したどちらのやり方でやるにせよ、Slackを見ていれば必要な情報が入るようになります。
これで、メール通知が来たので、メール内容確認してたら、Slackで呼びかけられて、またSlack見るみたいなことが減ります。
全部Slack側に見えているので。
どういう流れでSlackを見るかだけに絞れるので結構楽ですよ。

気になっている方はぜひやってみてください。