AWS Lambdaと言えばFaaS(Function as A Service)の中で最も有名なサービスではないでしょうか。Node.jsやPython、Javaなどをサーバレスで実行できます。AWSの各種サービスと合わせることはもちろん、Customers Mail Cloudでメール送信を行うこともできます。今回はPython3.6系を使ってメール送信を行う方法を紹介します。
Customers Mail Cloudの設定
まずはCustomers Mail Cloudにて送信サーバの設定を行います。
ユーザ登録
ユーザ登録はまず、メールアドレスとパスワードを入力するところからはじまります。
入力したメールアドレス宛にメールアドレスの確認メール(仮登録受付メール)が届きますので、URLをクリックします。その後、名前や住所といった必要な情報を入力します。ユーザ登録が完了すると、無料トライアル開始のための審査が入ります。時間は長くとも30分程度です。「Customers Mail Cloud 無料トライアル利用開始のご案内」というメールが届いたら利用できます。
ログイン後に行うこと
ログインしたら、2つの作業を行う必要があります。
DKIMキーを設定する
DKIMキーはメールのなりすましを防止するための技術になります。メール配信を行うドメインのTXTレコードに対して設定します。管理コンソールでドメインを追加しようとすると、専用のキーが表示されます。
ドメインは s999999999999._domainkey.example.com
のような形式になります。設定する値は v=DKIM1; p=MIG...QAB
のように指定されるはずです。この設定はシステム管理者などに依頼して行ってもらってください。
DNS設定はすぐに反映されませんので、数分後にDNSを確認ボタンを押します。正しく設定されていれば、ドメインが追加登録できます。
ユーザを追加する
次にメール配信を行うユーザを追加します。これはAPI設定にて行います。ユーザ名(メールアドレス形式)、パスワードを設定します。また、利用できる機能を制限できます。例えばSMTPのみ、APIのみといった指定も可能です。
サーバに設定を反映する
設定を行ったら、それをサーバに反映します。サーバ構成機能にて行います。この反映を行わないと、DKIMやユーザ追加設定が反映されませんので注意してください。ここまでで以下の情報が入手できているはずです。
- APIユーザ
- APIキー
さらにAPIサーバのエンドポイントURLが必要です。これは契約しているプランによって異なりますのでご注意ください。
プラン名 | エンドポイントURL |
---|---|
無料トライアル | https://sandbox.smtps.jp/api/v2/emails/send.json |
Standardプラン | https://te.smtps.jp/api/v2/emails/send.json |
Proプラン | https://SUBDOMAIN.smtps.jp/api/v2/emails/send.json |
これらの情報はメール送信時に設定しますので覚えておいてください。
AWS Lambdaで関数を作成する
AWSの管理画面にログインして、Lambdaで関数を作成します。選ぶのはPython3.6系です。
API Gatewayと連携する
Lambdaはそのままでは実行できないので、トリガーとしてAWS API Gatewayと合わせます。専用のURLが発行されますので、このURLにアクセスすることで、作成した関数が呼び出されます。今回は認証のいらないオープンなAPIとして作成しています。
コードについて
デフォルトでlambda_function.pyが用意されていますので、これを編集して実装していきます。
環境変数の設定
Lambdaでは環境変数が設定できます。今回は以下の3つを指定します。
環境変数名 | 値 |
---|---|
API_USER | APIユーザ名 |
API_KEY | APIキー |
ENDPOINT | APIのエンドポイントURL |
ライブラリの読み込み
今回は以下のライブラリを読み込みます。HTTPリクエスト用、JSONレスポンスの解析用、そして環境変数の読み込み用に使います。
import urllib.request # HTTPリクエスト処理 import json # JSON処理 import os # 環境変数処理
メール情報の準備
まずメールの内容を準備します。宛先はPOSTリクエスト時に指定できるようにします。
to_address = event['address'] to_name = event['name'] from_address = 'info@smtpd.jp' from_name = 'Mailer' subject = 'テストメール from Customers Mail Cloud' body = "こんにちは。\r\n\r\n改行を入れました。"
そしてAPIキーなどと合わせて、メール送信APIに必要な情報を組み立てます。
method = "POST" headers = { "Content-Type": "application/json", "Accept": "application/json" } data = { "api_user": os.getenv('API_USER'), "api_key": os.getenv('API_KEY'), "to": [{ "name": to_name, "address": to_address }], "from": { "name": from_name, "address": from_address }, "subject": subject, "text": body }
HTTPリクエスト実行
そしてHTTPリクエストを実行します。
json_data = json.dumps(data).encode("utf-8") request = urllib.request.Request(os.getenv('ENDPOINT'), data=json_data, method=method, headers=headers) try: with urllib.request.urlopen(request) as response: response_body = response.read().decode("utf-8") return { 'statusCode': 200, 'body': json.dumps(response_body) } except urllib.error.HTTPError as err: return { 'statusCode': 503, 'body': err.read() }
メール送信を試す
では実際にメールを送信してみます。
$ curl -X POST -H "Content-Type: application/json" \ -d '{"name":"テストカスタマー", "address":"user@stmpd.jp"}' \ https://nsb-api.ap-northeast-1.amazonaws.com/default/CustomersMailCloud
問題なければ以下のように結果が返ってきます。
{"id":"<2106857532.1251.1565150810829@mta02.sandbox.smtps.jp>"}
まとめ
AWSは機能が細かくに分かれているので慣れるまでは若干面倒ですが、カスタマイズできる範囲は大きいです。Customers Mail Cloudと組み合わせることで、サーバレスでのメール送信が簡単にできます。ぜひお試しください!