AWS と LINE を連携させてbotを作ってみよう・メール転送編

LINE bot を使用すると LINE の会話内容をメールで転送することができます。
メールに転送することでメーラーによりフィルタをかけたり
エビデンスとしてバックアップをとったり、検索で絞り込んだり、何かと便利に利用できます。
そうなると業務にも取り入れやすく、お客様からの問い合わせにもLINEを導入しやすくなります。
自治体がLINEでの「いじめ相談」を開始した所、以前の数倍の相談があったそうです。
LINEを窓口に置くことは集客効果も高いと考えられますので、当botを機にしてみてください。
どういった流れで処理を行うのかを次の図で示します。
当記事は次の手順が一通り完了していることを前提に進めていきます。
・AWS と LINE を連携させてbotを作ってみよう・準備編
・AWS と LINE を連携させてbotを作ってみよう・Lambda編
Lambdaの関数を作成したところまで進めておいてください。
IAMロールの設定
前回の記事のままだとLambda関数にメールを送信する権限がありません。
Lambdaに割り当てたロールの権限を変更します。
管理コンソールから”IAM”を開き、”ロール” > Lambdaのロール > “ポリシーのアタッチ” へ進みます
一覧から”AdministratorAccess”を選択して”ポリシーのアタッチ”を押します。
ただし、こちらは非常に強い権限なので検証用には便利ですが、
本番で使用する際は”AmazonSESFullAccess”等、必要分だけのポリシーを選択してください。
権限を付けたので、不要な権限を”X”ボタンで削除します。
ロールが多いぶんには悪さはしないため、不要な権限を残しておいても大丈夫ではあります。
Lambdaで処理を作成
管理コンソールから”Lambda”を開き、LINE botから呼び出す関数を開いてください。
次に下記ソースを貼り付けて、LINEのメッセージをメールへ転送するようにします。
'use strict'; const line = require('@line/bot-sdk'); const AWS = require('aws-sdk'); AWS.config.update({region: 'eu-west-1'}); var ses = new AWS.SES(); var event; var context; var callback; exports.handler = (_event, _context, _callback) => { event = _event; context = _context; callback = _callback; main(); }; let main = function(err, account) { const client = new line.Client({ channelAccessToken: 'channelAccessToken' }); client.getProfile(event.events[0].source.userId) .then(email) .catch((err) => { console.log(err); callback(null, {}); }); }; let email = function(profile) { var params = { Destination: { ToAddresses: [ '送り先のメールアドレス' ] }, Message: { Body: { Text: { Data: event.events[0].message.text, Charset: 'utf-8' } }, Subject: { Data: profile.displayName + '(' + profile.userId + ')', Charset: 'utf-8' } }, Source: 'Fromメールアドレス' }; ses.sendEmail(params, function(err, data) { if (err) console.log(err, err.stack); else console.log(data); callback(null, {}); }); };
“channelAccessToken”は前回の記事でも使用したLINEのMessaging APIの設定画面からコピーしてきます。
“送信先のメールアドレス”はメールのToに当たるメールアドレスを設定してください。
“Fromメールアドレス”は送信者のメールアドレスを設定してください。
FromやToを動的にしたければDB化が必要になって来ますので、要望があればその場合の実装も公開したいと思います。
一番注意しなければいけないのは、”AWS.config.update({region: ‘eu-west-1’});”この部分になります。
現在、Amazon SESの使用できるリージョンが限られており、日本リージョンでは使用できません。
よって今回は例として”eu-west-1″欧州 (アイルランド)を指定しています。
処理の流れとしては”client.getProfile”で発言者のユーザー情報を取得します。
取得できる情報としては現在4つあります。
displayName 表示名
userId ユーザーID
pictureUrl 画像のURL
statusMessage ステータスメッセージ
今回は表示名とユーザーIDを使用してメールを構成していきます。
“ses.sendEmail”でメールを送信します。
引数にメールの内容を記載しますが、一番のポイントは送信するためのSMTPパスワード等が不要だという点です。
メールパスワード無しで送信できるなんて奇妙ですが、次の工程でメールアドレスの検証を行うため
FromアドレスをAmazonのメールサーバーが代弁してくれます。
メールアドレスの準備
送信用のメールアドレスをAmazon SESへ登録します。
Amazon SESの管理コンソールを開きます。
日本のリージョンではSESは使えないため、とりあえず”アイルランド”を選択します。
“Email Addresses” > “Verify a New Email Address” の順に進みます。
Fromメールアドレスに使用するアドレスを入力して”Verify This Email Address”で進みます。
すぐにAmazonからメールが届きます。
メールを開き、検証用のリンクを開きます。
メールアドレスがSESに登録され、”Status”が”verify”になっています。
これでひとまずメールアドレスをAmazon SESへ登録しましたが、
このままだと登録したメールアドレス宛てにしかメールが送れません。
FromとToに同じメールアドレスを指定することしかできないのです。
この状態を「サンドボックスの中にある状態」という表現がドキュメントに記載されていました。
目的によってはこれでも十分ですが、Toに色々指定できるようにする術もあるのでやってみましょう。
“Dedicated IPs” > “SES Sending Limits Increase case”の順に進みます
ケースの作成画面が開きますので次の値を設定して”送信”してください。
“内容”=”サービス制限増加”
“制限タイプ”=”SES送信制限”
“リージョン”=”欧州(アイルランド)”
“制限”=”希望する一日あたりの送信クォータ”
“新しい制限値”=”1000”
“メールの種類”=”システム通知”
他は適当で大丈夫そうです。
数時間すると返答がきますので気長に待ちます。。。
ドキュメントには1営業日かかりますと記載されていました。
一日あたりの送信クォータを”1,000″にするようリクエストしましたが”50,000″にしたと返答がありました。
これは”24時間辺り5万通のメール送信ができるようにした”という意味です。
この返答を受け取ることによってToアドレスに任意のメールアドレスを設定できるようになります。
この状態を「サンドボックスの外にある状態」と表現するようです。
サンドボックスの中なのか外なのかは、このサポートセンターの履歴を確認するか
実際にメールを送ってみるしか確認手段が無いようです。
これで全ての設定が終わりました。
確認
実際にLINEから発言し、メールが届くか試してみましょう。
メールを確認してみると、しっかり届いてます。
マスクしちゃっていますが、送信者にもしっかりFromアドレスが設定されています。
ただし、あくまでAmazonが送信したためメーラーによっては”amazonses.com経由”であると表示されるようです。
いかがだったでしょうか。
このbotを使用すれば、いままでメールだけで問い合わせ対応していた所も
LINEでの対応も十分に考慮できるのではないでしょうか。