Amazon Simple Email Service
開発者ガイド

Amazon SES SMTP 認証情報の取得

Amazon SES SMTP インターフェイスにアクセスするには、Amazon SES SMTP のユーザー名とパスワードが必要です。すべての AWS リージョンで、同じ SMTP 認証情報セットを使用できます。

重要

SMTP ユーザー名およびパスワードは、AWS アクセスキー ID およびシークレットアクセスキーとは異なります。認証情報の詳細については、「Amazon SES での認証情報の使用」を参照してください。

SMTP 認証情報を生成するには、2 とおりの方法があります。SMTP 認証情報は、Amazon SES コンソールまたは AWS 認証情報を使用して生成できます。

以下の場合は、Amazon SES コンソールを使用して SMTP 認証情報を生成します。

  • 最も簡単な方法で SMTP 認証情報を取得したい。

  • コードまたはスクリプトを使用して SMTP 認証情報を自動的に生成する必要がない。

以下の場合は、AWS 認証情報から SMTP 認証情報を生成します。

  • IAM インターフェイスを使用して作成済みの AWS Identity and Access Management (IAM) ユーザーが存在し、このユーザーから Amazon SES SMTP インターフェイスを使用して E メールを送信できるようにしたい。

  • コードまたはスクリプトを使用して、SMTP 証明書の生成を自動化したい。

それぞれの方法の詳細については、「Amazon SES コンソールを使用した Amazon SES SMTP 認証情報の取得」および「AWS 認証情報を変換して Amazon SES SMTP 認証情報を取得する」を参照してください。

Amazon SES コンソールを使用した Amazon SES SMTP 認証情報の取得

Amazon SES コンソールを使用して SMTP 認証情報を生成する場合、Amazon SES コンソールは、Amazon SES を呼び出すための適切なポリシーを持った IAM ユーザーを作成した上で、そのユーザーに関連付けられている SMTP 認証情報を提示します。

注記

IAM ユーザーは Amazon SES SMTP 認証情報を作成できます。ただし、Amazon SES SMTP 認証情報の作成には IAM を使用するため、IAM ユーザーのポリシーによって IAM 自体を使用するアクセス許可をユーザーに付与する必要があります。IAM ポリシーで許可する必要がある IAM アクションは、iam:ListUsersiam:CreateUseriam:CreateAccessKey、および iam:PutUserPolicy です。Amazon SES SMTP 認証情報をコンソールで作成する場合、これらのアクセス許可が IAM ユーザーにないと、アカウントに「iam:ListUsers を実行する権限がない」いうエラーメッセージが表示されます。

