You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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的CheckIfPhoneNumberIsOptedOut API提前验证号码格式是否符合要求,或者自己写简单的格式校验逻辑,确保号码是完整的E.164格式再发送。

内容的提问来源于stack exchange,提问作者Anupam Bhatt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:34:17