使用AWS SNS发送SMS时移除国家代码无报错但收不到消息
AWS SNS短信无报错但无法接收(去掉国家代码时)的问题排查与解决
这其实是AWS SNS SMS服务的预期规则——它要求接收号码必须严格遵循E.164国际号码格式,也就是必须以+开头,后跟国家代码(比如印度的+91),再跟纯数字的本地号码(不能有空格、括号、短横线这类符号)。
为什么去掉国家代码会失败?
- AWS SNS依赖国家代码来确定号码归属的地区,进而路由到对应的运营商网络。如果没有国家代码,SNS根本不知道该把短信发到哪个国家的网络里,自然无法完成投递。
- 更坑的是,这种情况不会触发明显的API错误(因为请求的语法是对的,只是语义上缺少关键信息),所以你看不到报错,但短信就是发不出去。
解决方法
强制添加国家代码前缀:
如果你的用户输入的是不带国家代码的本地号码(比如印度的10位手机号),可以在代码里做预处理,自动拼接对应的国家代码。举个PHP的例子:$inputPhone = '9876543210'; // 针对印度号码的预处理逻辑 if (!str_starts_with($inputPhone, '+') && strlen($inputPhone) === 10) { $inputPhone = '+91' . $inputPhone; } $args = array( "SenderID" => "SenderName", "AWS.SNS.SMS.SMSType" => "Transactional", "Message" => "Testing", 'PhoneNumber' => $inputPhone, );如果涉及多个国家的号码,建议配合国家选择器,让用户选择所属国家后自动拼接对应前缀。
查看SNS交付报告确认原因:
即使API没返回错误,你也可以登录AWS SNS控制台,进入「短信」板块,查看「交付报告」。里面会明确显示失败原因(比如InvalidPhoneNumber或MissingCountryCode),帮你彻底确认问题。提前验证号码格式:
可以使用AWS的CheckIfPhoneNumberIsOptedOutAPI提前验证号码格式是否符合要求,或者自己写简单的格式校验逻辑,确保号码是完整的E.164格式再发送。
内容的提问来源于stack exchange,提问作者Anupam Bhatt
相关产品推荐
相关产品推荐

