获取 Amazon SES SMTP 凭证 - Amazon Simple Email Service

获取 Amazon SES SMTP 凭证

您需要 Amazon SES SMTP 凭证才能访问 SES SMTP 接口。

您通过 SES SMTP 接口发送电子邮件所用的凭证在各个 AWS 区域中是唯一的。如果您使用 SES SMTP 接口在多个区域中发送电子邮件,那么您必须为计划使用的每个区域生成一组 SMTP 凭证。

您的 SMTP 密码与您的 AWS 秘密访问密钥不同。有关凭证的更多信息,请参阅Amazon SES 凭证的类型

注意

SMTP 端点目前在非洲(开普敦)、亚太地区(雅加达)、欧洲地区(米兰)、以色列(特拉维夫)、中东(巴林)不可用。

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

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

要求

IAM 用户可以创建 SES SMTP 凭证,但该用户的策略必须授予这些凭证使用 IAM 自身的权限,因为 SES SMTP 凭证是通过使用 IAM 创建的。您的 IAM 策略必须允许您执行以下 IAM 操作:iam:ListUsersiam:CreateUseriam:CreateAccessKeyiam:PutUserPolicy。如果您尝试使用控制台创建 SES SMTP 凭证,而您的 IAM 用户没有这些权限,那么您将看到一条错误消息,表明您的账户“无权执行 iam:ListUsers”。

创建 SMTP 凭证
  1. 登录AWS Management Console并打开 Amazon SES 控制台,网址为 https://console.aws.amazon.com/ses/

  2. 在左侧的导航窗格中选择 SMTP settings(SMTP 设置)- 这将打开 Simple Mail Transfer Protocol (SMTP) settings [简单邮件传输协议(SMTP)设置] 页面。

  3. 选择右上角的 Create SMTP Credentials(创建 SMTP 凭证)- IAM 控制台将打开。

  4. (可选)如果您需要查看、编辑或删除已创建的 SMTP 用户,请选择右下角的 Manage my existing SMTP credentials(管理我现有的 SMTP 凭证)-IAM 控制台将打开。按照以下步骤给出了用于管理 SMTP 凭证的详细信息。

  5. 为 SMTP 创建用户中,在 IAM 用户名字段中键入一个名称。或者,您可以使用此字段中提供的默认值。完成后,选择右下角的创建用户

  6. 选择 SMTP 密码下的显示 - 您的 SMTP 凭证显示在屏幕上。

  7. 通过选择下载 .csv 文件以下载这些凭证,或将其复制并存储在安全的位置,因为您在关闭此对话框之后无法查看或保存凭证。

  8. 选择返回 SES 控制台

您可以在 IAM 控制台的 Access management(访问管理)下查看使用此过程创建的 SMTP 凭证列表,并可以选择 Users(用户),然后使用搜索栏查找已分配 SMTP 凭证的所有用户。

您也可以使用 IAM 控制台来删除现有 SMTP 用户。要了解有关删除用户的更多信息,请参阅《IAM 入门指南》中的管理 IAM 用户

如果您要更改 SMTP 密码,请在 IAM 控制台中删除现有 SMTP 用户。然后,要生成一组新 SMTP 凭证,请完成前面的过程。

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

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

重要

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

要让 IAM 用户能够使用 SES SMTP 接口发送电子邮件,请执行以下操作。

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

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

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

    有关将 SES 与 IAM 搭配使用的更多信息,请参阅Amazon SES 中的 Identity and Access Management

注意

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

以下伪代码说明了将 AWS 秘密访问密钥转换为 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"; version = 0x04; kDate = HmacSha256(date, "AWS4" + key); kRegion = HmacSha256(region, kDate); kService = HmacSha256(service, kRegion); kTerminal = HmacSha256(terminal, kService); kMessage = HmacSha256(message, kTerminal); signatureAndVersion = Concatenate(version, kMessage); smtpPassword = Base64(signatureAndVersion);

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

注意

以下示例使用 Python 3.6 中推出的 f-string;如果使用较旧的版本,那么它们无法工作。

Python SDK(Boto3)目前正式支持 2.7 和 3.6(或更高版本)。然而,2.7 支持已被弃用,并且将在 2021 年 7 月 15 日删除,因此您需要至少升级到 3.6 版本。

Python
#!/usr/bin/env python3 import hmac import hashlib import base64 import argparse SMTP_REGIONS = [ "us-east-2", # US East (Ohio) "us-east-1", # US East (N. Virginia) "us-west-2", # US West (Oregon) "ap-south-1", # Asia Pacific (Mumbai) "ap-northeast-2", # Asia Pacific (Seoul) "ap-southeast-1", # Asia Pacific (Singapore) "ap-southeast-2", # Asia Pacific (Sydney) "ap-northeast-1", # Asia Pacific (Tokyo) "ca-central-1", # Canada (Central) "eu-central-1", # Europe (Frankfurt) "eu-west-1", # Europe (Ireland) "eu-west-2", # Europe (London) "sa-east-1", # South America (Sao Paulo) "us-gov-west-1", # AWS GovCloud (US) ] # 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 密码,请将前面的代码保存为 smtp_credentials_generate.py。然后,在命令行处,运行以下命令:

python path/to/smtp_credentials_generate.py wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY us-east-1

在上述命令中,执行以下操作:

  • path/to/ 替换为您保存 smtp_credentials_generate.py 的位置的路径。

  • wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY 替换为您要转换为 SMTP 密码的秘密访问密钥。

  • us-east-1 替换为您要与 SMTP 凭证一起使用的 AWS 区域。

当此脚本成功运行时,唯一的输出是您的 SMTP 密码。