IAM ユーザーのアクセスキーから Amazon SES SMTP 認証情報を生成してメール送信する

IAM ユーザーのアクセスキーから Amazon SES SMTP 認証情報を生成してメール送信する

2026.06.15

はじめに

Amazon SES では、SMTP 認証情報を新規作成すると、SMTP 接続用のユーザー名とパスワードが発行されます。

https://dev.classmethod.jp/articles/configured-smtp-authentication-settings-for-ses/

一方で、Amazon SES では、既存の IAM ユーザーに紐づく AWS 認証情報から、SMTP 認証情報を作成することもできます。
今回はこの方法を使って、既存の IAM ユーザーで Amazon SES の SMTP 送信を試してみます。

試してみた

前提条件

本記事では、以下の環境を前提としています。

  • Amazon SES に検証済み ID が存在すること
    • 例: example.com
  • 利用リージョンは東京リージョン(ap-northeast-1
  • IAM ユーザーのアクセスキーは発行済み
  • Python のバージョンは以下のとおり
$ python --version
Python 3.12.13

なお、Amazon SES アカウントがサンドボックス環境の場合、送信元だけでなく送信先メールアドレスも検証済みである必要があります。
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/request-production-access.html

IAM

1. 許可ポリシーを作成

SMTP 経由で Amazon SES からメールを送信するため、IAM ユーザーに ses:SendRawEmail を許可するポリシーを付与します。
今回は検証目的のため、以下のポリシーを作成しました。

AmazonSesSendingAccess
{
"Version":"2012-10-17",
    "Statement": [
        {
"Effect": "Allow",
            "Action": "ses:SendRawEmail",
            "Resource": "*"
        }
    ]
}

2. IAM ユーザーにアタッチ

上記の許可ポリシーを対象の IAM ユーザーにアタッチします。

E メール送信スクリプトを用意

公式ドキュメントに掲載されているスクリプトを参考に、以下のスクリプトを用意しました。

send-mail.sh
#!/bin/bash

# Prompt user to provide following information
read -p "Enter SMTP username: " SMTPUsername
read -p "Enter SMTP password: " SMTPPassword
read -p "Sender email address: " MAILFROM
read -p "Receiver email address: " RCPT
read -p "Email subject: " SUBJECT
read -p "Message to send: " DATA

echo

# Encode SMTP username and password using base64
EncodedSMTPUsername=$(echo -n "$SMTPUsername" | openssl enc -base64)
EncodedSMTPPassword=$(echo -n "$SMTPPassword" | openssl enc -base64)

# Construct the email
Email="EHLO example.com
AUTH LOGIN
$EncodedSMTPUsername
$EncodedSMTPPassword
MAIL FROM: $MAILFROM
RCPT TO: $RCPT
DATA
From: $MAILFROM
To: $RCPT
Subject: $SUBJECT

$DATA
.
QUIT"

echo "$Email" | openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.ap-northeast-1.amazonaws.com:587

スクリプトに実行権限を付与します。

$ chmod +x send-mail.sh 

SMTP 認証情報への変換

AWS シークレットアクセスキーを Amazon SES 用の SMTP パスワードへ変換します。
公式ドキュメントに掲載されている Python スクリプトを参考に、以下のスクリプトを用意しました。

smtp_credentials_generate.py
#!/usr/bin/env python3

import hmac
import hashlib
import base64
import argparse

SMTP_REGIONS = [
    "ap-northeast-1",  # Asia Pacific (Tokyo)
]

# These values are required to calculate the signature. Do not change them.
DATE = "11111111"
SERVICE = "ses"
MESSAGE = "SendRawEmail"
TERMINAL = "aws4_request"
VERSION = 0x04

def sign(key, msg):
    return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest()

def calculate_key(secret_access_key, region):
    if region not in SMTP_REGIONS:
        raise ValueError(f"The {region} Region doesn't have an SMTP endpoint.")

    signature = sign(("AWS4" + secret_access_key).encode("utf-8"), DATE)
    signature = sign(signature, region)
    signature = sign(signature, SERVICE)
    signature = sign(signature, TERMINAL)
    signature = sign(signature, MESSAGE)
    signature_and_version = bytes([VERSION]) + signature
    smtp_password = base64.b64encode(signature_and_version)
    return smtp_password.decode("utf-8")

def main():
    parser = argparse.ArgumentParser(
        description="Convert a Secret Access Key to an SMTP password."
    )
    parser.add_argument("secret", help="The Secret Access Key to convert.")
    parser.add_argument(
        "region",
        help="The AWS Region where the SMTP password will be used.",
        choices=SMTP_REGIONS,
    )
    args = parser.parse_args()
    print(calculate_key(args.secret, args.region))

if __name__ == "__main__":
    main()

上記のスクリプトを実行すると、変換された SMTP パスワードが出力されます。

$ python ~/smtp_credentials_generate.py <AWS_SECRET_ACCESS_KEY> ap-northeast-1
<SMTP_PASSWORD>

なお、IAM ロールや STS AssumeRole などで発行される一時的な認証情報は、Amazon SES の SMTP 認証情報として使用できません。
一時的な認証情報をもとに SMTP パスワードを生成しても、Amazon SES SMTP インターフェイスでは認証に使用できないためご注意ください。

重要
一時的な AWS 認証情報を使用して SMTP 認証情報を取得しないでください。SES SMTP インターフェイスは、一時的なセキュリティ認証情報から生成された SMTP 認証情報をサポートしていません。

変換後 SMTP 認証で送信

変換後の SMTP パスワードを使用して、SMTP 認証によるメール送信を行います。
用意した E メール送信スクリプトを実行して、送信します。

SMTP ユーザー名にはアクセスキー ID、SMTP パスワードには変換後の SMTP パスワードを入力します。

$ ./send-mail.sh
Enter SMTP username: AKIA****************
Enter SMTP password: <SMTP_PASSWORD>
Sender email address: sender@example.com
Receiver email address: recipient@example.net
Email subject: test-mail
Message to send: test

Connecting to <SES_SMTP_ENDPOINT_IP>
depth=2 C=US, O=Amazon, CN=Amazon Root CA 1
verify return:1
depth=1 C=US, O=Amazon, CN=Amazon RSA 2048 M01
verify return:1
depth=0 CN=email-smtp.ap-northeast-1.amazonaws.com
verify return:1
250 Ok
250-email-smtp.amazonaws.com
250-8BITMIME
250-AUTH PLAIN LOGIN
250 Ok
334 VXNlcm5hbWU6
334 UGFzc3dvcmQ6
235 Authentication successful.
250 Ok
250 Ok
354 End data with <CR><LF>.<CR><LF>
250 Ok <SES_MESSAGE_ID>

実行結果から、235 Authentication successful. により SMTP 認証が成功し、250 Ok <SES_MESSAGE_ID> により Amazon SES 側でメール送信が受け付けられたことを確認できました。

受信先のメールボックスでも、送信したメールを確認できました。
email_send

(おまけ) SMTP 認証情報へ変換しない場合の挙動

IAM ユーザーのシークレットアクセスキーを SMTP パスワードへ変換せず、そのまま SMTP 認証情報として使用してみます。

SMTP ユーザー名には同様にアクセスキー ID を指定し、一方で SMTP パスワードには AWS シークレットアクセスキーをそのまま入力します。
実行すると、以下のように SMTP 認証エラーが発生しました。

$ ./send-mail.sh
Enter SMTP username: AKIA****************
Enter SMTP password: <AWS_SECRET_ACCESS_KEY>
Sender email address: sender@example.com
Receiver email address: recipient@example.net
Email subject: test-mail
Message to send: test

535 Authentication Credentials Invalid

535 Authentication Credentials Invalidは、SMTP ユーザー名または SMTP パスワードが正しくない場合などに発生するエラーです。
https://repost.aws/ja/knowledge-center/ses-authentication-credentials-error

Amazon SES の SMTP 認証では、AWS のシークレットアクセスキーをそのまま SMTP パスワードとして使用することはできません。
既存の IAM アクセスキーを利用する場合は、Amazon SES 用の SMTP パスワードへ変換する必要があることが確認できました。

まとめと利用時の注意点

今回は、既存の IAM ユーザーのシークレットアクセスキーから Amazon SES 用の SMTP パスワードを生成し、SMTP 経由でメールを送信する方法を試してみました。

Amazon SES では、AWS 認証情報をもとに SMTP パスワードを生成できます。ただし、冒頭でも紹介したとおり、AWS ドキュメントでは、SMTP 認証情報用に専用の IAM ユーザーを作成することが推奨されています。

https://dev.classmethod.jp/articles/tsnote-ses-smtp-credentials/

そのため、本手順を利用する場合は、運用方針やセキュリティ要件を確認したうえでご検討ください。

とはいえ、要件や運用上の制約によっては、既存の IAM ユーザーの認証情報を利用したいケースもあると思います。この記事が、そのような場面で少しでも参考になれば幸いです。

参考情報

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事