Amazon Simple Email Service
开发人员指南

获取 Amazon SES SMTP 凭证

您需要 Amazon SES SMTP 用户名和密码才能访问 Amazon SES SMTP 接口。如果计划使用 SMTP 接口在多个 AWS 区域中发送电子邮件,您需获取各个区域中唯一的一组 SMTP 凭证。

重要

您的 SMTP 用户名和密码不同于您的 AWS 访问密钥 ID 和秘密访问密钥。有关凭证的更多信息,请参阅将凭证用于 Amazon SES

使用 Amazon SES 控制台获取 Amazon SES SMTP 凭证

当您使用 Amazon SES 控制台生成 SMTP 凭证时,Amazon SES 控制台会使用适当的策略创建一个 IAM 用户以调用 Amazon SES,并为您提供与该用户关联的 SMTP 凭证。

注意

虽然 IAM 用户可以创建 Amazon SES SMTP 凭证,但 IAM 用户的策略必须提供亲自使用 IAM 的权限,因为 Amazon SES SMTP 凭证是通过使用 IAM 创建的。您的 IAM 策略必须允许您执行以下 IAM 操作:iam:ListUsersiam:CreateUseriam:CreateAccessKeyiam: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. Create User for SMTP (为 SMTP 创建用户) 中,为 SMTP 用户键入一个名称。或者,您可以使用此字段中提供的默认值。完成后,选择 Create

    
                        为 SMTP 创建用户
  5. 选择 Show User SMTP Credentials。屏幕上将显示您的 SMTP 凭证。复制这些凭证并将其存储在安全位置。您也可以选择 Download Credentials,下载包含您的凭证的文件。

    
                        为 SMTP 创建用户

    重要

    只有在这个时候您才能查看您的 SMTP 凭证。我们建议您下载这些凭证并将它们保存在一个不会被删除的位置。如果您丢失这些凭证,则必须重新开始创建 SMTP 用户的过程。

  6. 选择 Close Window

如果需要删除 SMTP 凭证,请转到 IAM 控制台 (https://console.aws.amazon.com/iam/),然后删除与您的 SMTP 凭证对应的 IAM 用户名。要了解更多信息,请转至使用 IAM 指南。

如果需要更改您的 SMTP 密码,请转至 IAM 控制台,删除您的现有 IAM 用户,然后转到 Amazon SES 控制台重新生成您的 SMTP 凭证。

通过转换现有 AWS 凭证获取 Amazon SES SMTP 凭证

如果您已使用 IAM 接口设置一个 IAM 用户,则可从该用户的 AWS 凭证派生其 Amazon SES SMTP 凭证。

重要

请勿使用临时 AWS 凭证派生 SMTP 凭证。Amazon SES SMTP 接口不支持从临时安全凭证生成的 SMTP 凭证。

要使 IAM 用户能够使用 Amazon SES SMTP 接口发送电子邮件,您需要执行以下两个步骤:

  • 使用此部分中提供的算法,从用户的 AWS 凭证派生其 SMTP 凭证。由于您是从 AWS 凭证开始的,SMTP 用户名将与 AWS 访问密钥 ID 相同,因此您只需生成 SMTP 密码。

  • 将以下策略应用于 IAM 用户:

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

    有关将 Amazon SES 与 IAM 搭配使用的更多信息,请参阅 控制对 Amazon SES 的访问

注意

尽管您可以为任何 IAM 用户生成 Amazon SES SMTP 凭证,但我们建议您在生成 SMTP 凭证时创建单独的 IAM 用户。有关为何说这是为特定目的创建用户的最佳实践的原因的信息,请参阅 IAM 最佳实践

以下伪代码说明将 AWS 秘密访问密钥转换为 Amazon SES SMTP 密码的算法。

// Modify this variable to include your AWS Secret Access Key key = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"; // Modify this variable to refer to the AWS Region that you want to use to send email. region = "us-west-2"; // The values of the following variables should always stay the same. date = "11111111"; service = "ses"; terminal = "aws4_request"; message = "SendRawEmail"; versionInBytes = 0x04; kDate = HmacSha256(date, "AWS4" + key); kRegion = HmacSha256(region, kDate); kService = HmacSha256(service, kRegion); kTerminal = HmacSha256(terminal, kService); kMessage = HmacSha256(message, kTerminal); signatureAndVersion = Concatenate(versionInBytes, kMessage); smtpPassword = Base64(signatureAndVersion);

一些编程语言包括可用于将 IAM 秘密访问密钥转换为 SMTP 密码的库。此部分包含可用于通过 Python 将 AWS 秘密访问密钥转换为 Amazon SES SMTP 密码的代码示例。

Python
Python
#!/usr/bin/env python3 import hmac import hashlib import base64 import argparse # Values that are required to calculate the signature. These values should # never change. 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 calculateKey(secretAccessKey, region): signature = sign(("AWS4" + secretAccessKey).encode('utf-8'), DATE) signature = sign(signature, region) signature = sign(signature, SERVICE) signature = sign(signature, TERMINAL) signature = sign(signature, MESSAGE) signatureAndVersion = bytes([VERSION]) + signature smtpPassword = base64.b64encode(signatureAndVersion) print(smtpPassword.decode('utf-8')) def main(): parser = argparse.ArgumentParser(description='Convert a Secret Access Key for an IAM user to an SMTP password.') parser.add_argument('--secret', help='The Secret Access Key that you want to convert.', required=True, action="store") parser.add_argument('--region', help='The name of the AWS Region that the SMTP password will be used in.', required=True, choices=['us-east-1','us-west-2','eu-west-1'], action="store") args = parser.parse_args() calculateKey(args.secret,args.region) main()