SendGrid 不支持短信发送,仅提供邮件服务。其API、SDK、控制台和计费模型均无SMS功能,调用相关接口会返回404或400错误;需改用Twilio、MessageBird、Vonage或阿里云短信等原生支持SMS的服务。

SendGrid 不支持短信发送——它只提供邮件服务。想用它发营销或验证短信,这条路走不通。
为什么 SendGrid 不能发短信
SendGrid 的 API 和产品定位完全围绕电子邮件构建。其官方文档、SDK、控制台和计费模型中均无 SMS 相关接口或功能。如果你在控制台看到“SMS”字样,那属于早期被收购的 Twilio 集成遗留界面(已下线),当前 sendgrid-go SDK 中没有任何 SendSMS 或类似函数。
- 调用
POST /v3/mail/send只能发邮件,发短信会返回404 Not Found或400 Bad Request -
sendgrid-gov3.102+ 版本中,mail.NewV3MailRequest()返回的对象没有短信字段,也没有SetSmsContent()方法 - SendGrid 的 SMTP 网关、Webhook 事件类型(如
delivered、open)全部针对邮件生命周期设计
Go 项目里真正可用的短信网关替代方案
需要短信能力时,应切换到原生支持 SMS 的服务商,并在 Go 中直接集成其 REST API 或 SDK。主流且稳定的选择有:
-
Twilio:最常用,Go 官方 SDK
twilio-go维护活跃,messages.SendMessage()调用简单,支持短链、MMS、双向短信 -
MessageBird:欧洲合规强,
messagebird-go提供client.SendMessage(),支持发送状态 Webhook 回调 - Vonage(原 Nexmo)nexmo-go 已归档,应改用
vonage-go,其sms.Send()支持 Unicode 和 DLR 回执 - 国内场景可选
aliyun-openapi-go-sdk中的alisms模块,注意SendSmsRequest必须设置RegionId和SignName
Go 中集成 Twilio 发验证码的最小可行代码
避免过度封装,直接用 HTTP client + JSON 构造请求更可控(比依赖 SDK 更易调试):
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
立即学习“go语言免费学习笔记(深入)”;
func sendVerificationSMS(to, code string) error {
url := "https://api.twilio.com/2010-04-01/Accounts/" + os.Getenv("TWILIO_ACCOUNT_SID") + "/Messages.json"
data := url.Values{}
data.Set("To", to)
data.Set("From", os.Getenv("TWILIO_PHONE_NUMBER")) // E.164 格式,如 +1234567890
data.Set("Body", "Your verification code: " + code)
req, _ := http.NewRequest("POST", url, strings.NewReader(data.Encode()))
req.SetBasicAuth(os.Getenv("TWILIO_ACCOUNT_SID"), os.Getenv("TWILIO_AUTH_TOKEN"))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return fmt.Errorf("twilio api error: %d", resp.StatusCode)
}
return nil
}
关键点:
-
To和From必须是 E.164 格式(带国家码),+8613800138000合法,13800138000会失败 - Twilio 免费试用号只能发给已验证号码,生产环境需购买号码并启用地理围栏(如只允许向 CN 号码发送)
- 不要把
TWILIO_AUTH_TOKEN硬编码或写进 git,用os.LookupEnv安全读取
短信网关选型不是换个 import 路径的事——协议层、计费粒度、送达率、运营商白名单、签名审核周期,每一项都直接影响上线节奏。别在 SendGrid 控制台里找“SMS settings”,它根本不存在。

















