AWS

Amazon SESとLambdaを用いた注文確認メール送信

NEW 2026年8月26日

目次Category


はじめに

今回は、Amazon SESを利用して、ECサイトから注文した際に注文確認メールを自動送信する仕組みを構築します。

Amazon SES(Amazon Simple Email Service)は、AWSが提供するメール送信サービスです。Webサービスやアプリケーションと連携することで、ユーザーの操作をきっかけにメールを自動送信できます。

今回はECサイトを想定し、商品と数量を選択して注文すると、注文内容を記載したメールが自動送信される構成を作成します。

今回の前提

今回はAmazon SESの基本的なメール送信の仕組みを確認するため、本稼働アクセスの申請は行わず、サンドボックス環境を利用します。

今回構築する全体像

ECサイトで商品と数量を選択して注文すると、API Gatewayへ注文情報を送信します。

Lambdaでは受け取った注文情報から注文番号とメール本文を作成し、Amazon SESを利用して検証済みメールアドレスへ注文確認メールを送信します。

各サービスの役割

サービス役割ECサイトで例えると
Amazon API GatewayHTMLから注文情報を受け取る注文受付
AWS Lambda注文情報を処理してメール本文を作成する注文処理担当
AWS IAMLambdaにSESを利用する権限を与える利用許可
Amazon SES注文確認メールを送信するメール配信担当

Amazon SESの主な用途

  • ECサイトの注文確認・発送完了メール
  • 会員登録完了メール
  • パスワード再設定メール
  • 予約完了・予約確認メール
  • システム通知
  • キャンペーンやお知らせメール
  • Amazon SESのメリット

    • Webサービスからメール送信を自動化できる
    • 大量のメール送信にも対応しやすい
    • 配信失敗やバウンスなどの送信状況を管理できる
    • LambdaなどのAWSサービスと簡単に連携できる
    • メールサーバーを自分で構築・管理する必要がない

構築手順

Step1 Amazon SESでメール送信の準備をする

① メールアドレスを検証する

設定内容
項目設定内容
IDタイプEメールアドレス
Eメールアドレステストに使用するGmailなどの
メールアドレス
設定手順
  1. AWSマネジメントコンソールからAmazon SESを開きます。
  2. [設定]→[ID]を開きます。
  3. [IDの作成]をクリックします。
  4. IDタイプに[Eメールアドレス]を選択します。
  5. テストに使用するメールアドレスを入力します。
  6. [IDの作成]をクリックします。
  7. 届いた検証メールを開き、認証リンクをクリックします。
  8. SESに戻り、ステータスが[検証済み]になっていることを確認します。

② SES単体でメールを送信する

  1. 作成したIDを開きます。
  2. [テストEメールの送信]をクリックします。
  3. 認証済みメールアドレスを送信先に指定します。
  4. 件名と本文を入力します。
  5. テストメールを送信し、受信できることを確認します。

Step2 LambdaからSESでメールを送信する

次に、LambdaからAmazon SESを利用してメールを送信できるようにします。

この手順では、Lambda関数の作成、SESへの送信権限の追加、メール送信処理の実装、Lambda単体での動作確認を行います。

① Lambda関数を作成する

設定内容
項目設定内容
関数名ses-mail-[name]-01
ランタイムPython
アーキテクチャx86_64
実行ロール基本的なLambdaアクセス権限で新しいロールを作成
設定手順
  1. AWSマネジメントコンソールからLambdaを開きます。
  2. [関数の作成]をクリックします。
  3. [一から作成]を選択します。
  4. 上記の設定内容を入力します。
  5. [関数の作成]をクリックします。
ポイント
  • この時点では、LambdaにAmazon SESを操作する権限は付与されていません。
  • 次の手順で、作成された実行ロールへSESのメール送信権限を追加します。

② SESへの送信権限を追加する

LambdaからAmazon SESを利用するため、Lambdaの実行ロールへメール送信権限を追加します。

設定手順
  1. 作成したLambda関数を開きます。
  2. [設定]→[アクセス権限]を開きます。
  3. [実行ロール]に表示されているロール名をクリックします。
  4. IAMのロール画面が開いたら、[許可を追加]→[インラインポリシーを作成]をクリックします。
  5. ポリシーエディタで[JSON]を選択します。
  6. 以下の内容を入力します。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ses:SendEmail"
      ],
      "Resource": "*"
    }
  ]
}
  1. [次へ]をクリックします。
  2. ポリシー名に AllowSESSendEmail など任意の名前を入力します。
  3. [ポリシーの作成]をクリックします。
ポイント
  • 今回はメール送信に必要な 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へ正常にメールを送信できることを確認します。

