如何强制AWS SNS使用ASCII或GSM编码发送长短信(Go语言)
解决AWS SNS强制使用ASCII/GSM-7编码发送短信的问题
嘿,我来帮你搞定这个AWS SNS短信编码的问题!你遇到的系统始终选UC-2导致消息拆分的情况,要么是消息内容里藏着GSM-7/ASCII不支持的字符,要么是SNS的自动检测没精准识别,下面是具体的解决步骤:
1. 先排查消息内容的兼容性
首先得确认你的content里有没有GSM-7不支持的字符——哪怕一个都能触发UC-2编码。比如这些常见的“坑”:
- 特殊符号:像€、长破折号—、智能引号“”这类
- 非西欧字符:中文、日文,或者带特殊重音的欧洲字符
GSM-7包含所有ASCII字符和大部分西欧常用字符,你可以对照GSM-7字符列表检查内容,有不兼容的就替换成兼容版本。
2. 用MessageAttributes强制指定编码
如果你的内容确实全是GSM-7兼容字符,但SNS还是“固执”选UC-2,那直接在Publish请求里加MessageAttributes手动指定编码就行。AWS SNS支持通过AWS.SNS.SMS.Encoding属性设置编码,可选值是"GSM"或"UNICODE"。
修改你的Go代码如下:
svc := sns.New(newSession()) // 构建消息属性,强制使用GSM编码(兼容ASCII) messageAttrs := map[string]*sns.MessageAttributeValue{ "AWS.SNS.SMS.Encoding": { DataType: aws.String("String"), StringValue: aws.String("GSM"), }, } publishInput := &sns.PublishInput{ Message: aws.String(content), PhoneNumber: aws.String("你的目标手机号"), // 替换成实际手机号 MessageAttributes: messageAttrs, } if _, err = svc.Publish(publishInput); err != nil { // 这里处理错误逻辑 log.Printf("发送短信失败: %v", err) }
3. 额外注意事项
- 要是强制指定
GSM编码,但内容里有不兼容字符,SNS会直接返回错误,所以一定要确保内容完全符合GSM-7规范 - ASCII是GSM-7的子集,指定
GSM编码完全能覆盖ASCII内容,还能享受到160字符的单条短信容量 - 如果你严格只需要ASCII编码(仅0-127的ASCII字符),用上面的方法指定
GSM就够了,不会触发UC-2
这样调整后,SNS就会按照你指定的编码处理短信,不会再随便拆分消息啦!
内容的提问来源于stack exchange,提问作者André G. Andrade
相关产品推荐
相关产品推荐

