向主题发布 - Amazon Simple Notification Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

向主题发布

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

向主题发送消息(控制台)

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

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

  1. 登录 Amazon SNS 控制台

  2. 在控制台菜单中,选择支持 SMS 消息的 Amazon 区域

  3. 在导航窗格中,选择 Topics (主题)

  4. Topics(主页)页面上,选择 Create topic(创建主题)。

  5. Create topic(创建主题)页面上的 Details(详细信息)下,执行以下操作:

    1. 对于 Type(类型),选择 Standard(标准)。

    2. 对于 Name(名称),输入一个主题名称。

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

      MYTOPIC> Hello World!
  6. 选择 Create topic(创建主题)。主题的名称和 Amazon Resource Name (ARN) 显示在 Topics(主题)页面。

创建 SMS 订阅

您可以使用订阅通过仅向主题发布一次消息,将 SMS 消息发送给多个收件人。

注意

当您开始使用 Amazon SNS 发送 SMS 消息时,您的 Amazon 账户位于 SMS 沙盒中。SMS 沙盒为您提供了一个安全的环境,让您可以尝试 Amazon SNS 功能,而不会拿您作为 SMS 发件人的声誉冒险。在您的账户位于 SMS 沙盒时,您可以使用 Amazon SNS 的所有功能,但您只能向已验证的目标电话号码发送 SMS 消息。有关更多信息,请参阅 SMS 沙盒

  1. 登录 Amazon SNS 控制台

  2. 在导航窗格中,选择 Subscriptions

  3. 订阅页面上,选择创建订阅

  4. Create subscription(创建订阅)页面上的 Details(详细信息)下,执行以下操作:

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

    2. 对于 Protocol(协议),选择 SMS

    3. 对于 Endpoint(终端节点),输入要订阅主题的电话号码。

  5. 选择 Create subscription(创建订阅)。订阅信息显示在 Subscriptions(订阅)页面。

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

发送邮件

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

  1. Amazon SNS 控制台中的 Topics(主题)页面上,选择要向其发送 SMS 消息的主题的名称。

  2. 在主题详细信息页面上,选择发布消息

  3. Publish message to topic(将消息发布到主题)页面上的 Message details(消息详细信息)下,执行以下操作:

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

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

  4. Message body(消息正文)下,执行以下操作:

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

    2. 对于 Message body to send to the endpoint(要发送到终端节点的消息正文),输入您的消息或每个传输协议的自定义消息。

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

      有关 SMS 消息大小配额的信息,请参阅 发布到移动电话

  5. (可选)对于 Message attributes(消息属性),添加消息元数据,如时间戳、签名和 ID。

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

向主题发送消息(Amazon 开发工具包)

要使用 Amazon 开发工具包,您必须使用您的凭证对其进行配置。有关更多信息,请参阅 Amazon 开发工具包和工具参考指南中的共享配置和凭证文件

以下代码示例显示了如何:

  • 创建 Amazon SNS 主题。

  • 使用手机号码订阅主题。

  • 向主题发布 SMS 消息,以使所有订阅的电话号码一次接收消息。

Java
SDK for Java 1.x

创建一个主题并返回其 ARN。

public static String createSNSTopic(AmazonSNSClient snsClient) { CreateTopicRequest createTopic = new CreateTopicRequest("mySNSTopic"); CreateTopicResult result = snsClient.createTopic(createTopic); System.out.println("Create topic request: " + snsClient.getCachedResponseMetadata(createTopic)); System.out.println("Create topic result: " + result); return result.getTopicArn(); }

为终端节点订阅主题。

public static void subscribeToTopic(AmazonSNSClient snsClient, String topicArn, String protocol, String endpoint) { SubscribeRequest subscribe = new SubscribeRequest(topicArn, protocol, endpoint); SubscribeResult subscribeResult = snsClient.subscribe(subscribe); System.out.println("Subscribe request: " + snsClient.getCachedResponseMetadata(subscribe)); System.out.println("Subscribe result: " + subscribeResult); }

设置消息的属性,例如发件人的 ID、最高价格及其类型。消息属性是可选的。

public static void addMessageAttributes(Map<String, MessageAttributeValue> smsAttributes) { smsAttributes.put("AWS.SNS.SMS.SenderID", new MessageAttributeValue() .withStringValue("mySenderID") //The sender ID shown on the device. .withDataType("String")); smsAttributes.put("AWS.SNS.SMS.MaxPrice", new MessageAttributeValue() .withStringValue("0.50") //Sets the max price to 0.50 USD. .withDataType("Number")); smsAttributes.put("AWS.SNS.SMS.SMSType", new MessageAttributeValue() .withStringValue("Promotional") //Sets the type to promotional. .withDataType("String")); }

向主题发布消息。消息将会发送到每个订阅者。

public static void sendSMSMessageToTopic(AmazonSNSClient snsClient, String topicArn, String message, Map<String, MessageAttributeValue> smsAttributes) { PublishResult result = snsClient.publish(new PublishRequest() .withTopicArn(topicArn) .withMessage(message) .withMessageAttributes(smsAttributes)); System.out.println(result); }

调用以前的函数以创建主题、订阅电话号码、设置消息属性以及向主题发布消息。

public static void main(String[] args) { AmazonSNSClient snsClient = new AmazonSNSClient(); String topicArn = createSNSTopic(snsClient); String phoneNumber = "+1XXX5550100"; // Specify a protocol of "sms" when subscribing a phone number. subscribeToTopic(snsClient, topicArn, "sms", phoneNumber); String message = "My SMS message"; Map<String, MessageAttributeValue> smsAttributes = new HashMap<String, MessageAttributeValue>(); addMessageAttributes(smsAttributes) sendSMSMessageToTopic(snsClient, topicArn, message, smsAttributes); }
  • GitHub 中查找说明和更多代码。