Amazon Simple Notification Service
开发人员指南 (API Version 2010-03-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

向多个电话号码发送 SMS 消息

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

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

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

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

  1. 通过以下网址登录 AWS 管理控制台 并打开 Amazon SNS 控制台:https://console.amazonaws.cn/sns/v2/home

  2. 在控制台菜单上,将区域选择器设置为支持 SMS 消息的区域

  3. 在导航窗格中,选择 Topics

  4. Topics 页面,选择 Create new topicCreate new topic 窗口打开。

  5. 对于 Topic name,请输入名称。

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

    Copy
    MYTOPIC> Hello World!
  7. 选择 Create topic。主题名称和 Amazon 资源名称 (ARN) 会添加到 Topics 页面的表中。

添加 SMS 订阅

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

  1. Topics 页面,选择主题 ARN。

  2. 在主题详细信息页面上,选择 Create Subscription

  3. 对于Protocol,请选择 SMS

  4. 对于 Endpoint,请输入您想要向其发送消息的电话号码。

  5. 选择 Create Subscription。订阅信息会添加至 Subscriptions 表。

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

发送消息

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

  1. 在主题详细信息页面上,选择 Publish to topic

  2. Publish a message 页面上,对于 Subject,请将该字段留空,除非您的主题包含电子邮件订阅,并且您想要同时发布到电子邮件和 SMS 订阅。您为 Subject 输入的文本将用作电子邮件的主题行。

  3. 对于 Message,请输入消息。

    有关 SMS 消息大小限制的信息,请参阅 发送 SMS 消息

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

  4. 选择 Publish message。Amazon SNS 会发送 SMS 消息并显示成功消息。

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

要使用一个 AWS 开发工具包向主题发送 SMS 消息,请使用该 SDK 中对应 Amazon SNS API 中以下请求的操作。

CreateTopic

创建您可以使用电话号码订阅的主题,然后通过向该主题发布消息,一次将消息发布到所有订阅主题的电话号码。

Subscribe

使用电话号码订阅主题。

Publish

向已订阅主题的每个电话号码发送消息。

您可以使用 MessageAttributes 参数设置消息的几个属性(例如,最高价格)。有关更多信息,请参阅 发送消息(AWS 开发工具包)

创建主题 (AWS SDK for Java)

以下示例使用 AmazonSNSClient 类的 createTopic 方法创建名为“mySNSTopic”的主题:

Copy
public static void main(String[] args) { AmazonSNSClient snsClient = new AmazonSNSClient(); String topicArn = createSNSTopic(snsClient); } 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(); }

该示例使用 getCachedResponseMetadata 方法获取请求 ID。

运行此示例时,以下内容会显示在 IDE 的控制台输出窗口中:

Copy
{TopicArn: arn:aws:sns:us-east-1:123456789012:mySNSTopic} CreateTopicRequest - {AWS_REQUEST_ID=93f7fc90-f131-5ca3-ab18-b741fef918b5}

向您的主题添加 SMS 订阅 (AWS SDK for Java)

以下示例使用 AmazonSNSClient 类的 subscribe 方法向主题添加订阅:

Copy
public static void main(String[] args) { AmazonSNSClient snsClient = new AmazonSNSClient(); String phoneNumber = "+1XXX5550100"; String topicArn = createSNSTopic(snsClient); subscribeToTopic(snsClient, topicArn, "sms", phoneNumber); } //<create SNS topic> 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); }

此示例构建 subscribeRequest 对象并将其传递给以下参数:

  • topicArn您要向其添加订阅的主题的 Amazon 资源名称 (ARN)。

  • "sms" - SMS 订阅的协议选项。

  • endpoint - 订阅主题的电话号码。

该示例使用 getCachedResponseMetadata 方法获取订阅请求的请求 ID。

运行此示例时,订阅请求的 ID 会显示在 IDE 的控制台窗口中:

Copy
SubscribeRequest - {AWS_REQUEST_ID=f38fe925-8093-5bd4-9c19-a7c7625de38c}

(可选)设置消息属性 (AWS SDK for Java)

您可以通过构建将属性键与 MessageAttributeValue 对象相关联的映射来设置消息的属性值。通过属性值来初始化每个 MessageAttributeValue 对象,并且由每个对象声明值的数据类型。以下示例将发件人 ID 设为“mySenderID”、最高价格为 0.50 USD 且 SMS 类型为 Promotional:

Copy
Map<String, MessageAttributeValue> smsAttributes = new HashMap<String, MessageAttributeValue>(); 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"));

有关消息属性的更多信息,请参阅 发送消息(AWS 开发工具包)

在发送 SMS 消息时,您的属性将应用至 PublishRequest 对象。

向主题发布消息 (AWS SDK for Java)

以下示例使用 AmazonSNSClient 类的 publish 方法向主题发布 SMS 消息:

Copy
public static void main(String[] args) { AmazonSNSClient snsClient = new AmazonSNSClient(); String message = "My SMS message"; Map<String, MessageAttributeValue> smsAttributes = new HashMap<String, MessageAttributeValue>(); //<set SMS attributes> String topicArn = createSNSTopic(snsClient); //<subscribe to topic> sendSMSMessageToTopic(snsClient, topicArn, message, smsAttributes); } //<create topic method> //<subscribe to topic method> 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); }

Amazon SNS 会尝试将该消息传输至订阅该主题的每个电话号码。

此示例构建 publishRequest 对象,并将主题作为参数传递给 Amazon 资源名称 (ARN) 和消息。publishResult 对象会捕获 Amazon SNS 返回的消息 ID。

运行此示例时,消息 ID 会显示在 IDE 控制台的输出窗口中:

Copy
{MessageId: 9b888f80-15f7-5c30-81a2-c4511a3f5229}