

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 获取 Amazon SES SMTP 凭证
<a name="smtp-credentials"></a>

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

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

您的 SMTP 密码与您的 AWS 私有访问密钥不同。有关凭证的更多信息，请参阅[Amazon SES 凭证的类型](send-email-concepts-credentials.md)。

**注意**  
有关当前可用的 SMTP 端点的列表，请参阅 *AWS 一般参考* 中的 [SMTP 端点](https://docs.aws.amazon.com/general/latest/gr/ses.html#ses_smtp_endpoints)。

## 使用 SES 控制台获取 SES SMTP 凭证
<a name="smtp-credentials-console"></a>

**要求**  
IAM 用户可以创建 SES SMTP 凭证，但该用户的策略必须授予这些凭证使用 IAM 自身的权限，因为 SES SMTP 凭证是通过使用 IAM 创建的。您的 IAM 策略必须允许您执行以下 IAM 操作：`iam:CreateUser``iam:CreateGroup`、`iam:PutGroupPolicy`、`iam:AddUserToGroup`、和`iam:CreateAccessKey`。如果您尝试使用控制台创建 SES SMTP 证书，但您的 IAM 用户没有这些权限，则可能会看到错误，或者创建的 SMTP 证书可能是在没有正确策略设置的情况下创建的。

**重要**  
上面提到的某些 IAM 操作，特别是`iam:PutGroupPolicy`和`iam:AddUserToGroup`，具有[权限管理](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_understand-policy-summary-access-level-summaries.html#access_policies_access-level)访问权限级别，这是最高 IAM 级别，因为它允许在服务中授予或修改资源权限。因此，为了提高 AWS 账户的安全性，强烈建议您限制或定期监控这些包含权限管理访问级别分类的策略。

**创建 SMTP 凭证**

1. 登录 AWS 管理控制台 并打开 Amazon SES 控制台，网址为[https://console.aws.amazon.com/ses/](https://console.aws.amazon.com/ses/)。

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

1. 选择右上角的 **Create SMTP Credentials**（创建 SMTP 凭证）- IAM 控制台将打开。

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

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

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

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

1. 选择**返回 SES 控制台**。

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

您也可以使用 IAM 控制台来删除现有 SMTP 用户。要了解有关删除用户的更多信息，请参阅*《IAM 入门指南》*中的[管理 IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_manage.html)。

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

## 通过转换现有 AWS 凭证获取 SES SMTP 凭证
<a name="smtp-credentials-convert"></a>

如果您有使用 IAM 接口设置的用户，则可以从其证书中派生该用户的 SES SMTP AWS 证书。

**重要**  
不要使用临时 AWS 证书来获取 SMTP 证书。SES SMTP 接口不支持从临时安全凭证生成的 SMTP 凭证。

**使 IAM 用户能够使用 SES SMTP 接口发送电子邮件**

1. 按照以下步骤，使用本节中提供的算法，从用户的 AWS 凭据中派生出用户的 SMTP 凭据。

   由于您是从 AWS 凭据开始的，因此 SMTP 用户名与 AWS 访问密钥 ID 相同，因此您只需要生成 SMTP 密码即可。

1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在**访问管理**下，选择**策略**，然后选择**创建策略**。

1. 在**策略编辑器**中，选择 **JSON**，然后删除编辑器中的所有示例代码。

1. 将下面的策略粘贴到编辑器中。

------
#### [ JSON ]

****  

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

------

1. 选择**下一步**，然后在**策略名称**字段中输入 `AmazonSesSendingAccess`，接着选择**创建策略**。

1. 在**访问管理**下，选择**用户组**，然后选择**创建组**。

1. 在**用户组名称**字段中，输入 `AWSSESSendingGroupDoNotRename`。

1. 从**将用户添加到组**表中选择 SMTP 用户，即可将其添加到组中。

1. 附加之前创建的 `AmazonSesSendingAccess` 策略，方法是从**附加权限策略**表中选择该策略，然后选择**创建用户组**。

有关将 SES 与 IAM 搭配使用的更多信息，请参阅[Amazon SES 中的 Identity and Access Management](control-user-access.md)。

**注意**  
尽管您可以为任何 IAM 用户生成 SES SMTP 凭证，但我们建议您在生成 SMTP 凭证时创建单独的 IAM 用户。有关为何说这是为特定目的创建用户的最佳实践的原因的信息，请参阅 [IAM 最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAMBestPractices.html)。

以下伪代码显示了将私有访问 AWS 密钥转换为 SES SMTP 密码的算法。

```
 1. // Modify this variable to include your AWS secret access key
 2. key = "{{wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY}}";
 3.             
 4. // Modify this variable to refer to the AWS Region that you want to use to send email.
 5. region = "{{us-west-2}}";
 6.             
 7. // The values of the following variables should always stay the same.
 8. date = "11111111";
 9. service = "ses";
10. terminal = "aws4_request";
11. message = "SendRawEmail";
12. version = 0x04;
13. 
14. kDate = HmacSha256(date, "AWS4" + key);
15. kRegion = HmacSha256(region, kDate);
16. kService = HmacSha256(service, kRegion);
17. kTerminal = HmacSha256(terminal, kService);
18. kMessage = HmacSha256(message, kTerminal);
19. signatureAndVersion = Concatenate(version, kMessage);
20. smtpPassword = Base64(signatureAndVersion);
```

一些编程语言包括可用于将 IAM 秘密访问密钥转换为 SMTP 密码的库。本节包含一个代码示例，您可以使用该示例使用 Python 将私有访问 AWS 密钥转换为 SES SMTP 密码。

**注意**  
以下示例使用 Python 3.6 中推出的 **f-string**；如果使用较旧的版本，那么它们无法工作。
在以下示例中，SMTP\_REGIONS 列表仅是一个示例——您的实际区域列表可能更短或更长，具体取决于您计划在哪些区域发送电子邮件，因为您需要每个 AWS 区域的 SMTP 凭证。

------
#### [ 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)
    "eu-south-1",  # Europe (Milan)
    "eu-north-1",  # Europe (Stockholm)
    "sa-east-1",  # South America (Sao Paulo)
    "us-gov-west-1",  # AWS GovCloud (US)
    "us-gov-east-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 密码。

------

## 将 SMTP 用户从现有内联策略迁移到组策略（安全建议）
<a name="migrate-inline-policy-to-group"></a>

**重要**  
如果您在 2024 年 9 月 6 日之前创建了 SES SMTP 凭证，则已将内联策略和标签附加到您的 SMTP 用户。SES 不再使用内联策略，并出于安全建议，鼓励您也这样做。

在将 SMTP 用户从现有内联策略迁移到组策略之前，必须先创建一个具有 SES 权限策略的 IAM 用户组来取代内联策略。如果您已创建了此 IAM 用户组，或者它是从 2024 年 9 月 6 日起为您创建的 SMTP 凭证自动创建的，则可以直接跳到以下过程中的*步骤 10*。

**从现有内联策略迁移到托管组**

1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在**访问管理**下，选择**策略**，然后选择**创建策略**。

1. 在**策略编辑器**中，选择 **JSON**，然后删除编辑器中的所有示例代码。

1. 将下面的策略粘贴到编辑器中。

------
#### [ JSON ]

****  

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

------

1. 选择**下一步**，然后在**策略名称**字段中输入 `AmazonSesSendingAccess`，接着选择**创建策略**。

1. 在**访问管理**下，选择**用户组**，然后选择**创建组**。

1. 在**用户组名称**字段中，输入 `AWSSESSendingGroupDoNotRename`。

1. 从**将用户添加到组**表中选择 SMTP 用户，即可将其添加到组中。

1. 附加之前创建的 `AmazonSesSendingAccess` 策略，方法是从**附加权限策略**表中选择该策略，然后选择**创建用户组**。

   现在，您已使用 SES 权限策略创建了 IAM 用户组，您可以按照其余步骤中所述，将 SMTP 用户从其当前的内联策略迁移到该组策略。

1. 在**访问管理**下，选择**用户**，然后选择要迁移的 SMTP 用户。

1. 选择**组**选项卡，然后选择**将用户添加到多个组**。

1. 选择 `AWSSESSendingGroupDoNotRename` 组，然后选择**将用户添加到组**。

1. 选择**权限**选项卡，确认在**策略名称**列中列出的两行均显示 `AmazonSesSendingAccess`，其中一行在**通过如下方式附加**列中显示为*内联*，另一行显示为*组 `AWSSESSendingGroupDoNotRename`*。

1. 仅选择**策略名称**列包含 `AmazonSesSendingAccess` 且**通过如下方式附加**列显示为*内联*的行，然后选择**移除**，接着确认**移除策略**。

   验证**通过如下方式附加**列中显示为*组 `AWSSESSendingGroupDoNotRename`* 的行仍然存在。

1. 选择**标签**选项卡，然后选择**管理标签**。

1. 选择 “**键**” 列和 *SESConsole*“**值**” 列*InvokedBy*中包含的行旁边的 “**删除**”，然后选择 “**保存更改**”。

**重要**  
必须将 `AmazonSesSendingAccess` 策略（无论是作为内联策略还是组策略，或者两者兼有）保持附加到 SMTP 用户，以确保他们的发送不受影响。只有在将组策略附加到用户之后，才能移除内联策略。