

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

# 移动文本消息与 Amazon SNS
<a name="sns-mobile-phone-number-as-subscriber"></a>

**重要**  
《Amazon SNS 短信开发人员指南》已更新。Amazon SNS 已与 [AWS End User Messaging SMS](https://docs.aws.amazon.com/sms-voice/latest/userguide/what-is-service.html) 集成，用于传输短信。此指南包含有关如何创建、配置和管理 Amazon SNS 短信的最新信息。

Amazon SNS 移动文本消息（SMS）旨在协助将消息传输到各种平台，例如支持 SMS 的 Web、移动设备和业务应用程序。用户可以通过订阅主题向一个或多个电话号码发送消息，从而简化分发过程。

Amazon SNS 消息由传送 AWS End User Messaging SMS，这可确保可靠的消息传输。[在 Amazon SNS 中 APIs，您可以设置各种属性，例如消息类型（促销或交易）、[每月支出限额](sms_preferences.md#sms_preferences_console)、[退出列表](sms_manage.md#sms_manage_optout)和消息传输优化。](sms_preferences.md#sms_preferences_console)

AWS End User Messaging SMS 处理通过其全球短信供应网络向目标电话号码传输消息。它管理路线、传送状态以及对地区法规的遵守情况。要访问其他短信功能，例如精细权限、电话池、配置集、短信模拟器和国家/地区规则，请参阅《[AWS End User Messaging SMS User Guide](https://docs.aws.amazon.com/sms-voice/latest/userguide/configurations.html)》。

![\[说明 Amazon SNS 如何与之集成 AWS End User Messaging SMS 以可靠地发送移动短信。消息可以直接发送给个人收件人，也可以通过 Amazon SNS 主题分发给群组。 AWS End User Messaging SMS 处理其全球网络中的消息路由、传送和合规性，确保可扩展性和可靠性。此设置还允许配置留言首选项、管理支出限额和跟踪传送状态以优化 AWS SMS 消息传送。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/sns-sms-end-user-messaging.png)


以下关键特征可帮助您发送可扩展且易于扩展的 Amazon SNS 短信：

**[自定义消息首选项](sms_preferences.md)**  
根据您的预算和用例设置短信偏好设置， AWS 账户 从而为您自定义 SMS 发送方式。例如，您可以选择消息是优先考虑成本效率还是可靠传输。

**[设置支出配额](channels-sms-awssupport-spend-threshold.md)**  
通过以下方法定制短信传输：为各个消息传输指定支出配额以及为您的 AWS 账户指定每月支出配额。在当地法律和法规（例如美国和加拿大）要求的情况下，短信收件人可以选择[退出](sms_manage.md#sms_manage_optout)，这意味着他们可以选择停止接收来自您的短信。 AWS 账户收件人选择不接收消息后，您可以在某些限制条件下重新加入该电话号码，以便继续发送消息。

**[在全球范围内发送短信](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers-sms-by-country.html)**  
Amazon SNS 在多个区域内均支持短信收发功能，让您可以向 240 多个国家和地区发送消息。

## Amazon SNS 如何传送我的短信？
<a name="sns-sms-pinpoint-integration"></a>

当您请求 Amazon SNS 代表您发送短信时，将使用 AWS End User Messaging SMS分派消息。Amazon SNS 和 Amazon SNS 之间的集成 AWS End User Messaging SMS 具有以下好处：

**[IAM 政策](sns-mobile-phone-number-getting-started.md#sns-mobile-phone-number-prerequisites)**  
您可以利用 IAM 和资源策略在其他 AWS 服务和区域之间控制和分配对您的 SMS 资源的访问权限。

**[AWS End User Messaging SMS 配置](https://docs.aws.amazon.com/sms-voice/latest/userguide/configurations.html)**  
所有与起源 ID 相关的配置（创建、配置更新、配置新来源 IDs、更改注册模板）都使用。 AWS End User Messaging SMS

**[AWS End User Messaging SMS 计费](https://aws.amazon.com/sns/sms-pricing/)**  
不过，所有短信计费都已完成 AWS End User Messaging SMS。您可以整合用于短信工作负载的 AWS 支出，同时在一个中心位置采购和管理短信资源。

# 开始使用 Amazon SNS 短信
<a name="sns-mobile-phone-number-getting-started"></a>

**重要**  
《Amazon SNS 短信开发人员指南》已更新。Amazon SNS 已与 [AWS End User Messaging SMS](https://docs.aws.amazon.com/sms-voice/latest/userguide/what-is-service.html) 集成，用于传输短信。此指南包含有关如何创建、配置和管理 Amazon SNS 短信的最新信息。

本主题将指导您管理您的 SMS 沙箱，以及配置 IAM 和基于资源的策略，以授予 Amazon SNS 访问和使用所需的权限。 AWS End User Messaging SMS APIs

## 先决条件
<a name="sns-mobile-phone-number-prerequisites"></a>

Amazon SNS 建议更新您的 IAM 策略，使其包含以下操作，以确保对您的 Amazon SNS 资源的全面控制和可见性：
+ [`AmazonSNSFullAccess`](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonSNSFullAccess)
+ [`AmazonSNSReadOnly`](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonSNSReadOnlyAccess) 

# 使用 Amazon SNS 短信沙盒
<a name="sns-sms-sandbox"></a>

新创建的 Amazon SNS 短信账户会自动放入短信沙盒，通过降低欺诈和滥用风险来确保 AWS 客户和接收者的安全。此环境是用于测试和开发目的的安全空间。在短信沙盒中操作时，您可以访问所有 Amazon SNS 特征，但要遵守某些限制：
+ 您只能将短信发送到已验证的目的地电话号码。
+ 您最多可以有 10 个已验证的目标电话号码。
+ 您只能在验证或上次验证尝试后至少 24 小时删除目标电话号码。

当您的账户移出沙盒时，这些限制将被删除，您可以向任何收件人发送短信。

## 初始步骤
<a name="sns-mobile-phone-number-getting-started-steps"></a>

新的 Amazon SNS 短信账户被置于短信沙盒中。使用以下步骤在沙盒中创建和管理电话号码、创建发起号码和发件人 ID 并注册您的公司。

1. 将**目标电话号码**添加到短信沙盒。有关添加、管理电话号码和将其移出 Amazon SNS 短信沙盒的详细信息，请参阅 [在 Amazon SNS 短信沙盒中添加和验证电话号码](sns-sms-sandbox-verifying-phone-numbers.md)。

1. 创建**发起身份**，该身份是您向收件人发送短信后，他们在其设备上看到的身份。要了解有关发起身份的更多信息，包括您可以使用的不同类型，请参阅[Amazon SNS 短信的发起身份](channels-sms-originating-identities.md)文档。

1. **注册**您的公司。某些国家/地区要求您注册公司的身份，以便能够购买电话号码或发件人 ID，并查看您发送给所在国家/地区的收件人的消息。有关哪些国家/地区需要注册的信息，请参阅《AWS End User Messaging SMS User Guide》**中 [Supported countries and regions for SMS messaging with AWS End User Messaging SMS](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers-sms-by-country.html)。

1. 将您的消息**发送**到主题或手机。有关更多信息，请参阅 [使用 Amazon SNS 发送短信](sms_sending-overview.md)。

# 在 Amazon SNS 短信沙盒中添加和验证电话号码
<a name="sns-sms-sandbox-verifying-phone-numbers"></a>

必须先完成以下设置步骤，然后才能开始 AWS 账户 在[短信沙箱](sns-sms-sandbox.md)中发送 SMS 消息。这样可以确保您的账户已准备好发送短信，并且您的目的地电话号码已得到正确验证。

1. 创建**[源 ID](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-number-types.html)**。与短信沙盒中不包含的账户类似，您需要源 ID 才能向位于某些国家或地区的接收者发送短信。

1. 在短信沙盒中添加要向其发送消息的**目的地电话号码**。

1. 验证**电话号码**，确保目的地电话号码可以有效用于短信收发。

**添加和验证目的地电话号码**

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 在控制台菜单中，选择[支持短信收发的区域](https://docs.aws.amazon.com/general/latest/gr/end-user-messaging.html)。

1. 在导航窗格中，选择**文本消息(SMS)**。

1. 在**沙盒目的地电话号码**部分，选择**添加电话号码**。

1. 在**目的地详细信息**下，提供以下信息，然后选择**添加电话号码**：
   + 目的地的**国家/地区代码**和**电话号码**。
   + 您希望发送的验证消息使用的**语言**。

1. 添加电话号码后，Amazon SNS 将向提供的目的地电话号码发送 OTP。验证需要使用此 OTP。

1. 您将在提供的**目的地电话号码**上收到标准短信形式的 OTP。
   + 如果您在 15 分钟内没有收到 OTP，请在 Amazon SNS 控制台中选择**重新发送验证**。
   + 在 24 小时内，您最多可以重发五次 OTP。

1. 收到 OTP 后，将其输入到**验证码**框中，然后选择**验证电话号码**。

1. 检查**验证状态**。
   + 成功验证电话号码后，该电话号码及其验证状态将显示在**沙盒目的地电话号码**部分。
   + 如果验证状态为**待处理**，说明验证未成功。例如，如果您没有正确输入国家/地区代码，则可能会发生这种情况。
   + 您只能在上次验证尝试发生 24 小时或更长时间后，删除待处理或已验证的电话号码。

1. 如果您希望在其他区域使用相同的目的地电话号码，请对要使用该号码的每个区域**重复**上述步骤。

## 未收到 OTP 短信疑难解答
<a name="sns-sms-sandbox-troubleshooting-phone-numbers"></a>

排查可能导致电话号码无法接收 OTP 短信的常见问题。
+ **Amazon SNS 短信支出限额：**如果您的 AWS 账户 已超过发送短信的支出限额，则在提高限额或解决账单问题之前，可能无法发送更多消息，包括 OTP 短信。
+ **未选择接收短信通知的电话号码：**在某些国家或地区，收件人必须选择接收来自短代码的短信，短代码通常用于 OTP 短信。如果收件人的电话号码未被选中，他们将不会收到 OTP 短信。
+ **运营商限制或过滤：**某些移动运营商可能设置了限制或过滤机制，阻止发送某些类型的短信，包括 OTP 短信。这可能是由于运营商实施的安全策略或反垃圾邮件措施所致。
+ **电话号码无效或不正确：**如果收件人提供的电话号码不正确或无效，OTP 短信将无法送达。
+ **网络问题：**临时的网络问题或中断可能会导致无法向收件人的手机发送短信（包括 OTP 短信）。
+ **延迟传送：**在某些情况下，由于网络拥塞或其他因素，短信可能会延迟传送。OTP 短信最终可能会送达，但可能会延迟到预期的时间范围之外。
+ **账户暂停或终止：**如果您的账户存在问题 AWS 账户，例如未付款或违反服务 AWS 条款，则可能会暂停或终止 Amazon SNS 消息功能，包括 OTP 短信。

# 从 Amazon SNS 短信沙盒中删除电话号码
<a name="sns-sms-sandbox-deleting-phone-numbers"></a>

您可以从[短信沙盒](sns-sms-sandbox.md)中删除待处理和已验证的目标电话号码。

**重要**  
您只能在[验证电话号码](sns-sms-sandbox-verifying-phone-numbers.md)后等待 24 小时，或者在您最后一次验证尝试后等待 24 小时再删除电话号码。

**要从 SMS 沙盒中删除目标电话号码**

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 在控制台菜单中，选择您在其中添加了目标电话号码的[支持短信收发的区域](https://docs.aws.amazon.com/general/latest/gr/end-user-messaging.html)。

1. 在导航窗格中，选择**文本消息（SMS）**。

1. 在**移动文本消息（SMS）**页面上，前往**沙盒目标电话号码**部分。

1. 选择要删除的特定电话号码，然后选择**删除电话号码**。

1. 要确认您要删除电话号码，请输入 **delete me**，然后选择 **Delete**（删除）。

   请确保自您验证或尝试验证目标电话号码以来已过去 24 小时或更长时间，然后再继续删除。

1. 在添加目标电话号码但不再计划使用它的每个区域中重复这些步骤。

# 移出 Amazon SNS 短信沙盒
<a name="sns-sms-sandbox-moving-to-production"></a>

要 AWS 账户 退出 [SMS 沙箱](sns-sms-sandbox.md)，必须先添加、验证和测试目标电话号码。完成此操作后，使用创建案例 AWS 支持。

**请求将您的 AWS 账户移出短信沙箱**

1. **验证电话号码**

   1. 当您在短信沙箱中 AWS 账户 时，打开 [Amazon SN](https://console.aws.amazon.com/sns/home) S 控制台。

   1. 在导航窗格中的“移动”下方，选择**文本消息（短信）**。

   1. 在沙盒目标电话号码部分，[添加和验证](sns-sms-sandbox-verifying-phone-numbers.md)一个或多个目标电话号码。此验证可确保您可以成功发送和接收消息。

1. **测试短信发布**

   1. 确认您可以将消息发送到至少一个已验证的目标电话号码并接收消息。有关如何发布短信的更多详细说明，请参阅[使用 Amazon SNS 向手机发布短信](sms_sending-overview.md#sms_publish-to-phone)。

1. **启动沙盒编辑**

   1. 在 Amazon SNS 控制台的 **Mobile text messaging (SMS)**（移动文本消息 (SMS)）页面上，在 **Account information**（账户信息）下，选择 **Exit SMS sandbox**（退出 SMS 沙盒）。此操作会将您重定向到 [Amazon Support Center](https://support.console.aws.amazon.com/support/home?#/case/create?issueType=service-limit-increase)，并在选择**增加服务配额**选项的情况下自动创建支持案例。

1. **填写表单**

   1. 在支持表单中的**增加服务配额**下，执行以下操作：

     1. 选择 **SNS 文本消息**作为服务。

     1. 提供您打算从中发送短信的**网站 URL** 或**应用程序名称**。

     1. 指定您将发送的消息的类型：**一次性密码**、**促销消息**或**事务性消息**。

     1. 选择您要从中发送短信的 **AWS 区域**。

     1. 列出您计划向其发送短信的**国家**或**地区**。

     1. 描述您的客户如何**选择接收消息**。

     1. 包含您打算使用的所有**消息模板**。

1. **指定配额和区域**

   1. 在 **Requests (请求)** 下，执行以下操作：

     1. 选择你要移动**AWS 区域**的地方 AWS 账户。

     1. 对于**资源类型**，选择**一般限制**。

     1. 对于**配额**，选择**退出短信沙盒**。

     1. （可选）要申请额外增加配额或其他调整，请选择**添加其他请求**并指定必要的详细信息。

     1. 对于**新限额值**，输入您要申请的**限制**（以 USD 为单位）。

1. **其他详细信息**

   1. 在**案例描述**中，提供与您的请求相关的所有其他详细信息。

   1. 在**联系选项**下，然后选择您的**首选联系语言**。

1. **提交请求**

   1. 选择**提交**将请求发送到 支持。

 支持 团队会在 24 小时内对您的请求做出初步回应。

为了防止我们的系统被用于发送未经请求或恶意的内容，我们要仔细考虑每个请求。如果我们可以，我们将在 24 小时内准予您的请求。但是，如果我们需要从您那里获得其他信息，则可能需要更长的时间来解决您的请求。

如果您的使用案例与我们的策略不符，我们可能无法准予您的请求。

# Amazon SNS 短信的发起身份
<a name="channels-sms-originating-identities"></a>

**重要**  
《Amazon SNS 短信开发人员指南》已更新。Amazon SNS 已与 [AWS End User Messaging SMS](https://docs.aws.amazon.com/sms-voice/latest/userguide/what-is-service.html) 集成，用于传输短信。此指南包含有关如何创建、配置和管理 Amazon SNS 短信的最新信息。

短信的发起身份是用于表示短信发件人的标识符。您可以使用以下类型的发起身份向您的收件人标识自己的身份：

**起源号码**  
一个数字字符串，用于标识 SMS 消息发件人的电话号码。发起号码有几种类型，包括长代码（通常包含 10 位或更多位数字的标准电话号码）、10 位数字的长代码（10DLC）、免费电话号码（TFN）和短代码（包含四到七位数字的电话号码）。  
在当地法律要求使用发件人 IDs 代替发件人号码的国家/地区，不提供对发件人号码的支持。当您使用源号码发送 SMS 消息时，收件人的设备将源号码显示为发件人的电话号码。您可以按使用案例指定不同的源号码。  
有关更多信息，请参阅《AWS End User Messaging SMS User Guide》**中的 [Phone numbers](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers.html)。  
要查看您 AWS 账户中所有现有来源编号的列表，请在 [Amazon SNS](https://console.aws.amazon.com/sns/home) 控制台的导航窗格中，**选择**来源编号。

**发件人 IDs**  
一个字母名称，用于标识 SMS 消息发件人。当您使用发件人 ID 发送短信，并且收件人位于支持发件人 ID 身份验证的区域时，在收件人的设备上会显示您的发件人 ID 而不是电话号码。发件人 ID 可以向 SMS 收件人提供比电话号码、长代码或短代码所能提供的更多的发送人信息。  
全球多个国家和地区 IDs 都支持发件人。在有些地方，如果您是一个商家，若要向个人客户发送短信，则必须使用事先在监管机构或行业组注册的发件人 ID。有关支持或要求发件人的国家和地区的完整列表 IDs，请参阅*AWS End User Messaging SMS 用户指南 AWS End User Messaging SMS*中的[支持短信发送的国家和地区](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers-sms-by-country.html)。  
使用发件人不收取额外费用 IDs。但是，对于发件人 ID 身份验证的支持和要求因国家/地区而异。一些主要市场（包括加拿大、中国和美国）不支持使用 IDs发件人。有些区域要求向个人客户发送 SMS 消息的公司必须使用事先在监管机构或行业组注册的发件人 ID。  
有关更多信息，请参阅*AWS End User Messaging SMS 用户指南 IDs*中的[发件人](https://docs.aws.amazon.com/sms-voice/latest/userguide/sender-id.html)。

# 在 Amazon SNS 中配置短信收发
<a name="channels-sms-configurations"></a>

**重要**  
《Amazon SNS 短信开发人员指南》已更新。Amazon SNS 已与 [AWS End User Messaging SMS](https://docs.aws.amazon.com/sms-voice/latest/userguide/what-is-service.html) 集成，用于传输短信。此指南包含有关如何创建、配置和管理 Amazon SNS 短信的最新信息。

您可以使用 Amazon SNS 短信中的配置来设置 SMS 首选项以满足您的要求，例如调整支出配额和设置传输状态日志记录。本主题还详细介绍了如何使用 Amazon SNS 控制台和 AWS SDK 向主题发布短信、如何高效处理配额以及如何检索短信活动的详细统计数据。

# 使用 Amazon SNS 发送短信
<a name="sms_sending-overview"></a>

本节介绍如何使用 Amazon SNS 发送短信，包括发布到主题、订阅话题的电话号码、设置消息的属性以及直接发布到手机。

## 将短信发布到 Amazon SNS 主题
<a name="sms_publish-to-topic"></a>

您可以通过使用多个电话号码订阅 Amazon SNS 主题，一次将一条 SMS 消息发布至这些手机号码。SNS 主题是您可以添加订阅者并随后向所有订阅者发布消息的通信渠道。订阅者会收到发布到该主题的所有消息，直到您取消订阅或订阅者选择不接收来自您的 AWS 账户的 SMS 消息。

### 使用 AWS 控制台向主题发送消息
<a name="sms_publish-to-topic_console"></a>

**要创建主题，请执行以下操作**

如果您还没有要发送 SMS 消息的主题，请完成以下步骤。

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 在控制台菜单中，选择[支持短信收发的区域](https://docs.aws.amazon.com/general/latest/gr/end-user-messaging.html)。

1. 在导航窗格中，选择**主题**。

1. 在 **Topics**（主页）页面上，选择 **Create topic**（创建主题）。

1. 在 **Create topic**（创建主题）页面上的 **Details**（详细信息）下，执行以下操作：

   1. 对于 **Type**（类型），选择 **Standard**（标准）。

   1. 对于 **Name**（名称），输入一个主题名称。

   1. （可选）对于 **Display name**（显示名称），请为您的 SMS 消息输入自定义前缀。在您向主题发送消息时，Amazon SNS 会在显示名称之前加上右尖括号 (>) 和空格。显示名称不区分大小写，Amazon SNS 会将显示名称转换为大写字符。例如，如果主题的显示名称是 `MyTopic`，而消息是 `Hello World!`，则该消息会显示为：

      ```
      MYTOPIC> Hello World!
      ```

1. 选择**创建主题**。主题的名称和 Amazon Resource Name (ARN) 显示在 **Topics**（主题）页面。

**创建 SMS 订阅**

您可以使用订阅通过仅向主题发布一次消息，将 SMS 消息发送给多个收件人。
**注意**  
当您开始使用 Amazon SNS 发送短信时，您的 AWS 账户处于*短信*沙箱中。SMS 沙盒为您提供了一个安全的环境，让您可以尝试 Amazon SNS 功能，而不会拿您作为 SMS 发件人的声誉冒险。在您的账户位于 SMS 沙盒时，您可以使用 Amazon SNS 的所有功能，但您只能向已验证的目标电话号码发送 SMS 消息。有关更多信息，请参阅 [使用 Amazon SNS 短信沙盒](sns-sms-sandbox.md)。

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 在导航窗格中，选择**订阅**。

1. 在**订阅**页面上，选择**创建订阅**。

1. 在 **Create subscription**（创建订阅）页面上的 **Details**（详细信息）下，执行以下操作：

   1. 对于 **Topic ARN**（主题 ARN），输入或选择要向其发送 SMS 消息的主题的 Amazon Resource Name (ARN)。

   1. 对于 **Protocol**（协议），选择 **SMS**。

   1. 对于 **Endpoint**（终端节点），输入要订阅主题的电话号码。

1. 选择**创建订阅**。订阅信息显示在 **Subscriptions**（订阅）页面。

   要添加更多电话号码，请重复以下步骤。您还可以添加其他类型的订阅，例如电子邮件。

**发送邮件**

当您向一个主题发布消息时，Amazon SNS 会尝试将该消息传输至订阅该主题的每个电话号码。

1. 在 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)中的 **Topics**（主题）页面上，选择要向其发送 SMS 消息的主题的名称。

1. 在主题详细信息页面上，选择**发布消息**。

1. 在 **Publish message to topic**（将消息发布到主题）页面上的 **Message details**（消息详细信息）下，执行以下操作：

   1. 对于 **Subject**（主题），请将该字段留空，除非您的主题包含电子邮件订阅，并且您想要同时发布到电子邮件和 SMS 订阅。Amazon SNS 使用您输入的 **Subject**（主题）作为电子邮件主题行。

   1. （可选）对于 **Time to Live (TTL)**（存活时间 (TTL)），输入 Amazon SNS 向任何移动应用程序终端节点订阅者发送 SMS 消息所需的秒数。

1. 在 **Message body**（消息正文）下，执行以下操作：

   1. 对于 **Message structure**（消息结构），选择 **Identical payload for all delivery protocols**（所有传输协议的负载相同）向订阅了您的主题的所有协议类型发送相同消息。或者，选择 **Custom payload for each delivery protocol**（针对每个传输协议的自定义负载）为不同协议类型的订阅者自定义消息。例如，您可以输入电话号码订阅者的默认消息，以及电子邮件订阅者的自定义消息。

   1. 对于 **Message body to send to the endpoint**（要发送到终端节点的消息正文），输入您的消息或每个传输协议的自定义消息。

      如果您的主题包含显示名称，Amazon SNS 会将其添加到消息，这会增加消息的长度。显示名称的长度是名称的字符数加上两个字符，也就是 Amazon SNS 添加的右尖括号 (>) 和空格。

      有关 SMS 消息大小配额的信息，请参阅 [使用 Amazon SNS 向手机发布短信](#sms_publish-to-phone)。

1. （可选）在**消息属性**中，添加消息元数据，例如时间戳、签名和。 IDs

1. 选择**发布消息**。Amazon SNS 会发送 SMS 消息并显示成功消息。

### 使用向主题发送消息 AWS SDKs
<a name="sms_publish-to-topic_sdk"></a>

要使用 S AWS DK，必须使用您的凭据对其进行配置。有关更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html)。

以下代码示例显示了如何：
+ 创建 Amazon SNS 主题。
+ 使用手机号码订阅主题。
+ 向主题发布 SMS 消息，以使所有订阅的电话号码一次接收消息。

------
#### [ Java ]

**适用于 Java 的 SDK 2.x**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。
创建一个主题并返回其 ARN。  

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.CreateTopicRequest;
import software.amazon.awssdk.services.sns.model.CreateTopicResponse;
import software.amazon.awssdk.services.sns.model.SnsException;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class CreateTopic {
    public static void main(String[] args) {
        final String usage = """

                Usage:    <topicName>

                Where:
                   topicName - The name of the topic to create (for example, mytopic).

                """;

        if (args.length != 1) {
            System.out.println(usage);
            System.exit(1);
        }

        String topicName = args[0];
        System.out.println("Creating a topic with name: " + topicName);
        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();

        String arnVal = createSNSTopic(snsClient, topicName);
        System.out.println("The topic ARN is" + arnVal);
        snsClient.close();
    }

    public static String createSNSTopic(SnsClient snsClient, String topicName) {
        CreateTopicResponse result;
        try {
            CreateTopicRequest request = CreateTopicRequest.builder()
                    .name(topicName)
                    .build();

            result = snsClient.createTopic(request);
            return result.topicArn();

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return "";
    }
}
```
为终端节点订阅主题。  

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.SnsException;
import software.amazon.awssdk.services.sns.model.SubscribeRequest;
import software.amazon.awssdk.services.sns.model.SubscribeResponse;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class SubscribeTextSMS {
    public static void main(String[] args) {
        final String usage = """

                Usage:    <topicArn> <phoneNumber>

                Where:
                   topicArn - The ARN of the topic to subscribe.
                   phoneNumber - A mobile phone number that receives notifications (for example, +1XXX5550100).
                """;

        if (args.length < 2) {
            System.out.println(usage);
            System.exit(1);
        }

        String topicArn = args[0];
        String phoneNumber = args[1];
        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();

        subTextSNS(snsClient, topicArn, phoneNumber);
        snsClient.close();
    }

    public static void subTextSNS(SnsClient snsClient, String topicArn, String phoneNumber) {
        try {
            SubscribeRequest request = SubscribeRequest.builder()
                    .protocol("sms")
                    .endpoint(phoneNumber)
                    .returnSubscriptionArn(true)
                    .topicArn(topicArn)
                    .build();

            SubscribeResponse result = snsClient.subscribe(request);
            System.out.println("Subscription ARN: " + result.subscriptionArn() + "\n\n Status is "
                    + result.sdkHttpResponse().statusCode());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
设置消息的属性，例如发件人的 ID、最高价格及其类型。消息属性是可选的。  

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.SetSmsAttributesRequest;
import software.amazon.awssdk.services.sns.model.SetSmsAttributesResponse;
import software.amazon.awssdk.services.sns.model.SnsException;
import java.util.HashMap;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class SetSMSAttributes {
    public static void main(String[] args) {
        HashMap<String, String> attributes = new HashMap<>(1);
        attributes.put("DefaultSMSType", "Transactional");
        attributes.put("UsageReportS3Bucket", "janbucket");

        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();
        setSNSAttributes(snsClient, attributes);
        snsClient.close();
    }

    public static void setSNSAttributes(SnsClient snsClient, HashMap<String, String> attributes) {
        try {
            SetSmsAttributesRequest request = SetSmsAttributesRequest.builder()
                    .attributes(attributes)
                    .build();

            SetSmsAttributesResponse result = snsClient.setSMSAttributes(request);
            System.out.println("Set default Attributes to " + attributes + ". Status was "
                    + result.sdkHttpResponse().statusCode());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
向主题发布消息。消息将会发送到每个订阅用户。  

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.PublishRequest;
import software.amazon.awssdk.services.sns.model.PublishResponse;
import software.amazon.awssdk.services.sns.model.SnsException;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class PublishTextSMS {
    public static void main(String[] args) {
        final String usage = """

                Usage:    <message> <phoneNumber>

                Where:
                   message - The message text to send.
                   phoneNumber - The mobile phone number to which a message is sent (for example, +1XXX5550100).\s
                """;

        if (args.length != 2) {
            System.out.println(usage);
            System.exit(1);
        }

        String message = args[0];
        String phoneNumber = args[1];
        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();
        pubTextSMS(snsClient, message, phoneNumber);
        snsClient.close();
    }

    public static void pubTextSMS(SnsClient snsClient, String message, String phoneNumber) {
        try {
            PublishRequest request = PublishRequest.builder()
                    .message(message)
                    .phoneNumber(phoneNumber)
                    .build();

            PublishResponse result = snsClient.publish(request);
            System.out
                    .println(result.messageId() + " Message sent. Status was " + result.sdkHttpResponse().statusCode());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```

------

## 使用 Amazon SNS 向手机发布短信
<a name="sms_publish-to-phone"></a>

您可以使用 Amazon SNS 直接向移动电话发送 SMS 消息，而无需订阅 Amazon SNS 主题的电话号码。

**注意**  
如果您想要将一条消息一次发布至多个电话号码，使用电话号码订阅主题会很有用。有关向主题发布 SMS 消息的说明，请参阅 [将短信发布到 Amazon SNS 主题](#sms_publish-to-topic)。

在发送消息时，您可以控制是否对消息进行成本或可靠性传输优化。您还可以指定[发件人 ID 或源号码](channels-sms-originating-identities.md)。如果您使用 Amazon SNS API 或 AWS SDKs，以编程方式发送消息，则可以为消息传输指定最高价格。

每条 SMS 消息最多能包含 140 字节，字符配额具体取决于编码方案。例如，SMS 消息可以包含：
+ 160 个 GSM 字符
+ 140 个 ASCII 字符
+ 70 个 UCS-2 字符

如果您发布的消息超出大小配额，Amazon SNS 会将其作为多条消息发送，保证每条消息都符合大小配额。消息以整个词为边界，而不会在一个词的中间截断。单个 SMS 发布操作的总大小配额为 1600 字节。

在发送 SMS 消息时，您可以使用 E.164 格式指定电话号码（用于国际电信的标准电话编号结构）。遵循此格式的电话号码最多可包含 15 位数字，并以加号 (\$1) 和国家/地区代码作为前缀。例如，E.164 格式的美国电话号码显示为 \$11 XXX5550100。

### 发送消息（控制台）
<a name="sms_publish_console"></a>

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 在控制台菜单中，选择[支持短信收发的区域](https://docs.aws.amazon.com/general/latest/gr/end-user-messaging.html)。

1. 在导航窗格中，选择**文本消息(SMS)**。

1. 在 **Mobile text messaging (SMS)**（移动文本消息 (SMS)）页面上，选择 **Publish text message**（发布文本消息）。

1. 在 **Publish SMS message**（发布 SMS 消息）页面上，对于 **Message type**（消息类型），选择下列选项之一：
   + **Promotional**（促销）– 不重要的消息，例如营销消息。
   + **Transactional**（事务性）– 为客户事务处理提供支持的重要消息，例如多重身份验证的一次性密码。
**注意**  
此消息级别的设置会覆盖您的账户级别的默认消息类型。您可以从 **Mobile text messaging (SMS)**（移动文本消息 (SMS)）页面的 **Text messaging preferences**（文本消息首选项）部分中设置账户级别的默认消息类型。

   有关促销和事务性消息的定价信息，请参阅[全球 SMS 定价](https://aws.amazon.com/sns/sms-pricing/)。

1. 对于 **Destination phone number**（目标电话号码），请输入您想要向其发送消息的电话号码。

1. 对于 **Message**（消息），请输入要发送的消息。

1. （可选）在 **Origination identities**（源身份）下，指定如何向收件人识别自己：
   + 要指定 **Sender ID**（发件人 ID），请键入包含 3-11 个字母数字字符的自定义 ID，其中包括至少一个字母，并且不能包含空格。该发件人 ID 在接收设备上显示为消息发件人。例如，您可以使用自己的企业品牌让消息来源更易于识别。

     对发件人的支持因国家/ and/or 地区 IDs 而异。例如，发送至美国电话号码的消息不显示发件人 ID。有关支持发件人的国家和地区 IDs，请参阅《*AWS End User Messaging SMS 用户指南》 AWS End User Messaging SMS*中[支持的 SMS 消息发送的国家和地区](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers-sms-by-country.html)。

     如果您未指定发件人 ID，以下标识之一将显示为源身份：
     + 在支持长代码的国家/地区，显示长代码。
     + 在仅支持发 IDs 件人的国家/地区，会显示*通知*。

     此消息级别的发件人 ID 会覆盖您在 **Text messaging preferences** 页面中设置的默认发件人 ID。
   + 要指定 **Origination number**（远啊号码），输入一个由 5-14 个数字组成的字符串，以显示为收件人设备上的发件人电话号码。此字符串必须与您在 AWS 账户 中为目的地国家/地区配置的起始号码相匹配。起始号码可以是 10DLC 号码、免费电话号码、 person-to-person长码或短码。有关更多信息，请参阅 [Amazon SNS 短信的发起身份](channels-sms-originating-identities.md)。

     如果您未指定源号码，Amazon SNS 会根据您的 AWS 账户 配置选择用于 SMS 文本消息的源号码。

1. 如果您要向位于印度的收件人发送 SMS 消息，请展开 **Country-specific attributes**（特定于国家/地区的属性），然后指定以下属性：
   + **Entity ID**（实体 ID）– 向位于印度的收件人发送 SMS 消息的实体 ID 或委托人实体 (PE) ID。此 ID 是印度电信监管局 (TRAI) 提供的 1–50 个字符组成的唯一字符串，用于识别您在 TRAI 中注册的实体。
   + **Template ID**（模板 ID）– 向位于印度的收件人发送 SMS 消息的模板 ID。此 ID 是 TRAI 提供的唯一字符串，该字符串包含 1-50 个字符，用于标识您在 TRAI 中注册的模板。模板 ID 必须与您为邮件指定的发件人 ID 相关联。

   有关向位于印度的收件人发送短信的更多信息，请参阅《AWS End User Messaging SMS User Guide》**中的 [India sender ID registration process](https://docs.aws.amazon.com/sms-voice/latest/userguide/registrations-sms-senderid-india.html)。

1. 选择**发布消息**。

**提示**  
要从源号码发送 SMS 消息，您还可以在 Amazon SNS 控制台导航面板中选择 **Origination numbers**（源号码）。选择在 **Capabilities**（功能）列中包含 **SMS** 的源号码，然后选择 **Publish text message**（发布文本消息）。

### 发送消息 (AWS SDKs)
<a name="sms_publish_sdk"></a>

要使用其中一个发送短信 AWS SDKs，请使用该软件开发工具包中与 Amazon SNS API 中的`Publish`请求相对应的 API 操作。通过此请求，您可以直接向电话号码发送 SMS 消息。您也可使用 `MessageAttributes` 参数设置以下属性名称的值：

**`AWS.SNS.SMS.SenderID`**  
包含 3-11 个字母数字字符或连字符 (-) 的自定义 ID，其中包含至少一个字母，并且不能包含空格。该发件人 ID 在接收设备上显示为消息发件人。例如，您可以使用自己的企业品牌让消息来源更易于识别。  
对发件人的支持因国家或地区 IDs 而异。例如，发送至美国电话号码的消息不显示发件人 ID。有关支持发件人的国家或地区的列表 IDs，请参阅《*AWS End User Messaging SMS 用户指南》 AWS End User Messaging SMS*中[支持使用发送短信的国家和地区](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers-sms-by-country.html)。  
如果您未指定发件人 ID，则在支持的国家或地区中[长代码](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers-request-long-code.html)会显示为发件人 ID。对于要求使用按字母顺序排列发件人 ID 的国家和地区，*NOTICE* 显示为发件人 ID。  
此消息级别的属性会覆盖您可以通过 `SetSMSAttributes` 请求设置的账户级别属性 `DefaultSenderID`。

**`AWS.MM.SMS.OriginationNumber`**  
一个由 5—14 个数字组成的自定义字符串，其中可以包括一个可选的前导加号 (`+`)。此数字字串在接收设备上显示为发件人的电话号码。该字符串必须与您的 AWS 账户中为目的地国家/地区配置的发件人号码相匹配。发起号码可以是 10DLC 号码、免费电话号码、 person-to-person (P2P) 长码或短码。有关更多信息，请参阅《AWS End User Messaging SMS User Guide》中的** [Phone numbers](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers.html)。  
如果您未指定发货号，Amazon SNS 会根据 AWS 您的账户配置选择发货号。

**`AWS.SNS.SMS.MaxPrice`**  
您愿意用于发送 SMS 消息的最高价格（以美元为单位）。如果 Amazon SNS 确定发送消息会产生超出您最高价格的成本，则它不会发送消息。  
如果您的 month-to-date短信费用已超过为该属性设置的配额，则此`MonthlySpendLimit`属性无效。您可以使用 `SetSMSAttributes` 请求设置 `MonthlySpendLimit` 属性。  
如果您发送消息至 Amazon SNS 主题，则该最高价格适用于传输给订阅该主题的每个电话号码的每条消息。

**`AWS.SNS.SMS.SMSType`**  
要发送的消息类型：  
+ **`Promotional`**（默认）– 不重要的消息，例如营销消息。
+ **`Transactional`** – 为客户事务处理提供支持的重要消息，例如多重身份验证的一次性密码。
此消息级别的属性会覆盖您可以通过 `SetSMSAttributes` 请求设置的账户级别属性 `DefaultSMSType`。

**`AWS.MM.SMS.EntityId`**  
只有向位于印度的收件人发送 SMS 消息时，才需要此属性。  
这是您用于向位于印度的收件人发送 SMS 消息的实体 ID 或委托人实体 (PE) ID。此 ID 是印度电信监管局 (TRAI) 提供的 1–50 个字符组成的唯一字符串，用于识别您在 TRAI 中注册的实体。

**`AWS.MM.SMS.TemplateId`**  
只有向位于印度的收件人发送 SMS 消息时，才需要此属性。  
这是您向位于印度的收件人发送 SMS 消息的模板。此 ID 是 TRAI 提供的唯一字符串，该字符串包含 1-50 个字符，用于标识您在 TRAI 中注册的模板。模板 ID 必须与您为邮件指定的发件人 ID 相关联。

#### 发送消息
<a name="sms_publish_sdks"></a>

以下代码示例演示了如何使用 Amazon SNS 发布 SMS 消息。

------
#### [ .NET ]

**适用于 .NET 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3/SNS#code-examples)中查找完整示例，了解如何进行设置和运行。

```
namespace SNSMessageExample
{
    using System;
    using System.Threading.Tasks;
    using Amazon;
    using Amazon.SimpleNotificationService;
    using Amazon.SimpleNotificationService.Model;

    public class SNSMessage
    {
        private AmazonSimpleNotificationServiceClient snsClient;

        /// <summary>
        /// Initializes a new instance of the <see cref="SNSMessage"/> class.
        /// Constructs a new SNSMessage object initializing the Amazon Simple
        /// Notification Service (Amazon SNS) client using the supplied
        /// Region endpoint.
        /// </summary>
        /// <param name="regionEndpoint">The Amazon Region endpoint to use in
        /// sending test messages with this object.</param>
        public SNSMessage(RegionEndpoint regionEndpoint)
        {
            snsClient = new AmazonSimpleNotificationServiceClient(regionEndpoint);
        }

        /// <summary>
        /// Sends the SMS message passed in the text parameter to the phone number
        /// in phoneNum.
        /// </summary>
        /// <param name="phoneNum">The ten-digit phone number to which the text
        /// message will be sent.</param>
        /// <param name="text">The text of the message to send.</param>
        /// <returns>Async task.</returns>
        public async Task SendTextMessageAsync(string phoneNum, string text)
        {
            if (string.IsNullOrEmpty(phoneNum) || string.IsNullOrEmpty(text))
            {
                return;
            }

            // Now actually send the message.
            var request = new PublishRequest
            {
                Message = text,
                PhoneNumber = phoneNum,
            };

            try
            {
                var response = await snsClient.PublishAsync(request);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error sending message: {ex}");
            }
        }
    }
}
```
+  有关 API 详细信息，请参阅《适用于 .NET 的 AWS SDK API Reference》**中的 [Publish](https://docs.aws.amazon.com/goto/DotNetSDKV3/sns-2010-03-31/Publish)。

------
#### [ C\$1\$1 ]

**SDK for C\$1\$1**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
/**
 * Publish SMS: use Amazon Simple Notification Service (Amazon SNS) to send an SMS text message to a phone number.
 * Note: This requires additional AWS configuration prior to running example. 
 * 
 *  NOTE: When you start using Amazon SNS to send SMS messages, your AWS account is in the SMS sandbox and you can only
 *  use verified destination phone numbers. See https://docs.aws.amazon.com/sns/latest/dg/sns-sms-sandbox.html.
 *  NOTE: If destination is in the US, you also have an additional restriction that you have use a dedicated
 *  origination ID (phone number). You can request an origination number using Amazon Pinpoint for a fee.
 *  See https://aws.amazon.com/blogs/compute/provisioning-and-using-10dlc-origination-numbers-with-amazon-sns/ 
 *  for more information. 
 * 
 *  <phone_number_value> input parameter uses E.164 format. 
 *  For example, in United States, this input value should be of the form: +12223334444
 */

//! Send an SMS text message to a phone number.
/*!
  \param message: The message to publish.
  \param phoneNumber: The phone number of the recipient in E.164 format.
  \param clientConfiguration: AWS client configuration.
  \return bool: Function succeeded.
 */
bool AwsDoc::SNS::publishSms(const Aws::String &message,
                             const Aws::String &phoneNumber,
                             const Aws::Client::ClientConfiguration &clientConfiguration) {
    Aws::SNS::SNSClient snsClient(clientConfiguration);

    Aws::SNS::Model::PublishRequest request;
    request.SetMessage(message);
    request.SetPhoneNumber(phoneNumber);

    const Aws::SNS::Model::PublishOutcome outcome = snsClient.Publish(request);

    if (outcome.IsSuccess()) {
        std::cout << "Message published successfully with message id, '"
                  << outcome.GetResult().GetMessageId() << "'."
                  << std::endl;
    }
    else {
        std::cerr << "Error while publishing message "
                  << outcome.GetError().GetMessage()
                  << std::endl;
    }

    return outcome.IsSuccess();
}
```
+  有关 API 详细信息，请参阅《适用于 C\$1\$1 的 AWS SDK API Reference》**中的 [Publish](https://docs.aws.amazon.com/goto/SdkForCpp/sns-2010-03-31/Publish)。

------
#### [ Java ]

**适用于 Java 的 SDK 2.x**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.PublishRequest;
import software.amazon.awssdk.services.sns.model.PublishResponse;
import software.amazon.awssdk.services.sns.model.SnsException;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class PublishTextSMS {
    public static void main(String[] args) {
        final String usage = """

                Usage:    <message> <phoneNumber>

                Where:
                   message - The message text to send.
                   phoneNumber - The mobile phone number to which a message is sent (for example, +1XXX5550100).\s
                """;

        if (args.length != 2) {
            System.out.println(usage);
            System.exit(1);
        }

        String message = args[0];
        String phoneNumber = args[1];
        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();
        pubTextSMS(snsClient, message, phoneNumber);
        snsClient.close();
    }

    public static void pubTextSMS(SnsClient snsClient, String message, String phoneNumber) {
        try {
            PublishRequest request = PublishRequest.builder()
                    .message(message)
                    .phoneNumber(phoneNumber)
                    .build();

            PublishResponse result = snsClient.publish(request);
            System.out
                    .println(result.messageId() + " Message sent. Status was " + result.sdkHttpResponse().statusCode());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+  有关 API 详细信息，请参阅《AWS SDK for Java 2.x API Reference》**中的 [Publish](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/Publish)。

------
#### [ Kotlin ]

**适用于 Kotlin 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin/services/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
suspend fun pubTextSMS(
    messageVal: String?,
    phoneNumberVal: String?,
) {
    val request =
        PublishRequest {
            message = messageVal
            phoneNumber = phoneNumberVal
        }

    SnsClient.fromEnvironment { region = "us-east-1" }.use { snsClient ->
        val result = snsClient.publish(request)
        println("${result.messageId} message sent.")
    }
}
```
+  有关 API 详细信息，请参阅《AWS SDK for Kotlin API Reference》**中的 [Publish](https://sdk.amazonaws.com/kotlin/api/latest/index.html)。

------
#### [ PHP ]

**适用于 PHP 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;


/**
 * Sends a text message (SMS message) directly to a phone number using Amazon SNS.
 *
 * This code expects that you have AWS credentials set up per:
 * https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html
 */

$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

$message = 'This message is sent from a Amazon SNS code sample.';
$phone = '+1XXX5550100';

try {
    $result = $SnSclient->publish([
        'Message' => $message,
        'PhoneNumber' => $phone,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```
+  有关更多信息，请参阅《适用于 PHP 的 AWS SDK 开发人员指南》[https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/sns-examples-sending-sms.html#publish-to-a-text-message-sms-message](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/sns-examples-sending-sms.html#publish-to-a-text-message-sms-message)。
+  有关 API 详细信息，请参阅 *适用于 PHP 的 AWS SDK API 参考*中的 [Publish](https://docs.aws.amazon.com/goto/SdkForPHPV3/sns-2010-03-31/Publish)。

------
#### [ Python ]

**适用于 Python 的 SDK（Boto3）**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
class SnsWrapper:
    """Encapsulates Amazon SNS topic and subscription functions."""

    def __init__(self, sns_resource):
        """
        :param sns_resource: A Boto3 Amazon SNS resource.
        """
        self.sns_resource = sns_resource


    def publish_text_message(self, phone_number, message):
        """
        Publishes a text message directly to a phone number without need for a
        subscription.

        :param phone_number: The phone number that receives the message. This must be
                             in E.164 format. For example, a United States phone
                             number might be +12065550101.
        :param message: The message to send.
        :return: The ID of the message.
        """
        try:
            response = self.sns_resource.meta.client.publish(
                PhoneNumber=phone_number, Message=message
            )
            message_id = response["MessageId"]
            logger.info("Published message to %s.", phone_number)
        except ClientError:
            logger.exception("Couldn't publish message to %s.", phone_number)
            raise
        else:
            return message_id
```
+  有关 API 详细信息，请参阅《AWS SDK for Python (Boto3) API Reference》**中的 [Publish](https://docs.aws.amazon.com/goto/boto3/sns-2010-03-31/Publish)。

------
#### [ SAP ABAP ]

**适用于 SAP ABAP 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap/services/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
    " iv_phone_number = '+12065550101' - Phone number in E.164 format
    TRY.
        oo_result = lo_sns->publish(              " oo_result is returned for testing purposes. "
          iv_phonenumber = iv_phone_number
          iv_message = iv_message ).
        MESSAGE 'Message published to phone number.' TYPE 'I'.
      CATCH /aws1/cx_snsnotfoundexception.
        MESSAGE 'Phone number does not exist.' TYPE 'E'.
    ENDTRY.
```
+  有关 API 详细信息，请参阅《AWS SDK for SAP ABAP API 参考》**中的 [Publish](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)。

------

# 设置 Amazon SNS 中的短信收发首选项
<a name="sms_preferences"></a>

使用 Amazon SNS 指定 SMS 消息的首选项。例如，您可以指定是否要优化传输以确保成本或可靠性、您的每月支出限额、如何记录传输以及是否要订阅每日 SMS 使用情况报告。

这些首选项对从您的账户发送的每个 SMS 消息有效，但在您发送各条消息时可覆盖部分设置。有关更多信息，请参阅 [使用 Amazon SNS 向手机发布短信](sms_sending-overview.md#sms_publish-to-phone)。

## 使用设置短信首选项 AWS 管理控制台
<a name="sms_preferences_console"></a>

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 选择[支持 SMS 消息收发的区域](https://docs.aws.amazon.com/general/latest/gr/end-user-messaging.html)。

1. 在导航面板上，选择**移动**，然后选择**文本消息(SMS)**。

1. 在**移动文本消息(SMS)** 页上，在**文本消息发送首选项**部分中，选择**编辑**。

1. 在 **Edit text messaging preferences (编辑文本消息发送首选项)** 页上，在 **Details (详细信息)** 部分中，执行以下操作：

   1. 对于**默认消息类型**，选择下列选项之一：
      + **促销**（默认）– 非重要消息（例如营销消息）。Amazon SNS 以产生最低成本为基准来优化消息传输。
      + **事务性**（默认）– 为客户事务处理提供支持的重要消息，例如多重身份验证的一次性密码。Amazon SNS 以实现最高可靠性为基准来优化消息传输。

      有关促销和事务处理消息的定价信息，请参阅[全球 SMS 定价](https://aws.amazon.com/sns/sms-pricing/)。

   1. （可选）对于 **Account spend limit (账户花费限额)**，请输入您在每个日历月想要为 SMS 消息支付的金额，以 USD 为单位。
**重要**  
默认情况下，支出配额设为 1.00 USD。如果要提高服务配额，[请提交请求](https://console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase&limitType=service-code-sns)。
如果在控制台中设置的金额超过您的服务配额，Amazon SNS 会停止发布 SMS 消息。
由于 Amazon SNS 是分布式系统，它会在超过支出配额的几分钟内停止发送 SMS 消息。在该间隔内，如果您继续发送 SMS 消息，可能会产生超出配额的成本。

1. （可选）对于**默认发件人 ID**，请输入一个自定义 ID（如您的企业品牌），它显示为接收设备的发送者。
**注意**  
对发件人的支持因国家/地区 IDs 而异。

1. （可选）输入 **Amazon S3 bucket name for usage reports**（使用情况报告的 Amazon S3 存储桶名称）的名称。
**注意**  
Amazon S3 存储桶策略必须授予对 Amazon SNS 的写入权限。

1. 选择**保存更改**。

## 设置首选项 (AWS SDKs)
<a name="sms_preferences_sdk"></a>

要使用其中一个来设置您的短信偏好 AWS SDKs，请使用该软件开发工具包中与 Amazon SNS `SetSMSAttributes` API 中的请求相对应的操作。通过此请求，您可以将值分配给不同的 SMS 属性，例如您的每月支出配额和默认 SMS 类型（促销或事务）。有关所有短信属性，请参阅《*亚马逊简单通知服务 API 参考*》SMSAttributes中的 “[设置](https://docs.aws.amazon.com/sns/latest/api/API_SetSMSAttributes.html)”。

以下代码示例演示如何使用 `SetSMSAttributes`。

------
#### [ C\$1\$1 ]

**SDK for C\$1\$1**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。
如何使用 Amazon SNS 设置默认SMSType 属性。  

```
//! Set the default settings for sending SMS messages.
/*!
  \param smsType: The type of SMS message that you will send by default.
  \param clientConfiguration: AWS client configuration.
  \return bool: Function succeeded.
 */
bool AwsDoc::SNS::setSMSType(const Aws::String &smsType,
                             const Aws::Client::ClientConfiguration &clientConfiguration) {
    Aws::SNS::SNSClient snsClient(clientConfiguration);

    Aws::SNS::Model::SetSMSAttributesRequest request;
    request.AddAttributes("DefaultSMSType", smsType);

    const Aws::SNS::Model::SetSMSAttributesOutcome outcome = snsClient.SetSMSAttributes(
            request);

    if (outcome.IsSuccess()) {
        std::cout << "SMS Type set successfully " << std::endl;
    }
    else {
        std::cerr << "Error while setting SMS Type: '"
                  << outcome.GetError().GetMessage()
                  << "'" << std::endl;
    }

    return outcome.IsSuccess();
}
```
+  有关 API 的详细信息，请参阅 *适用于 C\$1\$1 的 AWS SDK API 参考SMSAttributes*中的[设置](https://docs.aws.amazon.com/goto/SdkForCpp/sns-2010-03-31/SetSMSAttributes)。

------
#### [ CLI ]

**AWS CLI**  
**设置 SMS 消息属性**  
以下 `set-sms-attributes` 示例将 SMS 消息的默认发件人 ID 设置为 `MyName`。  

```
aws sns set-sms-attributes \
    --attributes DefaultSenderID=MyName
```
此命令不生成任何输出。  
+  有关 API 的详细信息，请参阅SMSAttributes《*AWS CLI 命令参考*》中的 [“设置](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/set-sms-attributes.html)”。

------
#### [ Java ]

**适用于 Java 的 SDK 2.x**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.SetSmsAttributesRequest;
import software.amazon.awssdk.services.sns.model.SetSmsAttributesResponse;
import software.amazon.awssdk.services.sns.model.SnsException;
import java.util.HashMap;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class SetSMSAttributes {
    public static void main(String[] args) {
        HashMap<String, String> attributes = new HashMap<>(1);
        attributes.put("DefaultSMSType", "Transactional");
        attributes.put("UsageReportS3Bucket", "janbucket");

        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();
        setSNSAttributes(snsClient, attributes);
        snsClient.close();
    }

    public static void setSNSAttributes(SnsClient snsClient, HashMap<String, String> attributes) {
        try {
            SetSmsAttributesRequest request = SetSmsAttributesRequest.builder()
                    .attributes(attributes)
                    .build();

            SetSmsAttributesResponse result = snsClient.setSMSAttributes(request);
            System.out.println("Set default Attributes to " + attributes + ". Status was "
                    + result.sdkHttpResponse().statusCode());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+  有关 API 的详细信息，请参阅 *AWS SDK for Java 2.x API 参考SMSAttributes*中的[设置](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/SetSMSAttributes)。

------
#### [ JavaScript ]

**适用于 JavaScript (v3) 的软件开发工具包**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/sns#code-examples) 中查找完整示例，了解如何进行设置和运行。
在单独的模块中创建客户端并将其导出。  

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```
导入 SDK 和客户端模块，然后调用 API。  

```
import { SetSMSAttributesCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {"Transactional" | "Promotional"} defaultSmsType
 */
export const setSmsType = async (defaultSmsType = "Transactional") => {
  const response = await snsClient.send(
    new SetSMSAttributesCommand({
      attributes: {
        // Promotional – (Default) Noncritical messages, such as marketing messages.
        // Transactional – Critical messages that support customer transactions,
        // such as one-time passcodes for multi-factor authentication.
        DefaultSMSType: defaultSmsType,
      },
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '1885b977-2d7e-535e-8214-e44be727e265',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   }
  // }
  return response;
};
```
+  有关更多信息，请参阅[《适用于 JavaScript 的 AWS SDK Developer Guide》](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/sns-examples-sending-sms.html#sending-sms-setattributes)。
+  有关 API 的详细信息，请参阅 *适用于 JavaScript 的 AWS SDK API 参考SMSAttributes*中的[设置](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sns/command/SetSMSAttributesCommand)。

------
#### [ PHP ]

**适用于 PHP 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

try {
    $result = $SnSclient->SetSMSAttributes([
        'attributes' => [
            'DefaultSMSType' => 'Transactional',
        ],
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```
+  有关更多信息，请参阅《适用于 PHP 的 AWS SDK 开发人员指南》[https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/sns-examples-sending-sms.html#set-sms-attributes](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/sns-examples-sending-sms.html#set-sms-attributes)。
+  有关 API 的详细信息，请参阅 *适用于 PHP 的 AWS SDK API 参考SMSAttributes*中的[设置](https://docs.aws.amazon.com/goto/SdkForPHPV3/sns-2010-03-31/SetSMSAttributes)。

------

## 为特定于国家/地区的传送设置短信收发首选项
<a name="sms_preferences_country_specific"></a>

您可以通过仅向特定目标国家/地区发送消息来管理和控制短信流量。这样可以确保您的消息仅发送到经批准的国家/地区，从而避免不必要的短信费用。以下说明使用 Amazon Pinpoint 的保护配置来指定您想要允许或阻止的国家/地区。

1. 打开 AWS SMS 控制台，网址为[https://console.aws.amazon.com/sms-voice/](https://console.aws.amazon.com/sms-voice/)。

1. 在导航窗格的**概述**下的**快速入门**部分，选择**创建保护配置**。

1. 在 “**保护配置详细信息**” 下，为您的保护配置输入**适合企业使用的名称**（例如， Allow-Only-AU）。

1. 在**短信国家/地区规则**下，选中**地区/国家**复选框以阻止向所有支持的国家/地区发送消息。

1. 取消选中要将消息发送到的国家/地区的复选框。例如，要仅允许向澳大利亚发送消息，请取消选中**澳大利亚**对应的复选框。

1. 在**保护配置关联**部分的**关联类型**下，选择**账户默认**。这将确保 AWS End User Messaging SMS 保护配置影响通过亚马逊 SNS、Amazon Cogn [ito 和 Amazon](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html) Pinpoint API 调用发送的所有消息。[https://docs.aws.amazon.com/pinpoint/latest/developerguide/send-messages-sms.html](https://docs.aws.amazon.com/pinpoint/latest/developerguide/send-messages-sms.html)

1. 选择**创建保护配置**，保存您的设置。

   将显示以下确认消息：

   ```
   Success Protect configuration protect-abc0123456789 has been created.
   ```

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 向其中一个被阻止的国家/地区（例如印度）[**发布消息**](sns-publishing.md)。

   该消息将不会被传送。您可以使用在传送失败日志中对此进行验证[CloudWatch](sms_stats_cloudwatch.md)。在日志组**sns/region/AccountID/DirectPublishToPhoneNumber/Failure**中搜索类似于以下示例的响应：

   ```
   {
   "notification": {
   "messageId": "bd59a509-XXXX-XXXX-82f8-fbdb8cb68217",
   "timestamp": "YYYY-MM-DD XX:XX:XX.XXXX“
   },
   "delivery": {
   "destination": "+91XXXXXXXXXX",
   "smsType": "Transactional",
   "providerResponse": "Cannot deliver message to the specified destination country",
   "dwellTimeMs": 85
   },
   "status": "FAILURE"
   }
   ```

# 管理 Amazon SNS 电话号码和订阅
<a name="sms_manage"></a>

Amazon SNS 提供了多个用于管理账户 SMS 消息接收者的选项。在限定的频率内，您可以将已选择不从您的账户接收 SMS 消息的电话号码重新加入。若要停止向 SMS 订阅发送消息，您可以删除订阅或发布至订阅的主题。

## 退出接收 SMS 消息
<a name="sms_manage_optout"></a>

如果当地法律和法规有要求（例如美国和加拿大），SMS 收件人可以使用自己的设备，通过向该消息回复以下内容来表示退出：
+ ARRET（法语）
+ CANCEL
+ END
+ OPT-OUT
+ OPTOUT
+ QUIT
+ REMOVE
+ STOP
+ TD
+ UNSUBSCRIBE

要退出，收件人必须回复 Amazon SNS 用于传输消息的相同[发起号码](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers.html)。选择退出后， AWS 账户 除非您选择使用电话号码，否则收件人将不再收到您发送的 SMS 消息。

如果电话号码订阅了 Amazon SNS 主题，退出不会删除订阅，而短信将无法传输至该订阅，除非您重新加入其电话号码。

## 使用 Amazon SNS 控制台管理手机号码和订阅
<a name="sms_manage_console"></a>

您可以使用 Amazon SNS 控制台控制哪些电话号码从您的账户接收 SMS 消息。

### 加入已选择退出 Amazon SNS 控制台的电话号码
<a name="sms_manage_optout_console"></a>

您可以查看哪些电话号码已退出来自您的账户的短信，并重新加入这些电话号码，以便继续向其发送消息。

对于每个电话号码，您只能每隔 30 天重新加入一次。

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 在控制台菜单上，将区域选择器设置为[支持 SMS 消息收发的区域](https://docs.aws.amazon.com/general/latest/gr/end-user-messaging.html)。

1. 在导航面板上，选择**文本消息(SMS)**。

1. 在**移动文本消息(SMS)** 页面的**已退出的电话号码**部分中，将显示已退出的电话号码。

1. 选中您想要加入的电话号码的复选框，然后选择**选择加入**。电话号码将不再处于退出状态，并将接收您发送的 SMS 消息。

#### 在 Amazon SNS 控制台中删除短信订阅
<a name="sms_manage_subscriptions_console"></a>

删除 SMS 订阅可停止在您发布至主题时向该电话号码发送 SMS 消息。

1. 在导航面板中，选择**订阅**。

1. 选中要删除的订阅的复选框。然后选择 **Actions**，再选择 **Delete Subscriptions**。

1. 在 **Delete**（删除）窗口中，选择 **Delete**（删除）。Amazon SNS 将删除订阅并显示成功消息。

#### 在 Amazon SNS 控制台中删除主题
<a name="sms_manage_topic_console"></a>

当您不想再向其订阅终端节点发布消息时，可删除主题。

1. 在导航面板上，选择**主题**。

1. 选中要删除的主题的复选框。然后选择 **Actions**，再选择 **Delete Topics**。

1. 在 **Delete**（删除）窗口中，选择 **Delete**（删除）。Amazon SNS 删除主题并显示成功消息。

### 使用 AWS SDK 管理电话号码和订阅
<a name="sms_manage_sdk"></a>

您可以使用向 Amazon SNS 发出编程请求，并管理哪些电话号码可以从您的账户接收短信。 AWS SDKs 

要使用 S AWS DK，必须使用您的凭据对其进行配置。有关更多信息，请参阅《工具参考指南》[和《*工具参考指南》中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

#### 使用 SDK 查看所有已选择退出的电话号码 AWS
<a name="sms_view_optout_sdk"></a>

要查看所有已退出的电话号码，请使用 Amazon SNS API 提交 `ListPhoneNumbersOptedOut` 请求。

以下代码示例演示如何使用 `ListPhoneNumbersOptedOut`。

------
#### [ CLI ]

**AWS CLI**  
**列出 SMS 消息退出**  
以下 `list-phone-numbers-opted-out` 示例将列出退出 SMS 消息接收的电话号码。  

```
aws sns list-phone-numbers-opted-out
```
输出：  

```
{
    "phoneNumbers": [
        "+15555550100"
    ]
}
```
+  有关 API 的详细信息，请参阅*AWS CLI 命令参考[ListPhoneNumbersOptedOut](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/list-phone-numbers-opted-out.html)*中的。

------
#### [ Java ]

**适用于 Java 的 SDK 2.x**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.ListPhoneNumbersOptedOutRequest;
import software.amazon.awssdk.services.sns.model.ListPhoneNumbersOptedOutResponse;
import software.amazon.awssdk.services.sns.model.SnsException;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class ListOptOut {
    public static void main(String[] args) {
        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();

        listOpts(snsClient);
        snsClient.close();
    }

    public static void listOpts(SnsClient snsClient) {
        try {
            ListPhoneNumbersOptedOutRequest request = ListPhoneNumbersOptedOutRequest.builder().build();
            ListPhoneNumbersOptedOutResponse result = snsClient.listPhoneNumbersOptedOut(request);
            System.out.println("Status is " + result.sdkHttpResponse().statusCode() + "\n\nPhone Numbers: \n\n"
                    + result.phoneNumbers());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+  有关 API 的详细信息，请参阅 *AWS SDK for Java 2.x API 参考[ListPhoneNumbersOptedOut](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/ListPhoneNumbersOptedOut)*中的。

------
#### [ PHP ]

**适用于 PHP 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;


/**
 * Returns a list of phone numbers that are opted out of receiving SMS messages from your AWS SNS account.
 *
 * This code expects that you have AWS credentials set up per:
 * https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html
 */

$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

try {
    $result = $SnSclient->listPhoneNumbersOptedOut();
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```
+  有关更多信息，请参阅《适用于 PHP 的 AWS SDK 开发人员指南》[https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/sns-examples-sending-sms.html#list-opted-out-phone-numbers](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/sns-examples-sending-sms.html#list-opted-out-phone-numbers)。
+  有关 API 的详细信息，请参阅 *适用于 PHP 的 AWS SDK API 参考[ListPhoneNumbersOptedOut](https://docs.aws.amazon.com/goto/SdkForPHPV3/sns-2010-03-31/ListPhoneNumbersOptedOut)*中的。

------

#### 使用 SDK 检查电话号码是否已选择退出 AWS
<a name="sms_check_optout_sdk"></a>

要检查电话号码是否退出，请使用 Amazon SNS API 提交 `CheckIfPhoneNumberIsOptedOut` 请求。

以下代码示例演示如何使用 `CheckIfPhoneNumberIsOptedOut`。

------
#### [ .NET ]

**适用于 .NET 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3/SNS#code-examples)中查找完整示例，了解如何进行设置和运行。

```
    using System;
    using System.Threading.Tasks;
    using Amazon.SimpleNotificationService;
    using Amazon.SimpleNotificationService.Model;

    /// <summary>
    /// This example shows how to use the Amazon Simple Notification Service
    /// (Amazon SNS) to check whether a phone number has been opted out.
    /// </summary>
    public class IsPhoneNumOptedOut
    {
        public static async Task Main()
        {
            string phoneNumber = "+15551112222";

            IAmazonSimpleNotificationService client = new AmazonSimpleNotificationServiceClient();

            await CheckIfOptedOutAsync(client, phoneNumber);
        }

        /// <summary>
        /// Checks to see if the supplied phone number has been opted out.
        /// </summary>
        /// <param name="client">The initialized Amazon SNS Client object used
        /// to check if the phone number has been opted out.</param>
        /// <param name="phoneNumber">A string representing the phone number
        /// to check.</param>
        public static async Task CheckIfOptedOutAsync(IAmazonSimpleNotificationService client, string phoneNumber)
        {
            var request = new CheckIfPhoneNumberIsOptedOutRequest
            {
                PhoneNumber = phoneNumber,
            };

            try
            {
                var response = await client.CheckIfPhoneNumberIsOptedOutAsync(request);

                if (response.HttpStatusCode == System.Net.HttpStatusCode.OK)
                {
                    string optOutStatus = response.IsOptedOut ? "opted out" : "not opted out.";
                    Console.WriteLine($"The phone number: {phoneNumber} is {optOutStatus}");
                }
            }
            catch (AuthorizationErrorException ex)
            {
                Console.WriteLine($"{ex.Message}");
            }
        }
    }
```
+  有关 API 的详细信息，请参阅 *适用于 .NET 的 AWS SDK API 参考[CheckIfPhoneNumberIsOptedOut](https://docs.aws.amazon.com/goto/DotNetSDKV3/sns-2010-03-31/CheckIfPhoneNumberIsOptedOut)*中的。

------
#### [ CLI ]

**AWS CLI**  
**检查电话号码的 SMS 消息退出**  
以下`check-if-phone-number-is-opted-out`示例检查指定的电话号码是否已选择不接收来自当前 AWS 账户的 SMS 消息。  

```
aws sns check-if-phone-number-is-opted-out \
    --phone-number +1555550100
```
输出：  

```
{
    "isOptedOut": false
}
```
+  有关 API 的详细信息，请参阅*AWS CLI 命令参考[CheckIfPhoneNumberIsOptedOut](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/check-if-phone-number-is-opted-out.html)*中的。

------
#### [ Java ]

**适用于 Java 的 SDK 2.x**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.CheckIfPhoneNumberIsOptedOutRequest;
import software.amazon.awssdk.services.sns.model.CheckIfPhoneNumberIsOptedOutResponse;
import software.amazon.awssdk.services.sns.model.SnsException;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class CheckOptOut {
    public static void main(String[] args) {

        final String usage = """

                Usage:    <phoneNumber>

                Where:
                   phoneNumber - The mobile phone number to look up (for example, +1XXX5550100).

                """;

        if (args.length != 1) {
            System.out.println(usage);
            System.exit(1);
        }

        String phoneNumber = args[0];
        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();

        checkPhone(snsClient, phoneNumber);
        snsClient.close();
    }

    public static void checkPhone(SnsClient snsClient, String phoneNumber) {
        try {
            CheckIfPhoneNumberIsOptedOutRequest request = CheckIfPhoneNumberIsOptedOutRequest.builder()
                    .phoneNumber(phoneNumber)
                    .build();

            CheckIfPhoneNumberIsOptedOutResponse result = snsClient.checkIfPhoneNumberIsOptedOut(request);
            System.out.println(
                    result.isOptedOut() + "Phone Number " + phoneNumber + " has Opted Out of receiving sns messages." +
                            "\n\nStatus was " + result.sdkHttpResponse().statusCode());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+  有关 API 的详细信息，请参阅 *AWS SDK for Java 2.x API 参考[CheckIfPhoneNumberIsOptedOut](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/CheckIfPhoneNumberIsOptedOut)*中的。

------
#### [ JavaScript ]

**适用于 JavaScript (v3) 的软件开发工具包**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/sns#code-examples) 中查找完整示例，了解如何进行设置和运行。
在单独的模块中创建客户端并将其导出。  

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```
导入 SDK 和客户端模块，然后调用 API。  

```
import { CheckIfPhoneNumberIsOptedOutCommand } from "@aws-sdk/client-sns";

import { snsClient } from "../libs/snsClient.js";

export const checkIfPhoneNumberIsOptedOut = async (
  phoneNumber = "5555555555",
) => {
  const command = new CheckIfPhoneNumberIsOptedOutCommand({
    phoneNumber,
  });

  const response = await snsClient.send(command);
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '3341c28a-cdc8-5b39-a3ee-9fb0ee125732',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   isOptedOut: false
  // }
  return response;
};
```
+  有关更多信息，请参阅[《适用于 JavaScript 的 AWS SDK Developer Guide》](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/sns-examples-sending-sms.html#sending-sms-checkifphonenumberisoptedout)。
+  有关 API 的详细信息，请参阅 *适用于 JavaScript 的 AWS SDK API 参考[CheckIfPhoneNumberIsOptedOut](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sns/command/CheckIfPhoneNumberIsOptedOutCommand)*中的。

------
#### [ PHP ]

**适用于 PHP 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;


/**
 * Indicates whether the phone number owner has opted out of receiving SMS messages from your AWS SNS account.
 *
 * This code expects that you have AWS credentials set up per:
 * https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html
 */

$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

$phone = '+1XXX5550100';

try {
    $result = $SnSclient->checkIfPhoneNumberIsOptedOut([
        'phoneNumber' => $phone,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```
+  有关更多信息，请参阅《适用于 PHP 的 AWS SDK 开发人员指南》[https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/sns-examples-sending-sms.html#check-if-a-phone-number-has-opted-out](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/sns-examples-sending-sms.html#check-if-a-phone-number-has-opted-out)。
+  有关 API 的详细信息，请参阅 *适用于 PHP 的 AWS SDK API 参考[CheckIfPhoneNumberIsOptedOut](https://docs.aws.amazon.com/goto/SdkForPHPV3/sns-2010-03-31/CheckIfPhoneNumberIsOptedOut)*中的。

------

#### 加入已选择退出 Amazon SNS API 的电话号码
<a name="sms_manage_optin_sdk"></a>

要选择加入电话号码，请使用 Amazon SNS API 提交 `OptInPhoneNumber` 请求。

对于每个电话号码，您只能每隔 30 天重新加入一次。

#### 使用 S AWS DK 删除短信订阅
<a name="sms_manage_subscriptions_sdk"></a>

要从 Amazon SNS 主题删除 SMS 订阅，请使用 Amazon SNS API 提交 `ListSubscriptions` 请求来获取订阅 ARN，然后将该 ARN 传递给 `Unsubscribe` 请求。

以下代码示例演示如何使用 `Unsubscribe`。

------
#### [ .NET ]

**适用于 .NET 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3/cross-service/TopicsAndQueues#code-examples)中查找完整示例，了解如何进行设置和运行。
通过订阅 ARN 取消订阅某个主题。  

```
    /// <summary>
    /// Unsubscribe from a topic by a subscription ARN.
    /// </summary>
    /// <param name="subscriptionArn">The ARN of the subscription.</param>
    /// <returns>True if successful.</returns>
    public async Task<bool> UnsubscribeByArn(string subscriptionArn)
    {
        var unsubscribeResponse = await _amazonSNSClient.UnsubscribeAsync(
            new UnsubscribeRequest()
            {
                SubscriptionArn = subscriptionArn
            });
        return unsubscribeResponse.HttpStatusCode == HttpStatusCode.OK;
    }
```
+  有关 API 详细信息，请参阅《适用于 .NET 的 AWS SDK API Reference》**中的 [Unsubscribe](https://docs.aws.amazon.com/goto/DotNetSDKV3/sns-2010-03-31/Unsubscribe)。

------
#### [ C\$1\$1 ]

**SDK for C\$1\$1**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
//! Delete a subscription to an Amazon Simple Notification Service (Amazon SNS) topic.
/*!
  \param subscriptionARN: The Amazon Resource Name (ARN) for an Amazon SNS topic subscription.
  \param clientConfiguration: AWS client configuration.
  \return bool: Function succeeded.
 */
bool AwsDoc::SNS::unsubscribe(const Aws::String &subscriptionARN,
                              const Aws::Client::ClientConfiguration &clientConfiguration) {
    Aws::SNS::SNSClient snsClient(clientConfiguration);

    Aws::SNS::Model::UnsubscribeRequest request;
    request.SetSubscriptionArn(subscriptionARN);

    const Aws::SNS::Model::UnsubscribeOutcome outcome = snsClient.Unsubscribe(request);

    if (outcome.IsSuccess()) {
        std::cout << "Unsubscribed successfully " << std::endl;
    }
    else {
        std::cerr << "Error while unsubscribing " << outcome.GetError().GetMessage()
                  << std::endl;
    }

    return outcome.IsSuccess();
}
```
+  有关 API 详细信息，请参阅《适用于 C\$1\$1 的 AWS SDK API Reference》**中的 [Unsubscribe](https://docs.aws.amazon.com/goto/SdkForCpp/sns-2010-03-31/Unsubscribe)。

------
#### [ CLI ]

**AWS CLI**  
**从主题取消订阅**  
以下 `unsubscribe` 示例将从主题删除指定的订阅。  

```
aws sns unsubscribe \
    --subscription-arn arn:aws:sns:us-west-2:0123456789012:my-topic:8a21d249-4329-4871-acc6-7be709c6ea7f
```
此命令不生成任何输出。  
+  有关 API 详细信息，请参阅《AWS CLI Command Reference》**中的 [Unsubscribe](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/unsubscribe.html)。

------
#### [ Java ]

**适用于 Java 的 SDK 2.x**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.SnsException;
import software.amazon.awssdk.services.sns.model.UnsubscribeRequest;
import software.amazon.awssdk.services.sns.model.UnsubscribeResponse;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class Unsubscribe {
    public static void main(String[] args) {
        final String usage = """

                Usage:    <subscriptionArn>

                Where:
                   subscriptionArn - The ARN of the subscription to delete.
                """;

        if (args.length < 1) {
            System.out.println(usage);
            System.exit(1);
        }

        String subscriptionArn = args[0];
        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();

        unSub(snsClient, subscriptionArn);
        snsClient.close();
    }

    public static void unSub(SnsClient snsClient, String subscriptionArn) {
        try {
            UnsubscribeRequest request = UnsubscribeRequest.builder()
                    .subscriptionArn(subscriptionArn)
                    .build();

            UnsubscribeResponse result = snsClient.unsubscribe(request);
            System.out.println("\n\nStatus was " + result.sdkHttpResponse().statusCode()
                    + "\n\nSubscription was removed for " + request.subscriptionArn());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+  有关 API 详细信息，请参阅《AWS SDK for Java 2.x API Reference》**中的 [Unsubscribe](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/Unsubscribe)。

------
#### [ JavaScript ]

**适用于 JavaScript (v3) 的软件开发工具包**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/sns#code-examples) 中查找完整示例，了解如何进行设置和运行。
在单独的模块中创建客户端并将其导出。  

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```
导入 SDK 和客户端模块，然后调用 API。  

```
import { UnsubscribeCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string} subscriptionArn - The ARN of the subscription to cancel.
 */
const unsubscribe = async (
  subscriptionArn = "arn:aws:sns:us-east-1:xxxxxxxxxxxx:mytopic:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
) => {
  const response = await snsClient.send(
    new UnsubscribeCommand({
      SubscriptionArn: subscriptionArn,
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '0178259a-9204-507c-b620-78a7570a44c6',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   }
  // }
  return response;
};
```
+  有关更多信息，请参阅[《适用于 JavaScript 的 AWS SDK Developer Guide》](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/sns-examples-managing-topics.html#sns-examples-unsubscribing)。
+  有关 API 详细信息，请参阅《适用于 JavaScript 的 AWS SDK API Reference》**中的 [Unsubscribe](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sns/command/UnsubscribeCommand)。

------
#### [ Kotlin ]

**适用于 Kotlin 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin/services/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
suspend fun unSub(subscriptionArnVal: String) {
    val request =
        UnsubscribeRequest {
            subscriptionArn = subscriptionArnVal
        }

    SnsClient.fromEnvironment { region = "us-east-1" }.use { snsClient ->
        snsClient.unsubscribe(request)
        println("Subscription was removed for ${request.subscriptionArn}")
    }
}
```
+  有关 API 详细信息，请参阅《AWS SDK for Kotlin API Reference》**中的 [Unsubscribe](https://sdk.amazonaws.com/kotlin/api/latest/index.html)。

------
#### [ PHP ]

**适用于 PHP 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;


/**
 * Deletes a subscription to an Amazon SNS topic.
 *
 * This code expects that you have AWS credentials set up per:
 * https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html
 */

$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

$subscription = 'arn:aws:sns:us-east-1:111122223333:MySubscription';

try {
    $result = $SnSclient->unsubscribe([
        'SubscriptionArn' => $subscription,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```
+  有关更多信息，请参阅《适用于 PHP 的 AWS SDK 开发人员指南》[https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/sns-examples-subscribing-unsubscribing-topics.html#unsubscribe-from-a-topic](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/sns-examples-subscribing-unsubscribing-topics.html#unsubscribe-from-a-topic)。
+  有关 API 详细信息，请参阅 *适用于 PHP 的 AWS SDK API 参考* 中的 [Unsubscribe](https://docs.aws.amazon.com/goto/SdkForPHPV3/sns-2010-03-31/Unsubscribe)。

------
#### [ Python ]

**适用于 Python 的 SDK（Boto3）**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
class SnsWrapper:
    """Encapsulates Amazon SNS topic and subscription functions."""

    def __init__(self, sns_resource):
        """
        :param sns_resource: A Boto3 Amazon SNS resource.
        """
        self.sns_resource = sns_resource


    @staticmethod
    def delete_subscription(subscription):
        """
        Unsubscribes and deletes a subscription.
        """
        try:
            subscription.delete()
            logger.info("Deleted subscription %s.", subscription.arn)
        except ClientError:
            logger.exception("Couldn't delete subscription %s.", subscription.arn)
            raise
```

```
class SnsWrapper:
    """Wrapper class for managing Amazon SNS operations."""

    def __init__(self, sns_client: Any) -> None:
        """
        Initialize the SnsWrapper.

        :param sns_client: A Boto3 Amazon SNS client.
        """
        self.sns_client = sns_client

    @classmethod
    def from_client(cls) -> 'SnsWrapper':
        """
        Create an SnsWrapper instance using a default boto3 client.

        :return: An instance of this class.
        """
        sns_client = boto3.client('sns')
        return cls(sns_client)


    def unsubscribe(self, subscription_arn: str) -> bool:
        """
        Unsubscribe from an SNS topic.

        :param subscription_arn: The ARN of the subscription to remove.
        :return: True if successful.
        :raises ClientError: If the unsubscribe operation fails.
        """
        try:
            self.sns_client.unsubscribe(SubscriptionArn=subscription_arn)
            
            logger.info(f"Unsubscribed: {subscription_arn}")
            return True

        except ClientError as e:
            error_code = e.response.get('Error', {}).get('Code', 'Unknown')
            
            if error_code == 'NotFound':
                logger.warning(f"Subscription not found: {subscription_arn}")
                return True  # Already unsubscribed
            else:
                logger.error(f"Error unsubscribing: {error_code} - {e}")
                raise
```
+  有关 API 详细信息，请参阅《AWS SDK for Python (Boto3) API Reference》**中的 [Unsubscribe](https://docs.aws.amazon.com/goto/boto3/sns-2010-03-31/Unsubscribe)。

------
#### [ SAP ABAP ]

**适用于 SAP ABAP 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap/services/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
    TRY.
        lo_sns->unsubscribe( iv_subscriptionarn = iv_subscription_arn ).
        MESSAGE 'Subscription deleted.' TYPE 'I'.
      CATCH /aws1/cx_snsnotfoundexception.
        MESSAGE 'Subscription does not exist.' TYPE 'E'.
      CATCH /aws1/cx_snsinvalidparameterex.
        MESSAGE 'Subscription with "PendingConfirmation" status cannot be deleted/unsubscribed. Confirm subscription before performing unsubscribe operation.' TYPE 'E'.
    ENDTRY.
```
+  有关 API 详细信息，请参阅《AWS SDK for SAP ABAP API Reference》**中的 [Unsubscribe](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)。

------
#### [ Swift ]

**适用于 Swift 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/swift/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
import AWSSNS

        let config = try await SNSClient.SNSClientConfiguration(region: region)
        let snsClient = SNSClient(config: config)

        _ = try await snsClient.unsubscribe(
            input: UnsubscribeInput(
                subscriptionArn: arn
            )
        )

        print("Unsubscribed.")
```
+  有关 API 详细信息，请参阅《AWS SDK for Swift API Reference》**中的 [Unsubscribe](https://sdk.amazonaws.com/swift/api/awssns/latest/documentation/awssns/snsclient/unsubscribe(input:))。

------

#### 使用 AWS SDK 删除主题
<a name="sms_manage_topic_sdk"></a>

要删除主题及其所有订阅，请使用 Amazon SNS API 提交 `ListTopics` 请求来获取主题 ARN，然后将该 ARN 传递给 `DeleteTopic` 请求。

以下代码示例演示如何使用 `DeleteTopic`。

------
#### [ .NET ]

**适用于 .NET 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3/cross-service/TopicsAndQueues#code-examples)中查找完整示例，了解如何进行设置和运行。
按主题 ARN 删除主题。  

```
    /// <summary>
    /// Delete a topic by its topic ARN.
    /// </summary>
    /// <param name="topicArn">The ARN of the topic.</param>
    /// <returns>True if successful.</returns>
    public async Task<bool> DeleteTopicByArn(string topicArn)
    {
        var deleteResponse = await _amazonSNSClient.DeleteTopicAsync(
            new DeleteTopicRequest()
            {
                TopicArn = topicArn
            });
        return deleteResponse.HttpStatusCode == HttpStatusCode.OK;
    }
```
+  有关 API 的详细信息，请参阅 *适用于 .NET 的 AWS SDK API 参考[DeleteTopic](https://docs.aws.amazon.com/goto/DotNetSDKV3/sns-2010-03-31/DeleteTopic)*中的。

------
#### [ C\$1\$1 ]

**SDK for C\$1\$1**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
//! Delete an Amazon Simple Notification Service (Amazon SNS) topic.
/*!
  \param topicARN: The Amazon Resource Name (ARN) for an Amazon SNS topic.
  \param clientConfiguration: AWS client configuration.
  \return bool: Function succeeded.
 */
bool AwsDoc::SNS::deleteTopic(const Aws::String &topicARN,
                              const Aws::Client::ClientConfiguration &clientConfiguration) {
    Aws::SNS::SNSClient snsClient(clientConfiguration);

    Aws::SNS::Model::DeleteTopicRequest request;
    request.SetTopicArn(topicARN);

    const Aws::SNS::Model::DeleteTopicOutcome outcome = snsClient.DeleteTopic(request);

    if (outcome.IsSuccess()) {
        std::cout << "Successfully deleted the Amazon SNS topic " << topicARN << std::endl;
    }
    else {
        std::cerr << "Error deleting topic " << topicARN << ":" <<
                  outcome.GetError().GetMessage() << std::endl;
    }

    return outcome.IsSuccess();
}
```
+  有关 API 的详细信息，请参阅 *适用于 C\$1\$1 的 AWS SDK API 参考[DeleteTopic](https://docs.aws.amazon.com/goto/SdkForCpp/sns-2010-03-31/DeleteTopic)*中的。

------
#### [ CLI ]

**AWS CLI**  
**删除 SNS 主题**  
以下 `delete-topic` 示例将删除指定的 SNS 主题。  

```
aws sns delete-topic \
    --topic-arn "arn:aws:sns:us-west-2:123456789012:my-topic"
```
此命令不生成任何输出。  
+  有关 API 的详细信息，请参阅*AWS CLI 命令参考[DeleteTopic](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/delete-topic.html)*中的。

------
#### [ Go ]

**适用于 Go 的 SDK V2**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/gov2/workflows/topics_and_queues#code-examples)中查找完整示例，了解如何进行设置和运行。

```
import (
	"context"
	"encoding/json"
	"log"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/service/sns"
	"github.com/aws/aws-sdk-go-v2/service/sns/types"
)

// SnsActions encapsulates the Amazon Simple Notification Service (Amazon SNS) actions
// used in the examples.
type SnsActions struct {
	SnsClient *sns.Client
}



// DeleteTopic delete an Amazon SNS topic.
func (actor SnsActions) DeleteTopic(ctx context.Context, topicArn string) error {
	_, err := actor.SnsClient.DeleteTopic(ctx, &sns.DeleteTopicInput{
		TopicArn: aws.String(topicArn)})
	if err != nil {
		log.Printf("Couldn't delete topic %v. Here's why: %v\n", topicArn, err)
	}
	return err
}
```
+  有关 API 的详细信息，请参阅 *适用于 Go 的 AWS SDK API 参考[DeleteTopic](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/sns#Client.DeleteTopic)*中的。

------
#### [ Java ]

**适用于 Java 的 SDK 2.x**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.DeleteTopicRequest;
import software.amazon.awssdk.services.sns.model.DeleteTopicResponse;
import software.amazon.awssdk.services.sns.model.SnsException;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class DeleteTopic {
    public static void main(String[] args) {
        final String usage = """

                Usage:     <topicArn>

                Where:
                   topicArn - The ARN of the topic to delete.
                """;

        if (args.length != 1) {
            System.out.println(usage);
            System.exit(1);
        }

        String topicArn = args[0];
        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();

        System.out.println("Deleting a topic with name: " + topicArn);
        deleteSNSTopic(snsClient, topicArn);
        snsClient.close();
    }

    public static void deleteSNSTopic(SnsClient snsClient, String topicArn) {
        try {
            DeleteTopicRequest request = DeleteTopicRequest.builder()
                    .topicArn(topicArn)
                    .build();

            DeleteTopicResponse result = snsClient.deleteTopic(request);
            System.out.println("\n\nStatus was " + result.sdkHttpResponse().statusCode());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+  有关 API 的详细信息，请参阅 *AWS SDK for Java 2.x API 参考[DeleteTopic](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/DeleteTopic)*中的。

------
#### [ JavaScript ]

**适用于 JavaScript (v3) 的软件开发工具包**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/sns#code-examples) 中查找完整示例，了解如何进行设置和运行。
在单独的模块中创建客户端并将其导出。  

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```
导入 SDK 和客户端模块，然后调用 API。  

```
import { DeleteTopicCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string} topicArn - The ARN of the topic to delete.
 */
export const deleteTopic = async (topicArn = "TOPIC_ARN") => {
  const response = await snsClient.send(
    new DeleteTopicCommand({ TopicArn: topicArn }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: 'a10e2886-5a8f-5114-af36-75bd39498332',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   }
  // }
};
```
+  有关更多信息，请参阅[《适用于 JavaScript 的 AWS SDK Developer Guide》](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/sns-examples-managing-topics.html#sns-examples-managing-topics-deletetopic)。
+  有关 API 的详细信息，请参阅 *适用于 JavaScript 的 AWS SDK API 参考[DeleteTopic](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sns/command/DeleteTopicCommand)*中的。

------
#### [ Kotlin ]

**适用于 Kotlin 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin/services/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
suspend fun deleteSNSTopic(topicArnVal: String) {
    val request =
        DeleteTopicRequest {
            topicArn = topicArnVal
        }

    SnsClient.fromEnvironment { region = "us-east-1" }.use { snsClient ->
        snsClient.deleteTopic(request)
        println("$topicArnVal was successfully deleted.")
    }
}
```
+  有关 API 的详细信息，请参阅适用[DeleteTopic](https://sdk.amazonaws.com/kotlin/api/latest/index.html)于 K *otlin 的AWS SDK API 参考*。

------
#### [ PHP ]

**适用于 PHP 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;


/**
 * Deletes an SNS topic and all its subscriptions.
 *
 * This code expects that you have AWS credentials set up per:
 * https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html
 */

$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

$topic = 'arn:aws:sns:us-east-1:111122223333:MyTopic';

try {
    $result = $SnSclient->deleteTopic([
        'TopicArn' => $topic,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```
+  有关 API 的详细信息，请参阅 *适用于 PHP 的 AWS SDK API 参考[DeleteTopic](https://docs.aws.amazon.com/goto/SdkForPHPV3/sns-2010-03-31/DeleteTopic)*中的。

------
#### [ Python ]

**适用于 Python 的 SDK（Boto3）**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
class SnsWrapper:
    """Encapsulates Amazon SNS topic and subscription functions."""

    def __init__(self, sns_resource):
        """
        :param sns_resource: A Boto3 Amazon SNS resource.
        """
        self.sns_resource = sns_resource


    @staticmethod
    def delete_topic(topic):
        """
        Deletes a topic. All subscriptions to the topic are also deleted.
        """
        try:
            topic.delete()
            logger.info("Deleted topic %s.", topic.arn)
        except ClientError:
            logger.exception("Couldn't delete topic %s.", topic.arn)
            raise
```

```
class SnsWrapper:
    """Wrapper class for managing Amazon SNS operations."""

    def __init__(self, sns_client: Any) -> None:
        """
        Initialize the SnsWrapper.

        :param sns_client: A Boto3 Amazon SNS client.
        """
        self.sns_client = sns_client

    @classmethod
    def from_client(cls) -> 'SnsWrapper':
        """
        Create an SnsWrapper instance using a default boto3 client.

        :return: An instance of this class.
        """
        sns_client = boto3.client('sns')
        return cls(sns_client)


    def delete_topic(self, topic_arn: str) -> bool:
        """
        Delete an SNS topic.

        :param topic_arn: The ARN of the topic to delete.
        :return: True if successful.
        :raises ClientError: If the topic deletion fails.
        """
        try:
            self.sns_client.delete_topic(TopicArn=topic_arn)
            
            logger.info(f"Deleted topic: {topic_arn}")
            return True

        except ClientError as e:
            error_code = e.response.get('Error', {}).get('Code', 'Unknown')
            
            if error_code == 'NotFound':
                logger.warning(f"Topic not found: {topic_arn}")
                return True  # Already deleted
            else:
                logger.error(f"Error deleting topic: {error_code} - {e}")
                raise
```
+  有关 API 的详细信息，请参阅适用[DeleteTopic](https://docs.aws.amazon.com/goto/boto3/sns-2010-03-31/DeleteTopic)于 *Python 的AWS SDK (Boto3) API 参考*。

------
#### [ SAP ABAP ]

**适用于 SAP ABAP 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap/services/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
    TRY.
        lo_sns->deletetopic( iv_topicarn = iv_topic_arn ).
        MESSAGE 'SNS topic deleted.' TYPE 'I'.
      CATCH /aws1/cx_snsnotfoundexception.
        MESSAGE 'Topic does not exist.' TYPE 'E'.
    ENDTRY.
```
+  有关 API 的详细信息，请参阅适用[DeleteTopic](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)于 S *AP 的AWS SDK ABAP API 参考*。

------
#### [ Swift ]

**适用于 Swift 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/swift/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
import AWSSNS

        let config = try await SNSClient.SNSClientConfiguration(region: region)
        let snsClient = SNSClient(config: config)

        _ = try await snsClient.deleteTopic(
            input: DeleteTopicInput(topicArn: arn)
        )
```
+  有关 API 的详细信息，请参阅适用于 S *wift 的AWS SDK API 参考[DeleteTopic](https://sdk.amazonaws.com/swift/api/awssns/latest/documentation/awssns/snsclient/deletetopic(input:))*中。

------

# Amazon SNS 短信活动监控
<a name="sms_stats"></a>

通过监控您的 SMS 活动，您可以跟踪目标电话号码、成功或失败的传输、失败的原因、成本及其他信息。Amazon SNS 通过在控制台中汇总统计数据、向亚马逊 CloudWatch发送信息以及将每日短信使用报告发送到您指定的亚马逊 S3 存储桶来提供帮助。

# 查看 Amazon SNS 短信传输统计数据
<a name="sms_stats_console"></a>

您可以使用 Amazon SNS 控制台查看您近期 SMS 传输的统计数据。

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 在控制台菜单上，将区域选择器设置为[支持 SMS 消息收发的区域](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers-sms-by-country.html)。

1. 在导航面板上，选择**文本消息(SMS)**。

1. 在 **Text messaging (SMS) (文本消息(SMS))** 页面上的 **Account stats (账户统计数据)** 部分中，查看关于您的事务处理和促销 SMS 信息传输的图表。每个图表显示之前 15 天内的以下数据：
   + 传输率（成功传输的百分比）
   + 发送（传输尝试的数量）
   + 失败（传输失败的数量）

在此页面，您还可以选择 **Usage**（使用量）按钮转到存储您的每日使用情况报告的 Amazon S3 存储桶。有关更多信息，请参阅 [订阅 Amazon SNS 每日短信使用量报告](sms_stats_usage.md)。

# 使用亚马逊 CloudWatch 指标和日志监控 Amazon SNS 短信发送情况
<a name="sms_stats_cloudwatch"></a>

您可以使用 Amazon CloudWatch 和 Amaz CloudWatch on Logs 来监控您的短信发送情况。

## 查看亚马逊 CloudWatch 指标
<a name="sms_stats_cloudwatch_metrics"></a>

Amazon SNS 会自动收集有关您发送短信的指标并将其推送到亚马逊。 CloudWatch您可以使用 CloudWatch 监控这些指标并创建警报，以便在指标超过阈值时提醒您。例如，您可以监控 CloudWatch 指标以了解您的短信发送率和 month-to-date短信费用。

有关监控 CloudWatch 指标、设置 CloudWatch 警报和可用指标类型的信息，请参阅[使用监控亚马逊 SNS 主题 CloudWatch](sns-monitoring-using-cloudwatch.md)。

## 查看 CloudWatch 日志
<a name="sns-viewing-cloudwatch-logs"></a>

通过启用 Amazon SNS 写入亚马逊 CloudWatch 日志，您可以收集有关成功和不成功发送短信的信息。对于您发送的每条 SMS 消息，Amazon SNS 会写入日志，其中包括消息价格、成功或失败状态、失败原因（如果消息发送失败）、消息停留时间以及其他信息。

**启用和查看 SMS 消息的 CloudWatch 日志**

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 在控制台菜单上，将区域选择器设置为[支持 SMS 消息收发的区域](https://docs.aws.amazon.com/general/latest/gr/end-user-messaging.html)。

1. 在导航面板上，选择**文本消息(SMS)**。

1. 在**移动文本消息(SMS)** 页上，在**文本消息发送首选项**部分中，选择**编辑**。

1. 在下一页上，展开 **Delivery status logging**（传输状态日志记录）部分。

1. 对于**成功采样率**，请指定 Amazon SNS 将在日志中 CloudWatch 写入日志的成功发送短信的百分比。例如：
   + 要仅将失败传输写入日志，请将此值设为 0。
   + 要将 10% 的成功传输写入日志，请将其设为 10。

   如果您不指定百分比，Amazon SNS 会将所有成功传输写入日志。

1. 为提供所需的权限，请执行以下操作之一：
   + 要创建新的服务角色，请选择 **Create new service role**（创建新的服务角色），然后选择 **Create new roles**（创建新角色）。在下一页上，选择 **Allow**（允许）以授予 Amazon SNS 对您账户资源的写入访问权限。
   + 要使用现有服务角色，请选择 **Use existing service role**（使用现有服务角色），然后将 ARN 名称粘贴到 **IAM role for successful and failed deliveries**（成功和失败传输的 IAM 角色）框中。

     您指定的服务角色必须允许对账户资源进行写入访问。有关创建 IAM 角色的更多信息，请参阅 I *AM 用户指南*中的[为 AWS 服务创建](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-console)角色。

1. 选择**保存更改**。

1. 回到 **Mobile text messaging (SMS)**（移动文本消息 (SMS)）页面上，转至 **Delivery status logs**（传输状态日志）部分查看任何可用的日志。
**注意**  
根据目标电话号码的运营商，Amazon SNS 控制台中显示传输日志最长可能需要 72 小时。

## 成功 SMS 传输的示例日志
<a name="example-log-successful-sms-delivery"></a>

成功 SMS 传输的传输状态日志与下面的示例类似：

```
{
    "notification": {
        "messageId": "34d9b400-c6dd-5444-820d-fbeb0f1f54cf",
        "timestamp": "2016-06-28 00:40:34.558"
    },
    "delivery": {
        "phoneCarrier": "My Phone Carrier",
        "mnc": 270,
        "numberOfMessageParts": 1,
        "destination": "+1XXX5550100",
        "priceInUSD": 0.00645,
        "smsType": "Transactional",
        "mcc": 310,
        "providerResponse": "Message has been accepted by phone carrier",
        "dwellTimeMs": 599,
        "dwellTimeMsUntilDeviceAck": 1344
    },
    "status": "SUCCESS"
}
```

## 失败 SMS 传输的示例日志
<a name="example-log-failed-sms-delivery"></a>

失败 SMS 传输的传输状态日志与下面的示例类似：

```
{
    "notification": {
        "messageId": "1077257a-92f3-5ca3-bc97-6a915b310625",
        "timestamp": "2016-06-28 00:40:34.559"
    },
    "delivery": {
        "mnc": 0,
        "numberOfMessageParts": 1,
        "destination": "+1XXX5550100",
        "priceInUSD": 0.00645,
        "smsType": "Transactional",
        "mcc": 0,
        "providerResponse": "Unknown error attempting to reach phone",
        "dwellTimeMs": 1420,
        "dwellTimeMsUntilDeviceAck": 1692
    },
    "status": "FAILURE"
}
```

## SMS 传输失败的原因
<a name="sms_stats_delivery_fail_reasons"></a>

`providerResponse` 属性中提供失败的原因。SMS 消息传输失败可能是因为以下原因：
+ 被电话运营商作为垃圾消息屏蔽
+ 目的地位于阻止列表中
+ 电话号码无效
+ 消息正文无效
+ 电话运营商已屏蔽此消息
+ 电话运营商目前无法访问/不可用
+ 电话已屏蔽 SMS
+ 电话位于阻止列表中
+ 电话当前无法访问/可用
+ 电话号码已退出
+ 此传输会超过最高价格
+ 尝试联系电话时发生未知错误

# 订阅 Amazon SNS 每日短信使用量报告
<a name="sms_stats_usage"></a>

您可以通过从 Amazon SNS 订阅每日使用量报告来监控您的 SMS 消息传输。在每个您至少发送了一条 SMS 消息的日子，Amazon SNS 都将向您指定的 Amazon S3 存储桶发送 CSV 文件格式的使用情况报告。SMS 使用报告需要 24 小时才在 Amazon S3 存储桶中可用。

## 每日使用量报告信息
<a name="daily_usage_info"></a>

该使用情况报告包括通过您的账户发送的每条 SMS 消息的以下信息。

 请注意，此报告不包含发送到已选择退出的收件人的消息。
+ 消息发布时间（UTC 时间）
+ 消息 ID
+ 目标电话号码
+ 消息类型
+ 传输状态
+ 消息价格 (USD)
+ 分段编号（如果一条消息过长，则会拆分为多个分段）
+ 分段总数

**注意**  
如果 Amazon SNS 没有收到部分编号，我们将其值设置为零。

## 订阅每日使用量报告
<a name="subscribe-to-daily-usage-reports"></a>

要订阅每日使用情况报告，您必须通过适当的权限创建 Amazon S3 存储桶。

**为您的每日使用情况报告创建 Amazon S3 存储桶**

1. 从发送短信 AWS 账户 的，登录 [Amazon S3 控制台](https://console.aws.amazon.com/s3/)。

1. 选择**创建存储桶**。

1. 对于**存储桶名称**，我们建议您输入对账户和组织唯一的名称。例如，使用模式 `<my-bucket-prefix>-<account_id>-<org-id>`。

   有关存储桶名称约定和限制的信息，请参阅 *Amazon Simple Storage Service 用户指南*中的[存储桶命名规则](https://docs.aws.amazon.com/AmazonS3/latest/userguide/BucketRestrictions.html#bucketnamingrules)。

1. 选择**创建**。

1. 在 **All Buckets**（所有存储桶）表中，选择存储桶。

1. 在 **Permissions**（权限）部分中，选择 **Bucket policy**（存储桶策略）。

1. 在 **Bucket Policy Editor**（存储桶策略编辑器窗口中，提供允许 Amazon SNS 服务委托人写入您的存储桶的策略。有关示例，请参阅[存储桶策略的示例](#example_bucket_policy)。

   如果您使用示例策略，请记得*my-s3-bucket*使用您在步骤 3 中选择的存储桶名称进行替换。

1. 选择**保存**。

**订阅每日使用情况报告**

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/)。

1. 在导航面板上，选择**文本消息(SMS)**。

1. 在 **Text messaging (SMS) (文本消息收发(SMS))** 页上，在 **Text messaging preferences (文本消息收发首选项)** 部分中，选择 **Edit (编辑)**。  
![\[Amazon SNS 控制台中的“文本消息首选项”部分\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/daily-usage-report1.png)

1. 在 **Edit text messaging preferences (编辑文本消息收发首选项)** 页上，在 **Details (详细信息)** 部分中，指定 **Amazon S3 bucket name for usage reports (使用率报告的 Amazon S3 存储桶名称)**。  
![\[Amazon SNS 控制台中“编辑文本消息发送首选项”页面的“详细信息”部分\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/daily-usage-report2.png)

1. 选择**保存更改**。

### 存储桶策略的示例
<a name="example_bucket_policy"></a>

以下策略允许 Amazon SNS 服务委托人执行 `s3:PutObject`、`s3:GetBucketLocation` 和 `s3:ListBucket` 操作。

AWS 为所有服务提供工具，其服务委托人已被授予访问您账户中资源的权限。当 Amazon S3 存储桶策略声明中的主体是[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)时。要限制哪些存储桶中的哪些区域和账户可以接收每日使用情况报告，请使用 `aws:SourceArn`，如下面的示例所示。如果您不想限制可生成这些报告的区域，请使用 `aws:SourceAccount` 限制生成报告的账户。如果您不知道源的 ARN，请参阅 `aws:SourceAccount`。

在您创建 Amazon S3 存储桶以便从 Amazon SNS 接收每日 SMS 使用情况报告时，请使用以下包含混淆代理人保护的示例。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowPutObject",
            "Effect": "Allow",
            "Principal": {
                "Service": "sns.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "account_id"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:sns:us-west-1:123456789012:*"
                }
            }
        },
        {
            "Sid": "AllowGetBucketLocation",
            "Effect": "Allow",
            "Principal": {
                "Service": "sns.amazonaws.com"
            },
            "Action": "s3:GetBucketLocation",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "account_id"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:sns:us-west-1:123456789012:*"
                }
            }
        },
        {
            "Sid": "AllowListBucket",
            "Effect": "Allow",
            "Principal": {
                "Service": "sns.amazonaws.com"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "account_id"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:sns:us-west-1:123456789012:*"
                }
            }
        }
    ]
}
```

------

**注意**  
您可以将使用情况报告发布到 Amazon S3 存储桶，这些存储桶由 Amazon S3 策略中 `Condition` 元素指定的 AWS 账户 拥有。要将使用情况报告发布到其他人 AWS 账户 拥有的 Amazon S3 存储桶，请参阅[如何从另一个存储桶复制 Amazon S3 对象 AWS 账户？](https://aws.amazon.com/premiumsupport/knowledge-center/copy-s3-objects-account/) 。

### 每日使用量报告的示例
<a name="example_report"></a>

在您订阅每日使用量报告后，Amazon SNS 会每天将包含使用量数据的 CSV 文件放在以下位置：

```
<my-s3-bucket>/SMSUsageReports/<region>/YYYY/MM/DD/00x.csv.gz
```

每个文件可包含最多 50000 条记录。如果一天内的记录超出此配额，则 Amazon SNS 会添加多个文件。下面显示了一个示例报告：

```
PublishTimeUTC,MessageId,DestinationPhoneNumber,MessageType,DeliveryStatus,PriceInUSD,PartNumber,TotalParts
2016-05-10T03:00:29.476Z,96a298ac-1458-4825-a7eb-7330e0720b72,1XXX5550100,Promotional,Message has been accepted by phone carrier,0.90084,0,1
2016-05-10T03:00:29.561Z,1e29d394-d7f4-4dc9-996e-26412032c344,1XXX5550100,Promotional,Message has been accepted by phone carrier,0.34322,0,1
2016-05-10T03:00:30.769Z,98ba941c-afc7-4c51-ba2c-56c6570a6c08,1XXX5550100,Transactional,Message has been accepted by phone carrier,0.27815,0,1
```

# 为 Amazon SNS 短信收发请求支持
<a name="channels-sms-awssupport"></a>

**重要**  
《Amazon SNS 短信开发人员指南》已更新。Amazon SNS 已与 [AWS End User Messaging SMS](https://docs.aws.amazon.com/sms-voice/latest/userguide/what-is-service.html) 集成，用于传输短信。此指南包含有关如何创建、配置和管理 Amazon SNS 短信的最新信息。

使用 Amazon SNS 的某些 SMS 选项在您联系 支持 之前不适用于您的 AWS 账户。在 [AWS 支持 中心](https://console.aws.amazon.com/support/home#/)中创建一个案例来请求以下任意项目：
+ 提高您的每月短信支持阈值

  默认情况下，每月支出阈值设为 1.00 美元 (USD)。您的支出阈值决定您可以使用 Amazon SNS 发送的消息量。您可以为您的 SMS 使用案例请求符合预计的每月消息量的支出阈值。
+ 从 [SMS 沙盒](sns-sms-sandbox.md)迁移，以便您可以不受限制地发送 SMS 消息。有关更多信息，请参阅 [移出 Amazon SNS 短信沙盒](sns-sms-sandbox-moving-to-production.md)。
+ 专用[源号码](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers.html)
+ 专用[发件人 ID](https://docs.aws.amazon.com/sms-voice/latest/userguide/sender-id.html)。发送人 ID 是一个自定义 ID，它在接收人的设备上显示为发送人。例如，您可以使用自己的企业品牌让消息来源更易于识别。不同国家或地区对发件人 ID 的支持有所不同。有关更多信息，请参阅《AWS End User Messaging SMS User Guide》**中的 [Supported countries and regions for SMS messaging with AWS End User Messaging SMS](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers-sms-by-country.html)。

# 请求提升您的每月 Amazon SNS 短信支出配额
<a name="channels-sms-awssupport-spend-threshold"></a>

Amazon SNS 提供支出配额，以帮助您管理使用账户发送 SMS 所产生的每月最高成本。支出配额限制了您在遭受恶意攻击时的风险，并防止上游应用程序发送超出预期的消息。如果 Amazon SNS 确定发送 SMS 消息会产生超出当月支出配额的费用，则您可以将其配置为停止发布 SMS 消息。

为确保您的运营不受影响，我们建议申请足够高的支出配额，以支持您的生产工作负载。有关更多信息，请参阅[步骤 1：开立 Amazon SNS SMS 案例](#channels-sms-awssupport-spend-threshold-open)。收到配额后，您可以通过应用完整配额或较小的值来管理风险，如[步骤 2：更新 SMS 设置](#channels-sms-awssupport-spend-threshold-settings)中所述。通过应用一个较低的值，您可以控制您的每月支出，并在必要时选择进行纵向扩展。

**重要**  
由于 Amazon SNS 是分布式系统，它会在超过支出配额的几分钟内停止发送 SMS 消息。在此期间内，如果您继续发送短信，可能会产生超出限额的费用。

我们将所有新账户的支出限额设定为每月 1.00 美元 (USD)。此配额旨在让您测试 Amazon SNS 的消息发送功能。要申请增加您账户的短信支出配额，请在 Support Center 中提交增加配额的 AWS 案例。

**Topics**
+ [步骤 1：开立 Amazon SNS SMS 案例](#channels-sms-awssupport-spend-threshold-open)
+ [步骤 2：在 Amazon SNS 控制台中更新您的 SMS 设置](#channels-sms-awssupport-spend-threshold-settings)

## 步骤 1：开立 Amazon SNS SMS 案例
<a name="channels-sms-awssupport-spend-threshold-open"></a>

您可以在 Support Center 中提交配额增加案例，申请增加每月支出 AWS 配额。

**注意**  
请求表中的某些字段将标记“可选”。但是， 支持 需要以下步骤中提到的所有信息，才能处理您的请求。如果您没有提供所有必需的信息，可能会在处理请求期间遇到延迟。

1. 登录 AWS 管理控制台 到 [https://console.aws.amazon.com/](https://console.aws.amazon.com/)。

1. 在 **Support (支持)** 菜单上，选择 **Support Center (支持中心)**。

1. 在**您的支持案例**窗格上，选择**创建案例**。

1. 选择**想要提高服务限制？**链接，然后完成以下操作：
   + 对于**限制类型**，选择 **SNS 文本消息**。
   + （可选）对于**提供指向将发送 SMS 消息的网站或应用程序的链接**，提供有关将发送 SMS 消息的网站、应用程序或服务的信息。
   + （可选）对于**您计划发送什么类型的消息**，选择您计划使用长代码发送的消息类型：
     + **一次性密码** – 提供您的客户用于向您的网站或应用程序进行身份验证的密码的消息。
     + **促销** – 宣传您的业务或服务的非关键性消息，如特别优惠或公告。
     + **事务性** – 为客户事务提供支持的重要信息性消息，如订单确认或账户提醒。事务性消息不得包含促销或营销内容。
   + （可选）对于**您要从哪个 AWS 区域发送消息**，请选择您要从哪个区域发送消息。
   + （可选）对于**您计划将消息发送到的国家/地区**，输入您要在其中购买短代码的国家或地区。
   + （可选）在**您的客户如何选择接收您的消息**中，提供有关您的选择加入流程的详细信息。
   + （可选）在**请提供您计划用于向客户发送消息的消息模板**字段中，包括您将要使用的模板。

1. 在**请求**下，填写以下部分：
   + 对于**区域**，选择您要从中发送消息的区域。
**注意**  
**请求**部分中必须填写“区域”。即使您在**案例详情**部分中提供了这些信息，也必须在此处包含这些信息。
   + 对于**资源类型**，选择**一般限制**。
   + 对于**限制**，选择**提高账户支出阈值**。

1. 对于“新限额值”，请输入您可在每个日历月为短信支付的最高金额（以 USD 为单位）。

1. 在**案例描述**下，对于**使用情形描述**，提供以下详细信息：
   + 发送短信的公司或服务的网站或应用程序。
   + 您的网站或应用程序提供的服务以及您的短信有助于该服务的方式。
   + 用户注册以自愿接收您的网站、应用程序或其他位置上的短信的方式。

   如果您请求的支出限额（您为**新限额值**指定的值）超出 10000 美元 (USD)，请针对您要向其发送消息的每个国家/地区提供以下其他详细信息：
   + 您使用的是发件人 ID 还是短代码。如果使用的是发件人 ID，请提供：
     + 发件人 ID。
     + 此发件人 ID 是否已向该国家/地区的无线运营商注册。
   + 您的消息传递的最大预期值 transactions-per-second (TPS)。
   + 平均消息大小。
   + 您将发送到该国家/地区的消息的模板。
   + （可选）字符编码需求（如果有）。

1. （可选）如果您想提交其他任何请求，请选择**添加其他请求**。如果包含多个请求，请提供每个请求所需的信息。有关所需信息，请参阅[为 Amazon SNS 短信收发请求支持](channels-sms-awssupport.md)内的其他部分。

1. 在**联系选项**下，对于**首选联系语言**，请选择您希望接收有关此案例的通信时使用的语言。

1. 完成后，选择**提交**。

 支持 团队会在 24 小时内对您的请求做出初步回应。

为了防止我们的系统被用于发送未经请求或恶意的内容，我们要仔细考虑每个请求。如果我们可以，我们将在 24 小时内准予您的请求。但是，如果我们需要从您那里获得其他信息，则可能需要更长的时间来解决您的请求。

如果您的使用案例与我们的策略不符，我们可能无法准予您的请求。

## 步骤 2：在 Amazon SNS 控制台中更新您的 SMS 设置
<a name="channels-sms-awssupport-spend-threshold-settings"></a>

在我们通知您的每月支出配额已提升后，您必须在 Amazon SNS 控制台中调整您账户的支出配额。

**重要**  
您必须完成以下步骤，否则您的 SMS 支出限额将不会增加。

**在控制台中调整您的支出限额**

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 打开左侧导航菜单，展开**移动**，然后选择**文本消息 (SMS)**。

1. 在**移动文本消息(SMS)** 页上，在**文本消息发送首选项**部分中，选择**编辑**。

1. 在**编辑文本消息首选项**页面上的**详细信息**部分中，对于**账户支出限额**字段，输入新的 SMS 支出限额。
**注意**  
您可能会看到一条警告，指出输入的值大于默认支出限额。您可以忽略此警告。

1. 选择**保存更改**。
**注意**  
如果您收到“Invalid Parameter”（参数无效）错误，请检查 AWS Support 的联系人并确认您输入的新 SMS 支出限额正确无误。如果您仍然遇到问题，请在 Support Center 中 AWS 提出问题。

您在 支持 中心中创建案例时，请务必包括您提交的请求类型所需的所有信息。否则，支持 必须联系您以获取此信息，然后再继续。通过提交详细案例，您可帮助确保案例即时完成。有关特定类型的 SMS 请求所需的详细信息，请参阅以下主题。

 有关发件人 ID 的更多信息，请参阅《AWS End User Messaging SMS User Guide》**中的以下文档：


| AWS End User Messaging SMS 主题 | 描述 | 
| --- | --- | 
|  [请求提升支出配额](https://docs.aws.amazon.com/sms-voice/latest/userguide/awssupport-spend-threshold.html)  |  您的支出配额决定了您每月可以花多少钱通过 AWS End User Messaging SMS 发送 SMS 消息。  | 
|  [在支持中心开立案例，获取发件人 ID](https://docs.aws.amazon.com/sms-voice/latest/userguide/awssupport-sender-id.html)  |  如果您计划将消息发送到的接收人所在国家/地区需要发件人 ID，您可以通过在 支持 中心创建新的案例，请求发件人 ID。  | 

# Amazon SNS SMS 收发最佳实践
<a name="channels-sms-best-practices"></a>

**重要**  
《Amazon SNS 短信开发人员指南》已更新。Amazon SNS 已与 [AWS End User Messaging SMS](https://docs.aws.amazon.com/sms-voice/latest/userguide/what-is-service.html) 集成，用于传输短信。此指南包含有关如何创建、配置和管理 Amazon SNS 短信的最新信息。

手机用户对于未经请求的短信的容忍度往往非常低。未经请求的短信活动的响应率将几乎始终较低，因此，您的相应投资回报将会较差。

此外，手机运营商会持续审核批量短信发件人。他们会从其确定发送未经请求的消息的数量中限制或阻止消息。

发送未经请求的内容也是一种违反 [AWS 可接受使用策略](https://aws.amazon.com/aup/#No_E-Mail_or_Other_Message_Abuse)的行为。Amazon SNS 团队会定期审核 SMS 活动，而且会在出现您发送未经请求的消息的情况下限制或阻止您发送消息的能力。

最后，在许多国家、地区和司法管辖区中，对于发送未经请求的短信设有严重处罚。例如，在美国，电话消费者保护法案 (TCPA) 规定，消费者对于其收到的每条未经请求的消息都有权享有 500-1,500 美元的赔偿费用 (由发件人支付)。

本部分介绍了几个可帮助您提升客户参与度并避免代价高昂的处罚的最佳实践。但请注意，本节不包含法律建议。务必咨询律师来获取法律建议。

## 遵守法律、法规和运营商要求
<a name="channels-sms-best-practices-understand-laws"></a>

如果您违反客户所在地的法律和法规，您可能面对重大罚款和处罚。因此，务必了解您开展业务的每个国家/地区内与短信收发相关的法律。

以下列表包含一些链接，这些链接指向适用于全球主要市场内的短信通信的关键法律。
+ **美国**：1991 年《电话消费者保护法案》（简称 TCPA）适用于特定类型的短信。有关更多信息，请访问美国联邦通信委员会 (Federal Communications Commission) 网站上的[规则和法规](https://www.fcc.gov/document/telephone-consumer-protection-act-1991)。
+ **英国**：2003 年《隐私与电子通信（EC 指令）条例》（简称 PECR）适用于特定类型的短信。有关更多信息，请访问英国信息委员会办公室的网站，查看[什么是 PECR？](https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/guide-to-pecr/what-are-pecr/)。
+ **欧盟**：2002 年《隐私与电子通信条例》（有时候称为 ePrivacy 指令）适用于特定类型的短信。有关更多信息，请访问 Europa.eu 网站，查看[该法律的完整文本](http://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32002L0058)。
+ **加拿大**：《打击 Internet 和无线垃圾邮件法案》（通常称为加拿大反垃圾邮件法律或 CASL）适用于特定类型的短信。有关更多信息，请访问加拿大国会网站，查看[该法律的完整文本](http://www.parl.ca/DocumentViewer/en/40-3/bill/C-28/first-reading)。
+ **日本**：《有关特定电子邮件传输规定的法案》适用于特定类型的短信。有关更多信息，请访问日本内务与通信省 (Japanese Ministry of Internal Affairs and Communications) 网站，查看[日本的垃圾邮件应对措施](https://www.japaneselawtranslation.go.jp/en/laws/view/3767/en)。

作为发件人，即使您的公司或部门并非位于这些国家/地区之一，这些法律也可能适用于您。此列表中的某些法律最初是为解决未经请求的电子邮件或电话呼叫而制定的，但它们已被解释或扩展为同样适用于短信。其他国家/地区可能有自己的与短信传输相关的法律。请咨询您的客户所在的每个国家/地区的律师以获得法律建议。

在许多国家/地区，本地运营商具有确定哪些类型的流量可通过其网络传输的最终权力。这意味着运营商可能会对 SMS 内容施加比当地法律最低要求更严格的限制。

## 获取权限
<a name="channels-sms-best-practices-obtain-permission"></a>

在您计划发送特定类型的消息时，切勿向未明确要求接收此类消息的收件人发送消息。不要共享选择加入名单，即使在同一家公司内的部门之间也是如此。

如果收件人可以使用在线表格进行注册以接收您的消息，请添加预防系统，防止自动化脚本在人员不知道的情况下进行订阅。您还应该限制用户在单个会话中可以提交某个电话号码的次数。

当您收到短信选择加入请求时，请向收件人发送消息，要求他们确认希望接收来自您的消息。请勿在收件人确认订阅之前向其发送任何其他消息。订阅确认消息可能类似于以下示例：

`Text YES to join ExampleCorp alerts. 2 msgs/month. Msg & data rates may apply. Reply HELP for help, STOP to cancel.`

维护包含每个选择加入请求和确认的日期、时间和来源的记录。这在运营商或监管机构请求它的情况下可能会有用，并且还可以帮助您执行客户列表的例行审核。

### 选择加入工作流程
<a name="channels-sms-best-practices-obtain-permission-optin"></a>

在某些情况下（例如美国免费电话或短代码注册），移动运营商要求您提供整个选择加入工作流程的模型或屏幕截图。模型或屏幕截图必须与收件人将要完成的选择加入工作流程非常接近。

您的模型或屏幕截图应包括下面列出的所有必要披露信息，以保持最高的合规水平。

**必要的披露信息**
+ 对您将通过程序发送的消息使用场景的描述。
+ 陈述“可能会收取消息和数据费用”。
+ 说明收件人收到您的消息的频率。例如，定期消息发送程序可以说明“每周一条消息”。一次性密码或多重验证使用场景可以说明“消息频率会有变化”或“每次登录尝试一条消息”。
+ 指向您的条款和条件以及隐私策略文档的链接。

**不合规的选择加入方法的常见拒绝原因**
+ 提供的公司名称与模型或屏幕截图中提供的名称不相符。在选择加入工作流程描述中需要解释任何不明确的关系。
+ 似乎会向收件人发送消息，但事先并未征得明确同意。所有消息发送都必须征得明确同意。
+ 似乎需要接收短信才能注册服务。如果工作流程没有提供其他形式（例如，电子邮件或语音呼叫）作为选择加入消息的替代方法，则这不合规。
+ 关于选择加入的说明完全包含在服务条款中。披露内容应始终在选择加入时提交给接收人，而不是包含在关联的策略文档中。
+ 客户同意接收您发送的一种类型的消息，而您向他们发送了其他类型的文本消息。例如，他们同意接收一次性密码，但还会向其发送投票和调查消息。
+ 没有向收件人提供所需的披露信息（如上所列）。

以下示例符合移动运营商对多重验证使用场景的要求。

![\[在用户 step-by-step账户上启用多因素身份验证 (MFA) 的选择加入工作流程的模型。 ExampleCorp该过程从用户提供姓名和电子邮件等基本账户信息开始。接下来，用户决定是否启用 MFA 以提高安全性。如果启用了 MFA，用户可通过短信或电话等选项选择他们想以何种方式接收 MFA 令牌。如果用户选择短信，他们会收到一条带有验证码的短信。最后一步要求用户输入收到的验证码以确认其电话号码，从而完成选择加入流程。该模型可确保为短信合规性提供所有必要的披露。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/best-practices-usecase.png)


它包含最终的文本和图像，展示了完整的选择加入流程，并附有注释。在选择加入流程中，客户必须采取意图明确的操作来表示同意接收文本消息，且流程中包含所有必需的披露信息。

### 其他选择加入工作流程类型
<a name="channels-sms-best-practices-obtain-permission-other"></a>

在符合此处所述要求的前提下，移动运营商还会接受应用程序和网站之外的选择加入工作流程，例如口头或书面选择加入。合规的选择加入工作流程以及口头或书面脚本需要征求收件人的明确同意，允许接收特定的消息类型。这方面的例子包括客户支持座席使用的语音脚本，用来在记录到服务数据库之前征得同意，或者在宣传单上列出的电话号码。要提供这些选择加入工作流程类型的模型，您可以提供选择加入脚本、营销材料或收集号码的数据库的屏幕截图。如果选择加入的场景不明确或使用场景超过一定数量，则移动运营商可能会对这些使用场景有其他疑问。

## 不要发送到旧名单
<a name="channels-sms-best-practices-old-lists"></a>

人们经常更换电话号码。两年前已获取联系同意书的电话号码今天可能是其他人在使用。不要在新的消息发送程序中使用旧的电话号码列表；如果这样做，则可能会因为号码不再使用而导致一些消息失败，而另外一些人可能会因为不记得一开始同意过会选择退出。

## 审核客户列表
<a name="channels-sms-best-practices-audit-lists"></a>

如果要发送周期性短信活动，请定期审核您的客户列表。审核您的客户列表可确保仅接收您的消息的客户是有兴趣接收这些消息的人员。

审核您的列表时，向每个选择加入的客户发送提醒他们已订阅的消息，并为他们提供有关取消订阅的信息。提醒消息可能类似于以下示例：

`You're subscribed to ExampleCorp alerts. Msg & data rates may apply. Reply HELP for help, STOP to unsubscribe.`

## 保留记录
<a name="channels-sms-best-practices-keep-records"></a>

保留显示每位客户何时请求从您那里接收短信以及您向每位客户发送哪个消息的记录。全球许多国家和地区要求短信发件人以易于检索的方式来维护这些记录。移动运营商还可能会随时向您请求提供此信息。您所必须提供的确切信息因国家或地区而异。有关记录保留要求的更多信息，请查看您的客户所在的每个国家或地区有关商业短信收发的法规。

有时，运营商或监管机构会要求我们提供客户选择接收您的消息的证据。在这种情况下，请与您 支持 联系并提供承运人或代理机构所需的信息清单。如果您无法提供所需信息，则我们可能会暂停您发送更多短信的功能。

## 提供清晰、诚实、简洁的信息
<a name="channels-sms-best-practices-appropriate-content"></a>

SMS 是一种独特的媒介。160-的character-per-message 限制意味着您的消息必须简洁。您在其他通信渠道（例如电子邮件）中会使用的技巧可能不适用于短信渠道，甚至在与短信一起使用时可能显得不诚实或具有欺骗性。如果消息中的内容与最佳实践不一致，收件人可能会忽略您的消息；在最糟糕的情况下，移动运营商可能会将您的消息标识为垃圾消息，以后会屏蔽来自您电话号码的消息。

此部分为创建有效的短信正文提供了一些技巧和观点。

### 将自己标识为发件人
<a name="channels-sms-best-practices-appropriate-content-identify"></a>

收件人应该能够立即分辨出是您发布的消息。遵循此最佳实践的发件人会在每条消息的开头添加一个识别名称（“计划名称”）。

**请勿执行以下操作：**  
`Your account has been accessed from a new device. Reply Y to confirm.`

**试试这个：**  
`ExampleCorp Financial Alerts: You have logged in to your account from a new device. Reply Y to confirm, or STOP to opt-out.`

### 不要试图让你的消息看起来像一条 person-to-person消息
<a name="channels-sms-best-practices-appropriate-content-p2p"></a>

一些营销人员倾向于让他们的短信看起来像来自个人，从而为他们的短信增添个性化风格。但是，这种技巧可能会让您的消息看起来像是网络钓鱼尝试。

**请勿执行以下操作：**  
`Hi, this is Jane. Did you know that you can save up to 50% at Example.com? Click here for more info: https://www.example.com.`

**试试这个：**  
`ExampleCorp Offers: Save 25-50% on sale items at Example.com. Click here to browse the sale: https://www.example.com. Text STOP to opt-out.`

### 在涉及到金钱时请谨慎
<a name="channels-sms-best-practices-appropriate-content-money"></a>

诈骗者经常会利用人们省钱和获利的渴望。不要提供好得难以置信的优惠。不要利用金钱的诱惑来骗人。不要使用货币符号来指示金钱。

**请勿执行以下操作：**  
`Save big $$$ on your next car repair by going to https://www.example.com.`

**试试这个：**  
`ExampleCorp Offers: Your ExampleCorp insurance policy gets you discounts at 2300+ repair shops nationwide. More info at https://www.example.com. Text STOP to opt-out.`

### 仅使用必要的字符
<a name="channels-sms-best-practices-appropriate-content-characters"></a>

品牌通常倾向于在消息中使用 ™ 或 ® 等商标符号来保护自己的商标。但是，在 160 个字符的短信的标准字符集（称为 GSM 字母）中，不包括这些符号。当您发送某条包含这些字符的消息时，会使用不同的字符编码系统自动发送您的消息，而这一系统的每段消息仅支持 70 个字符。因此，您的消息可能会分为几段。由于您需要为发送的每段消息付费，因此发送整条消息的费用可能会超出您的预期。此外，收件人可能会收到您发来的多条连续消息，而不是一条消息。有关短信字符编码的更多信息，请参阅[Amazon SNS 中的 SMS 字符限制](#channels-sms-limitations-characters)。

**请勿执行以下操作：**  
`ExampleCorp Alerts: Save 20% when you buy a new ExampleCorp Widget® at example.com and use the promo code WIDGET.`

**试试这个：**  
`ExampleCorp Alerts: Save 20% when you buy a new ExampleCorp Widget(R) at example.com and use the promo code WIDGET.`

**注意**  
前面两个示例几乎相同，但第一个示例包含注册商标符号 (®)，它不是 GSM 字母表的一部分。因此，第一个示例作为两段消息发送，而第二个示例作为一段消息发送。

### 使用有效且安全的链接
<a name="channels-sms-best-practices-appropriate-content-links"></a>

如果您的消息包含链接，请仔细检查链接以确保链接可以正常工作。在公司网络之外的设备上测试您的链接，确保能够正确解析链接。由于 SMS 消息有 160 个字符的限制，因此 URLs 可以将很长时间分成多条消息。您应该使用重定向域名来提供简短的域名 URLs。但是，您不应使用免费的链接缩短服务（如 tinyurl.com 或 bitly.com），因为运营商倾向于过滤掉包含这些域中链接的消息。不过，只要链接指向专供贵公司或机构使用的域，您就可以使用付费的链接缩短服务。

**请勿执行以下操作：**  
`Go to https://tinyurl.com/4585y8mr today for a special offer!`

**试试这个：**  
`ExampleCorp Offers: Today only, get an exclusive deal on an ExampleCorp Widget. See https://a.co/cFKmaRG for more info. Text STOP to opt-out.`

### 限制使用的缩略语数量
<a name="channels-sms-best-practices-appropriate-content-abbrev"></a>

SMS 渠道的 160 个字符限制使一些发件人认为，他们需要在消息中大量使用缩写。但是，对许多读者来说，过度使用缩写会显得不专业，并可能导致一些用户将您的消息举报为垃圾消息。您完全可以编写流畅的消息而不过多地使用缩写。

**请勿执行以下操作：**  
`Get a gr8 deal on ExampleCorp widgets when u buy a 4-pack 2day.`

**试试这个：**  
`ExampleCorp Alerts: Today only—an exclusive deal on ExampleCorp Widgets at example.com. Text STOP to opt-out.`

## 适当地响应
<a name="channels-sms-best-practices-respond-appropriately"></a>

当收件人回复您的消息时，请确保您使用有用的信息进行响应。例如，当客户响应包含关键字“HELP”的其中一个消息时，请向他们发送有关其订阅的程序、您每月将发送的消息数量以及他们可与您取得联系以获取更多信息的方式的信息。HELP 响应可能类似于以下示例：

`HELP: ExampleCorp alerts: email help@example.com or call 425-555-0199. 2 msgs/month. Msg & data rates may apply. Reply STOP to cancel.`

当客户使用关键字“STOP”回复时，让他们了解到他们将不会接收任何消息。STOP 响应可能类似于以下示例：

`You're unsubscribed from ExampleCorp alerts. No more messages will be sent. Reply HELP, email help@example.com, or call 425-555-0199 for more info.`

## 基于参与度调整您的发送
<a name="channels-sms-best-practices-adjust-engagement"></a>

您客户的优先级可能随着时间推移而发生变化。如果客户发现您的消息不再有用，则他们可能会选择完全不再使用您的消息，或者甚至将您的消息报告为未经请求的消息。出于这些原因，您必须基于客户参与度调整您的发送活动。

对于与您的消息互动很少的客户，您应调整相应的消息发送频率。例如，如果向参与的客户每周发送消息，您可以为参与度较低的客户创建单独的每月摘要文件。

最后，从您的客户列表中删除完全未参与的客户。此步骤可防止客户对您的消息感到沮丧。这还可为您节省资金并且帮助保护您作为发件人的声誉。

## 在适当时间发送
<a name="channels-sms-best-practices-appropriate-times"></a>

仅在正常白天工作时间内发送消息。如果您在晚餐时间或午夜发送消息，则很可能您的客户将从您的列表中取消订阅以避免被打扰。此外，在您的客户无法立即响应短信时进行发送是没有意义的。

如果您将活动或旅程发送给非常多的受众，请仔细检查您的发送号码的吞吐速率。将收件人数量除以您的吞吐速率，确定向所有收件人发送消息需要多长时间。

## 避免跨通道疲劳
<a name="channels-sms-best-practices-cross-channel-fatigue"></a>

在您的活动中，如果使用多个通信通道（如电子邮件、SMS 和推送消息），请勿在每个通道中发送相同消息。当时在多个渠道中同时发送相同消息时，您的客户可能会认为您的发送行为很烦人而不是有用。

## 使用专用短代码
<a name="channels-sms-best-practices-dedicated-short-codes"></a>

如果使用短代码，请为每个品牌和每种类型的消息维护单独的短代码。例如，如果您的公司有两个品牌，请为每个品牌使用单独的短代码。同样，如果您发送事务和促销消息，请为每种类型的消息使用单独的短代码。要了解有关请求短代码的更多信息，请参阅《AWS End User Messaging SMS User Guide》**中的 [Requesting short codes for SMS messaging with AWS End User Messaging SMS](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers-request-short-code.html)。

## 验证您的目标电话号码
<a name="channels-sms-best-practices-verify-destination-numbers"></a>

当您通过 Amazon SNS 发送 SMS 消息时，您需要为发送的每段消息付费。您为每段消息支付的价格因收件人所在的国家或地区而异。有关短信定价的信息，请参阅[AWS 全球短信定价](https://aws.amazon.com/sns/sms-pricing)。

当 Amazon SNS 接受发送 SMS 消息的请求（调用 [SendMessages](https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-messages.html#SendMessages)API 的结果，或者活动或旅程启动的结果）时，您需要支付发送该消息的费用。即使预期的收件人实际上没有收到消息，您也需要支付费用。例如，如果收件人的电话号码已停用，或者您向其发送消息的号码不是有效的手机号码，但仍会向您收取发送消息的费用。

Amazon SNS 接受发送 SMS 消息的有效请求并尝试发送这些消息。因此，您应该验证向其发送消息的电话号码是否为有效的手机号码。您可以使用 AWS End User Messaging SMS 发送测试消息，以确定电话号码是否有效以及该号码的类型（例如手机、座机或 VoIP）。有关更多信息，请参阅《AWS End User Messaging SMS User Guide》**中的 [Send a test message with the SMS simulator](https://docs.aws.amazon.com/sms-voice/latest/userguide/getting-started-tutorial.html#getting-started-tutorial-step3)。

## 设计时要考虑冗余
<a name="channels-sms-best-practices-redundancy"></a>

对于任务关键型消息传送程序，我们建议您在多个 AWS 区域中配置 Amazon SNS。亚马逊 SNS 有多种版本可供选择。 AWS 区域有关已推出 Amazon SNS 的区域的完整列表，请参阅《AWS 一般参考》[https://docs.aws.amazon.com/general/latest/gr/sns.html](https://docs.aws.amazon.com/general/latest/gr/sns.html)。

您用于发送 SMS 的电话号码（包括短代码、长代码、免费电话号码和 10DLC 号码）无法跨 AWS 区域进行复制。因此，要在多个区域中使用 Amazon SNS，您必须在要使用 Amazon SNS 的每个区域中申请单独的电话号码。例如，如果您使用短代码向美国的收件人发送短信，则需要在计划使用的每个短代码中申请单独 AWS 区域 的短代码。

在某些国家/地区，您还可以使用多种类型的电话号码来增加冗余。例如，在美国，您可以请求短代码、10DLC 号码和免费电话号码。这些电话号码中的每一种都采用不同的途径向收件人发消息。提供多种电话号码类型（相同 AWS 区域 或分布在多个电话号码中 AWS 区域）可提供额外的冗余层，这有助于提高弹性。

## SMS 限额和限制
<a name="channels-sms-best-practices-limits"></a>

有关短信限额和限制，请参阅《AWS End User Messaging SMS User Guide》**中的 [SMS and MMS limits and restrictions](https://docs.aws.amazon.com/sms-voice/latest/userguide/sms-limitations.html)。

## 管理退出关键词
<a name="channels-sms-best-practices-optout-keywords"></a>

SMS 收件人可以使用他们的设备通过回复某关键字来选择不接收消息。有关更多信息，请参阅 [退出接收 SMS 消息](sms_manage.md#sms_manage_optout)。

## CreatePool
<a name="channels-sms-best-practices-createpool"></a>

使用 `CreatePool` API 操作创建新池并将指定的来源身份关联到该池。有关更多信息，请参阅 *AWS End User Messaging SMS API 参考[CreatePool](https://docs.aws.amazon.com/pinpoint/latest/apireference_smsvoicev2/API_CreatePool.html)*中的。

## PutKeyword
<a name="channels-sms-best-practices-putkeyword"></a>

使用 `PutKeyword` API 操作创建或更新发起电话号码或池的关键字配置。有关更多信息，请参阅 *AWS End User Messaging SMS API 参考[PutKeyword](https://docs.aws.amazon.com/pinpoint/latest/apireference_smsvoicev2/API_PutKeyword.html)*中的。

## 管理号码设置
<a name="channels-sms-best-practices-number-settings"></a>

要管理您向 Su AWS pport 请求并分配给帐户的专用短代码和长代码的设置，请参阅使用 AWS CLI中的[更改电话号码的功能*AWS End User Messaging SMS*](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers-change-capabilitiy.html)。

## Amazon SNS 中的 SMS 字符限制
<a name="channels-sms-limitations-characters"></a>

一条短信最多能包含 140 字节的信息。您在一条短信中可以包含的字符数取决于消息中所包含字符的类型。

如果您的消息仅使用 [GSM 03.38 字符集中的字符](#channels-sms-limitations-characters-gsm-alphabet)（也称为 GSM 7 位字母），则它最多能包含 160 个字符。如果您的消息包含 GSM 03.38 字符集以外的任何字符，则它最多可以有 70 个字符。在发送 SMS 消息时，Amazon SNS 会自动确定要使用的最有效编码。

当消息包含的字符数超过最大字符数时，消息将拆分为多个部分。将消息拆分为多个部分时，每个部分都包含有关其前面的消息部分的其他信息。当接收人的设备接收以这种方式分隔的消息部分时，它使用此附加信息来确保所有消息部分都以正确的顺序显示。根据接收人的移动运营商和设备，多条消息可能会显示为单条消息或由单独消息组成的序列。因此，每个消息部分中的字符数减少至 153 个（对于只包含 GSM 03.38 字符的消息）或 67 个（对于包含其他字符的消息）。您可以通过使用短信长度计算器工具来估算消息包含的消息部分数量，其中一些工具是在线提供的。任何消息支持的最大大小为 1,600 个 GSM 字符或 630 个非 GSM 字符。有关吞吐量和消息大小的更多信息，请参阅《Amazon Pinpoint 用户指南》**中的 [Amazon Pinpoint 中的 SMS 字符数限制](https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-limitations-mps.html)。

要查看您发送的每条消息的消息部分的数量，您应首先启用[事件流设置](https://docs.aws.amazon.com/pinpoint/latest/userguide/settings-event-streams.html)。执行此操作时，Amazon SNS 将在消息传递到接收人的移动提供商时生成一个 `_SMS.SUCCESS` 事件。`_SMS.SUCCESS` 事件记录包含名为 `attributes.number_of_message_parts` 的属性。此属性指定消息包含的消息部分的数量。

**重要**  
当您发送包含多个消息部分的消息时，您需要针对消息中包含的这些数量的消息部分付费。

### GSM 03.38 字符集
<a name="channels-sms-limitations-characters-gsm-alphabet"></a>

下表列出了 GSM 03.38 字符集中所存在的所有字符。如果您所发送的消息只包含下表中显示的字符，那么该消息最多可以包含 160 个字符。


| GSM 03.38 标准字符 | 
| --- | 
| A | B | C | D | E | F | G | H | I | J | K | L | M | 
| N | O | P | Q | R | S | T | U | V | W | X | Y | Z | 
| a | b | c | d | e | f | g | h | i | j | k | l | m | 
| n | o | p | q | r | s | t | u | v | w | x | y | z | 
| à | Å | å | Ä | ä | Ç | É | é | è | ì | Ñ | ñ | ò | 
| Ø | ø | Ö | ö | ù | Ü | ü | Æ | æ | ß | 0 | 1 | 2 | 
| 3 | 4 | 5 | 6 | 7 | 8 | 9 | & | \$1 | @ | : | , | ¤ | 
| \$1 | = | \$1 | > | \$1 | - | ¡ | ¿ | ( | < | % | . | \$1 | 
| £ | ? | " | ) | § | ; | ' | / | \$1 | ¥ | Δ | Φ | Γ | 
| Λ | Ω | Π | Ψ | Σ | Θ | Ξ |  |  |  |  |  |  | 

除上表中所示符号以外，GSM 03.38 字符集还包含其他几个符号。但是，这些字符中的每个字符都会算作两个字符，因为这些字符中还包含一个看不见的转义字符：
+ ^
+ \$1
+ \$1
+ \$1
+ [
+ ]
+ \$1
+ \$1
+ €

最后，GSM 03.38 字符集还包含以下非打印字符：
+ 空格字符。
+ 换行控制，它表示一行文本的结束和另一行文本的开始。
+ 回车控制，它会移动到一行文本的开头（通常跟在换行符后面）。
+ 转义控制，它会自动添加到前一列表中的字符中。

### 示例消息
<a name="channels-sms-limitations-characters-example-messages"></a>

本部分包含几个示例短信。对于每个示例，此部分显示消息的字符总数以及消息部分的数量。

**示例 1：只包含 GSM 03.38 字母表中的字符的长消息**  
以下消息仅包含 GSM 03.38 字母表中的字符。

`Hello Carlos. Your Example Corp. bill of $100 is now available. Autopay is scheduled for next Thursday, April 9. To view the details of your bill, go to https://example.com/bill1.`

上述消息包含 180 个字符，因此必须将其拆分为多个消息部分。将消息拆分为多个消息部分时，每个部分可以包含 153 个 GSM 03.38 字符。因此，此消息作为 2 个消息部分发送。

**示例 2：包含多字节字符的消息**  
以下消息包含多个中文字符，所有这些字符都在 GSM 03.38 字母表之外。

`亚马逊公司是一家总部位于美国西雅图的跨国电子商务企业，业务起始于线上书店，不久之后商品走向多元化。杰夫·贝佐斯于1994年7月创建了这家公司。`

上述消息包含 71 个字符。但是，由于消息中的几乎所有字符都在 GSM 03.38 字母表之外，因此它作为两个消息部分发送。每个消息部分最多可包含 67 个字符。

**示例 3：包含单个非 GSM 字符的消息**  
以下消息包含不属于 GSM 03.38 字母表的单个字符。在此示例中，该字符是一个右单引号 (’)，它是与常规撇号 (') 不同的字符。字处理应用程序（如 Microsoft Word）通常会自动用右单引号替换撇号。如果您在 Microsoft Word 中草拟 SMS 消息并将其粘贴到 Amazon SNS 中，则应删除这些特殊字符并用撇号替换它们。

`John: Your appointment with Dr. Salazar’s office is scheduled for next Thursday at 4:30pm. Reply YES to confirm, NO to reschedule.`

上述消息包含 130 个字符。但是，由于它包含右单引号字符，而此字符不是 GSM 03.38 字母表的一部分，因此它作为两个消息部分发送。

如果您将此消息中的右单引号字符替换为撇号（它是 GSM 03.38 字母表的一部分），则该消息将作为单个消息部分发送。