Amazon Simple Notification Service服务
亚马逊的短信服务称为 Amazon Simple Notification Service (Amazon SNS),它允许您发送各种类型的通知,包括短信。
步骤1: 登录到 AWS 管理控制台。
步骤2: 在服务列表中,找到并点击 "Simple Notification Service" 或 "SNS"。
步骤3: 在 Amazon SNS 控制台中,点击左侧菜单中的 "Text messaging (SMS)"。
步骤4: 在 "Text messaging (SMS)" 页面中,点击 "Publish text message"。
步骤5: 在 "Publish text message" 页面中,填写以下信息:
- TopicARN:如果您想要向一个已存在的 SNS 主题发送短信,您可以在这里填写该主题的 ARN。否则,您可以跳过这一步。
- Phone number:填写您想要向其发送短信的手机号码。请注意,您需要在手机号码前面添加国际电话区号,例如,美国的手机号码应该以 "+1" 开头。
- Message:填写您想要发送的短信内容。
步骤6: 点击 "Publish message"。
在这个过程中,您可能需要提供一些额外的信息来完成设置,例如选择您的 AWS Region,或确认您对使用 Amazon SNS 的服务条款的接受。
还需要注意的一点是,Amazon SNS 短信服务的费用可能会根据您发送的短信数量和目标地区的不同而变化。
Java 客户端发送短信
官方文档:docs.aws.amazon.com/zh_cn/sdk-f...
由于官方文档过于繁琐,现仅将和短信服务相关的最简化配置步骤列出
导入相关依赖
要在项目AWS SDK for Java中使用,你需要在项目pom.xml
文件中将其声明为依赖关系
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.17.35</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
按需引入sns服务
xml
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sns</artifactId>
</dependency>
设置sdk凭证
SDK相关凭证是采用了AWS IAM统一认证服务,因此需要先去用户中心控制台开通相关服务
创建访问密钥
- 在 Access keys (访问密钥)部分中,选择 Create access key(创建访问密钥)。如果您已经有两个访问密钥,则此按钮将被停用,您必须先删除一个访问密钥,然后才能创建新的访问密钥。
- 在 Access key best practices & alternatives (访问密钥最佳实践和替代方法)页面上,请选择您的用例以了解可帮助您避免创建长期访问密钥的其他选项。如果您确定您的用例仍然需要访问密钥,请选择 Other (其他),然后选择 Next(下一步)。
记录好相关密钥信息,保存成credentials文件
ini
[default]
aws_access_key_id=`<value from AWS access portal>`
aws_secret_access_key=`<value from AWS access portal>`
示例发送代码
java
//从配置文件中拿出刚才保存好的证书,默认代码实例中仅提供了从系统环境中获取文件,这里自己手动指定目录随项目一起,比如相对路径为:sms/credentials
Resource resource = new ClassPathResource(awsMessageConfig.getCredentialsPath());
DefaultCredentialsProvider defaultCredentialsProvider = null;
try {
defaultCredentialsProvider = DefaultCredentialsProvider.builder()
.profileFile(ProfileFile.builder()
.content(resource.getInputStream())
.type(ProfileFile.Type.CREDENTIALS)
.build())
.build();
} catch (Exception e) {
log.info("{}",e);
}
Object areaCode = message.getMetaData().getContext().get(BusinessConsts.AREA_CODE_KEY);
//默认美区手机号
String areaCodeStr = String.valueOf(Optional.ofNullable(areaCode).orElse("1"));
SnsClient snsClient = SnsClient.builder()
//指定短信发送区域,这里和短信申请服务对应的区域保持一致
.region(Region.US_WEST_2)
.credentialsProvider(defaultCredentialsProvider)
.build();
Map<String, MessageAttributeValue> smsAttributes =
new HashMap<>(16);
//可选
smsAttributes.put("SenderID", MessageAttributeValue.builder().stringValue(awsMessageConfig.getSenderId()).dataType("String").build());
//申请的短信发送号码 pipoint服务中
smsAttributes.put("OriginationNumber", MessageAttributeValue.builder().stringValue(awsMessageConfig.getPromotionalNumber()).dataType("String").build());
//短信类型
smsAttributes.put("SMSType", MessageAttributeValue.builder().stringValue("Promotional").dataType("String").build());
//指定反馈结果
smsAttributes.put("DeliveryStatusIAMRole", MessageAttributeValue.builder().stringValue(awsMessageConfig.getDeliveryStatusIAMRole()).dataType("String").build());
PublishRequest request = PublishRequest.builder()
//短信内容
.message("Hello")
//手机号码
.phoneNumber("phoneNumber")
.messageAttributes(smsAttributes)
.build();
PublishResponse result = snsClient.publish(request);
log.info("AWS短信发送结果:{}", result);
启用短信服务监控
在示例代码中有一个属性是设置短信监控反馈账户的,即DeliveryStatusIAMRole属性,这个属性需要在AWS控制台进行开启
增加账户在sns服务下的所有权限
跳转到IAM相关页面进行角色创建,创建完成后再刚才的Cloud Watch Logs选择相关用户
选择完成以后监控服务添加完成
退出沙箱模式,申请不受限短信发送服务
在申请前,由于Amazon Pinpoint暂时无法在 US West (N. California)us-west-1开通服务,因此推荐Amazon Simple Notification Service短信也尽量别选择us-west-1区,否则申请大半个月发现服务还是用不成
提交解除限制申请
在"Text messaging (SMS)" 页面中点击退出沙箱按钮,跳转到Support Center相关页面提交申请
在 Case classification 页面中,填写以下信息:
- Limit type:选择 "SNS Text Messaging"。
- Region:选择您需要提高限额的 AWS Region。
- Limit:选择 "Desired maximum spend per month"。
- New limit value:填写您每月愿意支付的最大金额。
另外在Case description中,在和aws官方返回沟通过后,尽量去描述清楚如下内容:
- 将发送短信的网站或应用程序的链接:
- 消息类型(交易/促销/一次性密码):
- 邮件收件人所在国家/地区列表:
- 您期望每天发送的最大消息数:
- 任何有助于我们更好地了解您的用例的其他信息(这里将短信模板,应用场景业务等描述清晰):
Amazon Pinpoint 申请发送手机号
Amazon Pinpoint 提供了不同类型的电话号码,可以满足不同的发送需求。以下是这些类型的电话号码的主要区别:
- Long codes (also known as long numbers) :这是一个标准的、全球可用的电话号码。这些号码一般适用于低容量、双向的消息发送。
- Short codes:这是一个较短的、特殊的电话号码,适用于在国家或地区内的高容量消息发送。这些号码需要提前申请,并且审核过程可能需要一段时间。短码在某些国家/地区,例如美国和加拿大,可以发送高速率和高容量的消息。
- Toll-Free numbers:这是特殊的长码,允许在美国和加拿大发送中等速率的消息。它也可以用于接收短信和电话,但电话接收者不需要付费。
- Alphanumeric Sender ID:这不是一个电话号码,而是一个可以识别发信人的自定义文本。比如,您可以设置您的公司名作为 Alphanumeric Sender ID,接收者就可以看到这个 ID 而不是一个电话号码。然而,这个 ID 只能用于发送,不能用于接收短信或电话。而且并非所有国家/地区都支持这种 ID。
在对比过相关功能结果以后,我们选择Toll-Free numbers号码
申请Toll-Free numbers需要填写注册申请
美国移动运营商最近更改了政策,并将要求所有免费电话号码(TFN)完成注册流程。参阅 注册免费电话号码 了解更多信息。您可以通过访问来查看您的号码状态免费电话号码注册状态。
注册可能最多需要 15 个工作日。有关注册免费电话号码的更多信息,请参阅美国免费电话号码注册要求和流程。
在所有注册流程都完成以后,短信服务就不受相关限制了,这个过程一般要一到两周左右