テスト手順
  1. Lambda関数の画面で[テスト]をクリックします。
  2. [新しいイベントを作成]を選択します。
  3. イベント名に test-order など任意の名前を入力します。
  4. イベントJSONに以下を入力します。
{
  "body": "{\"item\":\"Artisan Croissant\",\"quantity\":2,\"price\":480,\"total\":960}"
}
  1. [保存]をクリックします。
  2. もう一度[テスト]をクリックしてLambdaを実行します。
確認する内容
  • Lambdaの実行結果が成功している
  • レスポンスの statusCode200 になっている
  • レスポンスに注文番号が含まれている
  • 検証済みメールアドレスへ注文確認メールが届いている
  • 商品名・数量・単価・合計金額が正しく表示されている
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サイトへ設定する

  1. API Gatewayの[呼び出しURL]をコピーします。
  2. VS CodeからLive Serverを起動します。
  3. ECサイト右上の[API設定]をクリックします。
  4. コピーした呼び出しURLを入力します。
  5. [保存して接続]をクリックします。
ポイント
  • API Gatewayの呼び出しURLは、ECサイトからAWSへ注文情報を送るための「送り先」です。
  • このURLを設定することで、ECサイト → API Gateway → Lambda がつながり、注文ボタンからAWS側の処理を実行できるようになります。

Step4 注文確認メールを送信する

  1. ECサイトから商品を選択します。
  2. 数量を指定します。
  3. [注文を確定してメール送信]をクリックします。
  4. 注文番号が表示されることを確認します。
  5. 検証済みメールアドレスへ注文確認メールが届くことを確認します。

実際のECサイトで利用する場合

今回のハンズオンでは、Amazon SESのサンドボックス環境を利用しています。

サンドボックス環境では、基本的に送信元・送信先の両方で検証済みのメールアドレスを使用する必要があります。 そのため今回は手順を簡単にするため、SESで検証した同じメールアドレスを送信元・送信先として使用しています。

【今回のハンズオン】

検証済みメールアドレス
        ↓ 送信元
    Amazon SES
        ↓ 送信先
検証済みメールアドレス
(今回は同じアドレスを使用)

一方、実際のECサイトでは、注文したユーザーのメールアドレスへ確認メールを送信する必要があります。

その場合は、ECサイトで入力されたメールアドレスを注文情報と一緒にLambdaへ渡し、そのメールアドレスをSESの送信先として使用する構成にします。

【実際のECサイト】

購入者
  ↓ メールアドレスを入力
ECサイト
  ↓ 注文情報+メールアドレス
API Gateway
  ↓
Lambda
  ↓
Amazon SES
  ↓
購入者のメールアドレスへ
注文確認メールを送信

しかし、サンドボックス環境のままでは、購入者一人ひとりのメールアドレスを事前に検証する必要があるため、実際のサービスには向いていません。

本稼働アクセスへ移行すると

実際のサービスで一般ユーザーへメールを送信する場合は、Amazon SESで本稼働アクセスをリクエストし、サンドボックスから移行します。

本稼働環境では、送信先のメールアドレスを事前に検証する必要がなくなるため、ECサイトを利用した購入者へ注文確認メールを送信できるようになります。

項目サンドボックス本稼働
送信元検証が必要検証が必要
送信先基本的に検証が必要事前検証は不要
主な用途テスト・動作確認実際のサービスでのメール送信

ポイント

今回のハンズオンではメール送信の仕組みを体験することが目的のため、サンドボックス環境のまま実施します。 実際に不特定のユーザーへメールを送信するサービスを構築する場合は、本稼働アクセスへの移行が必要になります。

作成したリソースを削除する

  1. API Gateway
  2. Lambda
  3. Lambda用IAMロール
  4. CloudWatch Logs
  5. SESの検証済みID(今後利用しない場合)

ブラウザに保存したAPI URLを削除する

  1. Live ServerでECサイトを開きます。
  2. F12で開発者ツールを開きます。
  3. [Application]→[Local storage]を開きます。
  4. Live ServerのURLを選択します。
  5. sesHandsonApiUrlを右クリックし、[Delete]を選択します。

まとめ

今回は、Amazon SESを利用してECサイトから注文確認メールを自動送信する仕組みを構築しました。

  • Amazon API GatewayでECサイトから注文情報を受け取る
  • AWS Lambdaで注文情報を処理し、メール本文を作成する
  • AWS IAMでLambdaにSESを利用する権限を付与する
  • Amazon SESから注文確認メールを自動送信する

Amazon SES単体からメールを送信するだけでなく、API GatewayやLambdaと組み合わせることで、Webサイト上のユーザー操作をきっかけとしてメールを自動送信する仕組みを構築できます。

この記事を書いた人

金山ゆう

yu_kanayama

26卒 AIクラウドセクション