AWS Lambda × Python でメールを送信する

AWS Lambdaと言えばFaaS(Function as A Service)の中で最も有名なサービスではないでしょうか。Node.jsやPython、Javaなどをサーバレスで実行できます。AWSの各種サービスと合わせることはもちろん、Customers Mail Cloudでメール送信を行うこともできます。今回はPython3.6系を使ってメール送信を行う方法を紹介します。

Customers Mail Cloudの設定

まずはCustomers Mail Cloudにて送信サーバの設定を行います。

ユーザ登録

ユーザ登録はまず、メールアドレスとパスワードを入力するところからはじまります。

f:id:moongift:20190510151017p:plain
ユーザ登録

入力したメールアドレス宛にメールアドレスの確認メール(仮登録受付メール)が届きますので、URLをクリックします。その後、名前や住所といった必要な情報を入力します。ユーザ登録が完了すると、無料トライアル開始のための審査が入ります。時間は長くとも30分程度です。「Customers Mail Cloud 無料トライアル利用開始のご案内」というメールが届いたら利用できます。

ログイン後に行うこと

ログインしたら、2つの作業を行う必要があります。

f:id:moongift:20190510150911p:plain
ダッシュボード

DKIMキーを設定する

DKIMキーはメールのなりすましを防止するための技術になります。メール配信を行うドメインのTXTレコードに対して設定します。管理コンソールでドメインを追加しようとすると、専用のキーが表示されます。

f:id:moongift:20190510150735p:plain
DKIMキーの取得

ドメインは s999999999999._domainkey.example.com のような形式になります。設定する値は v=DKIM1; p=MIG...QAB のように指定されるはずです。この設定はシステム管理者などに依頼して行ってもらってください。

DNS設定はすぐに反映されませんので、数分後にDNSを確認ボタンを押します。正しく設定されていれば、ドメインが追加登録できます。

ユーザを追加する

次にメール配信を行うユーザを追加します。これはAPI設定にて行います。ユーザ名(メールアドレス形式)、パスワードを設定します。また、利用できる機能を制限できます。例えばSMTPのみ、APIのみといった指定も可能です。

f:id:moongift:20190510150841p:plain
ユーザの追加

サーバに設定を反映する

設定を行ったら、それをサーバに反映します。サーバ構成機能にて行います。この反映を行わないと、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系です。

f:id:moongift:20190808104006p:plain
関数の作成

API Gatewayと連携する

Lambdaはそのままでは実行できないので、トリガーとしてAWS API Gatewayと合わせます。専用のURLが発行されますので、このURLにアクセスすることで、作成した関数が呼び出されます。今回は認証のいらないオープンなAPIとして作成しています。

f:id:moongift:20190808104035p:plain
API Gatewayをトリガーに設定

コードについて

デフォルトで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と組み合わせることで、サーバレスでのメール送信が簡単にできます。ぜひお試しください!

クラウドからのメール送信を簡単に。確実に。| Customers Mail Cloud