目次Category
はじめに
今回は、Amazon SESを利用して、ECサイトから注文した際に注文確認メールを自動送信する仕組みを構築します。
Amazon SES(Amazon Simple Email Service)は、AWSが提供するメール送信サービスです。Webサービスやアプリケーションと連携することで、ユーザーの操作をきっかけにメールを自動送信できます。
今回はECサイトを想定し、商品と数量を選択して注文すると、注文内容を記載したメールが自動送信される構成を作成します。
今回の前提
今回はAmazon SESの基本的なメール送信の仕組みを確認するため、本稼働アクセスの申請は行わず、サンドボックス環境を利用します。
今回構築する全体像

ECサイトで商品と数量を選択して注文すると、API Gatewayへ注文情報を送信します。
Lambdaでは受け取った注文情報から注文番号とメール本文を作成し、Amazon SESを利用して検証済みメールアドレスへ注文確認メールを送信します。
各サービスの役割
| サービス | 役割 | ECサイトで例えると |
|---|---|---|
| Amazon API Gateway | HTMLから注文情報を受け取る | 注文受付 |
| AWS Lambda | 注文情報を処理してメール本文を作成する | 注文処理担当 |
| AWS IAM | LambdaにSESを利用する権限を与える | 利用許可 |
| Amazon SES | 注文確認メールを送信する | メール配信担当 |
Amazon SESの主な用途
- ・ECサイトの注文確認・発送完了メール
- ・会員登録完了メール
- ・パスワード再設定メール
- ・予約完了・予約確認メール
- ・システム通知
- ・キャンペーンやお知らせメール
Amazon SESのメリット
- ・Webサービスからメール送信を自動化できる
- ・大量のメール送信にも対応しやすい
- ・配信失敗やバウンスなどの送信状況を管理できる
- ・LambdaなどのAWSサービスと簡単に連携できる
- ・メールサーバーを自分で構築・管理する必要がない
構築手順
Step1 Amazon SESでメール送信の準備をする
① メールアドレスを検証する
設定内容
| 項目 | 設定内容 |
|---|---|
| IDタイプ | Eメールアドレス |
| Eメールアドレス | テストに使用するGmailなどの メールアドレス |
設定手順
- AWSマネジメントコンソールからAmazon SESを開きます。
- [設定]→[ID]を開きます。
- [IDの作成]をクリックします。
- IDタイプに[Eメールアドレス]を選択します。
- テストに使用するメールアドレスを入力します。
- [IDの作成]をクリックします。
- 届いた検証メールを開き、認証リンクをクリックします。
- SESに戻り、ステータスが[検証済み]になっていることを確認します。
② SES単体でメールを送信する
- 作成したIDを開きます。
- [テストEメールの送信]をクリックします。
- 認証済みメールアドレスを送信先に指定します。
- 件名と本文を入力します。
- テストメールを送信し、受信できることを確認します。
Step2 LambdaからSESでメールを送信する
次に、LambdaからAmazon SESを利用してメールを送信できるようにします。
この手順では、Lambda関数の作成、SESへの送信権限の追加、メール送信処理の実装、Lambda単体での動作確認を行います。
① Lambda関数を作成する
設定内容
| 項目 | 設定内容 |
|---|---|
| 関数名 | ses-mail-[name]-01 |
| ランタイム | Python |
| アーキテクチャ | x86_64 |
| 実行ロール | 基本的なLambdaアクセス権限で新しいロールを作成 |
設定手順
- AWSマネジメントコンソールからLambdaを開きます。
- [関数の作成]をクリックします。
- [一から作成]を選択します。
- 上記の設定内容を入力します。
- [関数の作成]をクリックします。
ポイント
- ・ この時点では、LambdaにAmazon SESを操作する権限は付与されていません。
- ・ 次の手順で、作成された実行ロールへSESのメール送信権限を追加します。
② SESへの送信権限を追加する
LambdaからAmazon SESを利用するため、Lambdaの実行ロールへメール送信権限を追加します。
設定手順
- 作成したLambda関数を開きます。
- [設定]→[アクセス権限]を開きます。
- [実行ロール]に表示されているロール名をクリックします。
- IAMのロール画面が開いたら、[許可を追加]→[インラインポリシーを作成]をクリックします。
- ポリシーエディタで[JSON]を選択します。
- 以下の内容を入力します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ses:SendEmail"
],
"Resource": "*"
}
]
}- [次へ]をクリックします。
- ポリシー名に
AllowSESSendEmailなど任意の名前を入力します。 - [ポリシーの作成]をクリックします。
ポイント
- ・ 今回はメール送信に必要な
ses:SendEmailのみを許可します。 - ・ これにより、LambdaからAmazon SESへメール送信を依頼できるようになります。
③ Lambdaにコードを設定する
Lambdaへ、注文情報を受け取り、Amazon SESから注文確認メールを送信する処理を設定します。
import json
import boto3
import uuid
ses = boto3.client(
"ses",
region_name="ap-northeast-1"
)
# SESで検証したメールアドレス
SENDER_EMAIL = "自分のメールアドレス"
RECIPIENT_EMAIL = "自分のメールアドレス"
def lambda_handler(event, context):
try:
body = json.loads(event.get("body", "{}"))
item = body.get("item")
quantity = body.get("quantity")
price = body.get("price")
total = body.get("total")
order_id = str(uuid.uuid4())[:8].upper()
mail_body = f"""
ご注文ありがとうございます。
以下の内容で注文を受け付けました。
------------------------------
注文番号:{order_id}
商品名:{item}
単価:{price}円
数量:{quantity}
合計金額:{total}円
------------------------------
このメールはAmazon SESハンズオンから
自動送信されています。
"""
ses.send_email(
Source=SENDER_EMAIL,
Destination={
"ToAddresses": [RECIPIENT_EMAIL]
},
Message={
"Subject": {
"Data": "ご注文ありがとうございます",
"Charset": "UTF-8"
},
"Body": {
"Text": {
"Data": mail_body,
"Charset": "UTF-8"
}
}
}
)
return {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": json.dumps({
"message": "注文を受け付けました",
"orderId": order_id
}, ensure_ascii=False)
}
except Exception as e:
print(e)
return {
"statusCode": 500,
"headers": {
"Content-Type": "application/json"
},
"body": json.dumps({
"message": "注文処理に失敗しました"
}, ensure_ascii=False)
}注意
以下の2か所は、Step1でAmazon SESに登録し、検証済みになったメールアドレスへ変更してください。
SENDER_EMAIL = "自分のメールアドレス"
RECIPIENT_EMAIL = "自分のメールアドレス"今回はSESのサンドボックス環境で動作確認するため、同じ検証済みメールアドレスを送信元・送信先として使用します。
コード内で行っている処理
- ・注文情報を取得する
- ・注文番号を生成する
- ・商品名・数量・金額からメール本文を作成する
- ・Amazon SESへメール送信を依頼する
- ・注文番号をレスポンスとして返す
コードの入力が完了したら、[Deploy]をクリックして変更内容を反映します。
④ Lambda単体で動作確認する
API Gatewayと接続する前に、LambdaからAmazon SESへ正常にメールを送信できることを確認します。
テスト手順
- Lambda関数の画面で[テスト]をクリックします。
- [新しいイベントを作成]を選択します。
- イベント名に
test-orderなど任意の名前を入力します。 - イベントJSONに以下を入力します。
{
"body": "{\"item\":\"Artisan Croissant\",\"quantity\":2,\"price\":480,\"total\":960}"
}- [保存]をクリックします。
- もう一度[テスト]をクリックしてLambdaを実行します。
確認する内容
- ・ Lambdaの実行結果が成功している
- ・ レスポンスの
statusCodeが200になっている - ・ レスポンスに注文番号が含まれている
- ・ 検証済みメールアドレスへ注文確認メールが届いている
- ・ 商品名・数量・単価・合計金額が正しく表示されている
Lambda
↓
Amazon SES
↓
注文確認メールポイント
- ・ ここでメールが届けば、LambdaとAmazon SESの連携は正常に動作しています。
- ・ API Gatewayを接続する前にLambda単体で確認することで、エラーが発生した際に原因を切り分けやすくなります。
Step3 API GatewayとECサイトを接続する
① HTTP APIを作成する
| 項目 | 設定内容 |
|---|---|
| API名 | ses-api-[name]-01 |
| 統合タイプ | Lambda |
| Lambda関数 | ses-mail-[name]-01 |
| メソッド | POST |
| リソースパス | /orders |
| ステージ | $default |
② CORSを設定する
| 項目 | 設定内容 |
|---|---|
| 許可するオリジン | * |
| 許可するヘッダー | content-type |
| 許可するメソッド | POST |
CORSとは
CORS(Cross-Origin Resource Sharing)は、異なるオリジン間でWebブラウザから通信する際に、アクセスを許可するための仕組みです。今回はLive Server上のHTMLからAPI GatewayへPOSTするために設定します。
③ ECサイトを準備する
今回はECサイト画面の作成に生成AIを利用します。
主な作成条件
- ・HTML / CSS / JavaScriptを1つの
index.htmlにまとめる - ・複数の商品から選択できる
- ・数量・単価・合計金額を表示する
- ・注文情報をAPI GatewayへPOSTする
- ・API Gatewayの呼び出しURLを画面から設定できる
- ・設定したURLを
localStorageに保存する - ・メールアドレスは入力せず、Lambda側で固定する
- ・Live Serverで動作確認できるようにする
④ API GatewayのURLをECサイトへ設定する
- API Gatewayの[呼び出しURL]をコピーします。
- VS CodeからLive Serverを起動します。
- ECサイト右上の[API設定]をクリックします。
- コピーした呼び出しURLを入力します。
- [保存して接続]をクリックします。
ポイント
- ・ API Gatewayの呼び出しURLは、ECサイトからAWSへ注文情報を送るための「送り先」です。
- ・ このURLを設定することで、
ECサイト → API Gateway → Lambdaがつながり、注文ボタンからAWS側の処理を実行できるようになります。
Step4 注文確認メールを送信する
- ECサイトから商品を選択します。
- 数量を指定します。
- [注文を確定してメール送信]をクリックします。
- 注文番号が表示されることを確認します。
- 検証済みメールアドレスへ注文確認メールが届くことを確認します。
実際のECサイトで利用する場合
今回のハンズオンでは、Amazon SESのサンドボックス環境を利用しています。
サンドボックス環境では、基本的に送信元・送信先の両方で検証済みのメールアドレスを使用する必要があります。 そのため今回は手順を簡単にするため、SESで検証した同じメールアドレスを送信元・送信先として使用しています。
【今回のハンズオン】
検証済みメールアドレス
↓ 送信元
Amazon SES
↓ 送信先
検証済みメールアドレス
(今回は同じアドレスを使用)一方、実際のECサイトでは、注文したユーザーのメールアドレスへ確認メールを送信する必要があります。
その場合は、ECサイトで入力されたメールアドレスを注文情報と一緒にLambdaへ渡し、そのメールアドレスをSESの送信先として使用する構成にします。
【実際のECサイト】
購入者
↓ メールアドレスを入力
ECサイト
↓ 注文情報+メールアドレス
API Gateway
↓
Lambda
↓
Amazon SES
↓
購入者のメールアドレスへ
注文確認メールを送信しかし、サンドボックス環境のままでは、購入者一人ひとりのメールアドレスを事前に検証する必要があるため、実際のサービスには向いていません。
本稼働アクセスへ移行すると
実際のサービスで一般ユーザーへメールを送信する場合は、Amazon SESで本稼働アクセスをリクエストし、サンドボックスから移行します。
本稼働環境では、送信先のメールアドレスを事前に検証する必要がなくなるため、ECサイトを利用した購入者へ注文確認メールを送信できるようになります。
| 項目 | サンドボックス | 本稼働 |
|---|---|---|
| 送信元 | 検証が必要 | 検証が必要 |
| 送信先 | 基本的に検証が必要 | 事前検証は不要 |
| 主な用途 | テスト・動作確認 | 実際のサービスでのメール送信 |
ポイント
今回のハンズオンではメール送信の仕組みを体験することが目的のため、サンドボックス環境のまま実施します。 実際に不特定のユーザーへメールを送信するサービスを構築する場合は、本稼働アクセスへの移行が必要になります。
作成したリソースを削除する
- API Gateway
- Lambda
- Lambda用IAMロール
- CloudWatch Logs
- SESの検証済みID(今後利用しない場合)
ブラウザに保存したAPI URLを削除する
- Live ServerでECサイトを開きます。
F12で開発者ツールを開きます。- [Application]→[Local storage]を開きます。
- Live ServerのURLを選択します。
sesHandsonApiUrlを右クリックし、[Delete]を選択します。
まとめ
今回は、Amazon SESを利用してECサイトから注文確認メールを自動送信する仕組みを構築しました。
- ・Amazon API GatewayでECサイトから注文情報を受け取る
- ・AWS Lambdaで注文情報を処理し、メール本文を作成する
- ・AWS IAMでLambdaにSESを利用する権限を付与する
- ・Amazon SESから注文確認メールを自動送信する
Amazon SES単体からメールを送信するだけでなく、API GatewayやLambdaと組み合わせることで、Webサイト上のユーザー操作をきっかけとしてメールを自動送信する仕組みを構築できます。
同じカテゴリーの記事
同じカテゴリの記事を読む