SMTP 認証情報を作成するには

  1. AWS マネジメントコンソールにサインインして、Amazon SES コンソール (https://console.aws.amazon.com/ses/) を開きます。

  2. ナビゲーションペインで [SMTP Settings] を選択します。

  3. コンテンツペインで、[Create My SMTP Credentials] を選択します。

  4. [SMTP のユーザーを作成] で、SMTP ユーザーの名前を入力します。または、このフィールドに提供されているデフォルト値を使用できます。完了したら、[作成] を選択します。

     SMTP のユーザーを作成する
  5. [Show User SMTP Credentials] を選択します。SMTP 認証情報が画面に表示されます。これらの認証情報をコピーして安全な場所に保存します。[Download Credentials] を選択して、自身の認証情報を含むファイルをダウンロードすることもできます。

     SMTP のユーザーを作成する

    重要

    これは、SMTP 認証情報を確認できる唯一の機会です。これらの認証情報をダウンロードし、削除されない場所に保管することをお勧めします。これらの認証情報をなくすと、SMTP ユーザーの作成プロセスをやり直す必要があります。

  6. [Close Window] を選択します。

SMTP 認証情報を削除する場合は、https://console.aws.amazon.com/iam/ の IAM コンソールに移動し、SMTP 認証情報に対応する IAM ユーザー名を削除します。詳細については、ユーザーの削除 ガイドを参照してください。

SMTP パスワードを変更する場合は、IAM コンソールに移動して既存の IAM ユーザーを削除した上で Amazon SES コンソールに移動し、SMTP 認証情報を再生成します。

AWS 認証情報を変換して Amazon SES SMTP 認証情報を取得する

IAM インターフェイスを使用して IAM ユーザーを設定した場合、ユーザーの Amazon SES SMTP 認証情報は AWS 認証情報から派生できます。

重要

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

IAM ユーザーが Amazon SES SMTP インターフェイスを使用して E メールを送信できるようにするには、次の 2 つのステップを実行する必要があります。

  • SMTP 認証情報を AWS 認証情報から派生させるには、このセクションで示すアルゴリズムを使用します。AWS 認証情報から開始するため、SMTP ユーザー名は AWS アクセスキー ID と同じです。したがって、生成する必要があるのは SMTP パスワードのみです。

    重要

    Amazon SES コンソールを使用して SMTP 認証情報を生成する場合、SMTP ユーザー名は AWS アクセスキー ID とは異なります。このセクションで説明したように、プログラムから SMTP パスワードを生成する場合のみ、SMTP ユーザー名と AWS アクセスキー ID が同じになります。

  • IAM ユーザーに次のポリシーを適用します。

    { "Statement": [{ "Effect":"Allow", "Action":"ses:SendRawEmail", "Resource":"*" }]}

    IAM で Amazon SES を使用する方法については、「Amazon SES へのアクセスの制御」を参照してください。

注記

Amazon SES SMTP 認証情報はどの IAM ユーザーに対しても生成できますが、SMTP 認証情報用に別個の IAM ユーザーを作成することをお勧めします。目的別にユーザーを作成することが推奨される理由については、「IAM のベストプラクティス」を参照してください。

次の擬似コードでは、AWS シークレットアクセスキーを Amazon SES SMTP パスワードに変換するアルゴリズムを示します。

key = AWS Secret Access Key; message = "SendRawEmail"; versionInBytes = 0x02; signatureInBytes = HmacSha256(message, key); signatureAndVer = Concatenate(versionInBytes, signatureInBytes); smtpPassword = Base64(signatureAndVer);

OpenSSL を使用して、既存の IAM シークレットアクセスキーから SMTP パスワードを生成できます。OpenSSL はオープンソースのユーティリティ、およびすべてのオペレーティングシステムと互換性があります。Linux 、macOS、および Unix のほとんどのバージョンにデフォルトで搭載されており、Windows でも利用可能です。OpenSSL の詳細については、https://www.openssl.org を参照してください。OpenSSL を使用して SMTP パスワードを生成するには、コマンドラインで次のコマンドを入力します。$AWS_SECRET_ACCESS_KEY は IAM ユーザーのシークレットアクセスキーに置き換えてください。

(echo -en "\x02"; echo -n 'SendRawEmail' \ | openssl dgst -sha256 -hmac $AWS_SECRET_ACCESS_KEY -binary) \ | openssl enc -base64

一部のプログラミング言語に含まれているライブラリを使用して、IAM シークレットアクセスキーを SMTP パスワードに変換できます。このセクションのコード例では、Java または Python を使用して AWS シークレットアクセスキーを Amazon SES SMTP パスワードに変換します。OpenSSL がコンピュータにインストール済みである場合は、Bash スクリプトを使用して SMTP パスワードを生成することもできます。

以下の例を実行する前に、変換する AWS シークレットアクセスキーを環境変数 AWS_SECRET_ACCESS_KEY 内に配置します。コード例では、変換した SMTP パスワードを出力として渡します。このパスワードと SMTP ユーザー名 (AWS アクセスキー ID と同じ) が、Amazon SES SMTP 認証情報になります。

BashJavaPython
Bash
#!/usr/bin/env bash # These variables are required to calculate the SMTP password. VERSION='\x02' MESSAGE='SendRawEmail' # Check to see if OpenSSL is installed. If not, exit with errors. if ! [[ -x "$(command -v openssl)" ]]; then echo "Error: OpenSSL isn't installed." >&2 exit 1 # If OpenSSL is installed, check to see that the environment variable has a # length greater than 0. If not, exit with errors. elif [[ -z "${AWS_SECRET_ACCESS_KEY}" ]]; then echo "Error: Couldn't find environment variable AWS_SECRET_ACCESS_KEY." >&2 exit 1 fi # If we made it this far, all of the required elements exist. # Calculate the SMTP password. (echo -en $VERSION; echo -n $MESSAGE \ | openssl dgst -sha256 -hmac $AWS_SECRET_ACCESS_KEY -binary) \ | openssl enc -base64
Java
import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; public class SesSmtpCredentialGenerator { // Put your AWS secret access key in this environment variable. private static final String KEY_ENV_VARIABLE = "AWS_SECRET_ACCESS_KEY"; // Used to generate the HMAC signature. Do not modify. private static final String MESSAGE = "SendRawEmail"; // Version number. Do not modify. private static final byte VERSION = 0x02; public static void main(String[] args) { // Get the AWS secret access key from environment variable AWS_SECRET_ACCESS_KEY. String key = System.getenv(KEY_ENV_VARIABLE); if (key == null) { System.out.println("Error: Cannot find environment variable AWS_SECRET_ACCESS_KEY."); System.exit(0); } // Create an HMAC-SHA256 key from the raw bytes of the AWS secret access key. SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA256"); try { // Get an HMAC-SHA256 Mac instance and initialize it with the AWS secret access key. Mac mac = Mac.getInstance("HmacSHA256"); mac.init(secretKey); // Compute the HMAC signature on the input data bytes. byte[] rawSignature = mac.doFinal(MESSAGE.getBytes()); // Prepend the version number to the signature. byte[] rawSignatureWithVersion = new byte[rawSignature.length + 1]; byte[] versionArray = {VERSION}; System.arraycopy(versionArray, 0, rawSignatureWithVersion, 0, 1); System.arraycopy(rawSignature, 0, rawSignatureWithVersion, 1, rawSignature.length); // To get the final SMTP password, convert the HMAC signature to base 64. String smtpPassword = DatatypeConverter.printBase64Binary(rawSignatureWithVersion); System.out.println(smtpPassword); } catch (Exception ex) { System.out.println("Error generating SMTP password: " + ex.getMessage()); } } }
Python
import os #required to fetch environment varibles import hmac #required to compute the HMAC key import hashlib #required to create a SHA256 hash import base64 #required to encode the computed key import sys #required for system functions (exiting, in this case) # Fetch the environment variable called AWS_SECRET_ACCESS_KEY, which contains # the secret access key for your IAM user. key = os.getenv('AWS_SECRET_ACCESS_KEY',0) # These varibles are used when calculating the SMTP password. You shouldn't # change them. message = 'SendRawEmail' version = '\x02' # See if the environment variable exists. If not, quit and show an error. if key == 0: sys.exit("Error: Can't find environment variable AWS_SECRET_ACCESS_KEY.") # Compute an HMAC-SHA256 key from the AWS secret access key. signatureInBytes = hmac.new(key.encode('utf-8'),message.encode('utf-8'),hashlib.sha256).digest() # Prepend the version number to the signature. signatureAndVersion = version.encode('utf-8') + signatureInBytes # Base64-encode the string that contains the version number and signature. smtpPassword = base64.b64encode(signatureAndVersion) # Decode the string and print it to the console. print(smtpPassword.decode('utf-8'))