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

使用Amazon SNS无法向美国号码发送消息问题求助

Amazon SNS发送美国号码失败的排查与解决

针对你遇到的印度号码正常、美国号码发送失败的问题,结合代码分析,主要有几个常见问题和解决方法:

1. 电话号码格式错误

AWS SNS要求PhoneNumber参数必须是符合E.164格式的字符串,你代码中把号码定义为数字类型(+17866987580),这里的+会被当作正号处理,实际传递给SNS的是纯数字17866987580,缺少了E.164格式必需的+前缀,导致美国号码无法被正确识别。

解决方法:将号码改为字符串类型,保留+前缀:

var mobileNo = "+17866987580";

2. API版本的字符错误

你代码中apiVersion使用了中文长破折号(2010–03–31),不是标准的英文短破折号,这会导致AWS无法识别正确的API版本,进而引发请求失败。

解决方法:替换为英文短破折号:

new AWS.SNS({ apiVersion: '2010-03-31' })

3. 未指定正确的AWS区域

美国地区的SNS SMS服务通常需要指定对应区域(比如us-east-1),如果默认区域是印度区域,可能无法正常发送美国号码的短信。

解决方法:创建SNS实例时添加区域配置:

new AWS.SNS({ apiVersion: '2010-03-31', region: 'us-east-1' })

4. 美国短信合规配置缺失

美国对商业短信有严格合规要求(如TCPA),SNS发送美国号码时需要明确指定短信类型,否则可能被运营商拦截。

解决方法:在params中添加MessageAttributes指定短信类型为事务性(适合通知类内容):

var params = {
  Message: `A backflow test was completed successfully.`,
  PhoneNumber: mobileNo,
  MessageAttributes: {
    'AWS.SNS.SMS.SMSType': {
      DataType: 'String',
      StringValue: 'Transactional'
    }
  }
};

修改后的完整代码

async sendMessage(testId: number) {
    require('dotenv').config();
    
    var mobileNo = "+17866987580"; // dummy number
    
    var params = {
      Message: `A backflow test was completed successfully.`,
      PhoneNumber: mobileNo,
      MessageAttributes: {
        'AWS.SNS.SMS.SMSType': {
          DataType: 'String',
          StringValue: 'Transactional'
        }
      }
    };
    
    return new AWS.SNS({ apiVersion: '2010-03-31', region: 'us-east-1' })
      .publish(params)
      .promise()
      .then((message) => {
        console.log('Message SEND SUCCESS');
      })
      .catch((err) => {
        console.log(err);
        return err;
      });
}

另外,建议重点查看catch中打印的错误详情,AWS会返回具体的失败原因(如格式错误、权限问题、合规限制等),可以根据错误信息进一步精准排查。

内容的提问来源于stack exchange,提问作者HARI KRISHNAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:35:18