如何通过Amazon SNS向美国手机号发送SMS?boto3无报错但收不到消息
问题分析与解决方案
可能原因
- 始发号码属性名错误:你使用的
AWS.MM.SMS.OriginationNumber是多媒体消息(MMS)的专属属性,纯SMS场景需要用AWS.SNS.SMS.OriginationNumber,属性名写错导致始发号码未生效。美国手机号对短信发送的合规要求更严格,未正确指定合规始发号码时,消息可能被运营商拦截。 - 美国号码的A2P合规限制:美国运营商对应用到个人(A2P)的短信有强制合规要求,必须使用完成10DLC注册的号码、短码或免费电话号码发送Transactional类短信,未注册的普通长码无法正常投递到美国手机号。
- 短信内容格式问题:消息中
Your OTP包含多余空格,可能触发运营商的垃圾短信检测机制,导致消息被拦截。
修复步骤
修正始发号码属性名
将属性名改为SMS服务的正确标识AWS.SNS.SMS.OriginationNumber,同时优化消息字符串的拼接方式,去掉多余空格:sns_client = boto3.client("sns", region_name="us-west-2") try: response_sns = sns_client.publish( PhoneNumber=PhoneNo, Message=f"Hello, {first_name}. Your OTP is {str(OTP)}.", MessageAttributes={ "AWS.SNS.SMS.SMSType": { "DataType": "String", "StringValue": "Transactional", }, "AWS.SNS.SMS.OriginationNumber": { "DataType": "String", "StringValue": "+120******", }, }, ) print(response_sns) except Exception as e: print("could not send sms") print(e)确认始发号码的合规状态
- 检查你使用的+1开头始发号码是否完成了10DLC品牌和活动注册,这是美国A2P短信投递的必要条件。
- 登录AWS控制台进入SNS短信控制面板,查看美国(US)区域的短信发送限制提示,确认是否存在合规性拦截。
验证投递状态
通过CloudWatch日志或SNS短信报告功能查看美国号码的具体投递状态,若仍失败,根据返回的错误码(如MessageRejected、InvalidParameter)进一步定位问题。
内容的提问来源于stack exchange,提问作者Amit Duwal
相关产品推荐
相关产品推荐

