要使用 Golang 实现阿里云短信发送,你需要完成以下几个步骤:
1. 安装阿里云短信 SDK: 阿里云提供了官方的 Go SDK,你需要先安装它。
2. 注册阿里云账号并开通短信服务: 如果你还没有阿里云账号,需要先注册。然后,在阿里云控制台开通短信服务,并获取 Access Key ID 和 Access Key Secret。
3. 创建短信签名和短信模板: 在短信服务控制台中,你需要创建用于发送短信的签名(例如:【你的公司名】)和短信模板(例如:您的验证码是:${code},请在3分钟内输入。)。
4. 编写 Golang 代码: 使用 SDK 编写发送短信的代码。
下面是详细的步骤和示例代码:
使用 Go Modules 来安装 SDK:bash
go get github.com/aliyun/alibaba-cloud-sdk-go/sdk
go get github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi
1. 注册阿里云账号: 访问 阿里云官网 进行注册。
2. 开通短信服务:
* 登录阿里云控制台。
* 在搜索框中搜索 “短信服务”。
* 进入短信服务页面,根据提示完成开通。
3. 获取 Access Key ID 和 Access Key Secret:
* 在阿里云控制台顶部,点击你的头像,然后选择 “AccessKey 管理”。
* 创建新的 AccessKey,并妥善保管生成的 AccessKey ID 和 AccessKey Secret。切勿将它们直接硬编码在代码中,建议使用环境变量或配置文件来管理。
1. 创建短信签名:
* 在短信服务控制台,选择 “签名管理”。
* 点击 “创建签名”,按照指引填写相关信息(例如:公司名称、业务场景等)。签名审核可能需要一些时间。
2. 创建短信模板:
* 在短信服务控制台,选择 “模板管理”。
* 点击 “创建模板”,选择模板类型(例如:验证码、通知等)。
* 填写模板名称、模板内容(使用 ${变量名} 作为占位符)、签名名称等。例如:
* 模板名称: 验证码模板
* 模板内容: 尊敬的用户,您的验证码是:${code},请在${minutes}分钟内输入。
* 签名名称: 选择你之前创建的签名。
* 模板审核也可能需要一些时间。
在你的 Golang 项目中,创建一个文件(例如:sms.go),然后添加以下代码:go
package main
import (
"fmt"
"log"
dysmsapi "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi"
)
// --- 配置信息 ---
// 建议将这些信息通过环境变量或配置文件加载,不要硬编码
const (
AccessKeyID = "YOUR_ACCESS_KEY_ID" // 替换为你的 AccessKey ID
AccessKeySecret = "YOUR_ACCESS_KEY_SECRET" // 替换为你的 AccessKey Secret
SignName = "YOUR_SIGN_NAME" // 替换为你的短信签名名称
TemplateCode = "YOUR_TEMPLATE_CODE" // 替换为你的短信模板 Code
RegionID = "cn-hangzhou" // 短信服务所在的区域,通常是 cn-hangzhou
)
// SMSClient 是一个阿里云短信服务客户端
type SMSClient struct {
client *dysmsapi.Client
}
// NewSMSClient 创建一个新的 SMSClient 实例
func NewSMSClient() (*SMSClient, error) {
client, err := dysmsapi.NewClientWithAccessKey(RegionID, AccessKeyID, AccessKeySecret)
if err != nil {
return nil, fmt.Errorf("创建阿里云短信客户端失败: %w", err)
}
return &SMSClient{client: client}, nil
}
// SendSMS 发送短信
// phoneNumber: 接收短信的手机号,多个手机号以英文逗号分隔
// templateParam: 短信模板参数,key 对应模板中的占位符,value 是具体的值
func (c *SMSClient) SendSMS(phoneNumber string, templateParam map[string]string) error {
request := dysmsapi.CreateSendSmsRequest()
request.Scheme = "https" // 必须使用 HTTPS
request.PhoneNumbers = phoneNumber
request.SignName = SignName
request.TemplateCode = TemplateCode
request.TemplateParam = templateParam.(string) // SDK 会自动处理 map[string]string 转换为 JSON string
response, err := c.client.SendSms(request)
if err != nil {
return fmt.Errorf("发送短信失败: %w", err)
}
// 检查发送结果
if !response.IsSuccess() {
return fmt.Errorf("短信发送失败,Code: %s, Message: %s, RequestId: %s", response.Code, response.Message, response.RequestId)
}
log.Printf("短信发送成功: RequestId: %s, Message: %s", response.RequestId, response.Message)
return nil
}
func main() {
// 1. 创建 SMSClient
client, err := NewSMSClient()
if err != nil {
log.Fatalf("初始化 SMSClient 失败: %v", err)
}
// 2. 准备发送短信的参数
// 手机号,这里使用一个示例手机号,请替换成真实的手机号
phoneNumber := "15000000000"
// 短信模板参数,key 必须与你在短信模板中定义的占位符名称一致
// 例如,如果模板是 "您的验证码是:${code},请在${minutes}分钟内输入。"
// 那么 templateParam 应该是 map[string]string{"code": "123456", "minutes": "3"}
templateParam := map[string]string{
"code": "654321",
"minutes": "5",
}
// 3. 发送短信
err = client.SendSMS(phoneNumber, templateParam)
if err != nil {
log.Fatalf("发送短信失败: %v", err)
}
fmt.Println("短信发送请求已发出。")
}
请注意以下几点:
* 替换占位符: 将 YOUR_ACCESS_KEY_ID, YOUR_ACCESS_KEY_SECRET, YOUR_SIGN_NAME, YOUR_TEMPLATE_CODE 替换为你实际的值。
* 敏感信息管理: 强烈建议不要将 AccessKey ID 和 Access Key Secret 直接硬编码在代码中。 更好的做法是:
* 环境变量: 在运行程序之前设置环境变量,例如:
bash
export ALIYUN_ACCESS_KEY_ID="YOUR_ACCESS_KEY_ID"
export ALIYUN_ACCESS_KEY_SECRET="YOUR_ACCESS_KEY_SECRET"
然后在代码中读取:
go
import "os"
// ...
AccessKeyID = os.Getenv("ALIYUN_ACCESS_KEY_ID")
AccessKeySecret = os.Getenv("ALIYUN_ACCESS_KEY_SECRET")
* 配置文件: 将敏感信息存储在配置文件(如 JSON, YAML, .env 文件)中,并在程序启动时加载。
* TemplateParam 的类型: 在 SendSMS 方法中,dysmsapi.CreateSendSmsRequest() 返回的 TemplateParam 字段类型是 string。SDK 会自动将 map[string]string 转换为 JSON 格式的字符串。
* response.IsSuccess(): 这是一个非常重要的检查,用于判断短信是否真的发送成功。阿里云的 API 调用成功不代表短信一定能到达用户手机,但 IsSuccess() 返回 true 通常意味着阿里云的服务端已经成功处理了你的发送请求。
* 错误处理: 代码中包含了基本的错误处理,你需要根据实际情况进行更详细的错误日志记录和处理。
* 手机号格式: 手机号需要加上国家码,例如中国的手机号需要是 +8615000000000 或 15000000000(如果 RegionID 设置正确,通常可以省略 +86)。SDK 默认支持中国大陆手机号。
1. 将上面的代码保存为一个 .go 文件(例如 sms.go)。
2. 确保你已经安装了 Go 环境。
3. 在终端中,进入到你的项目目录。
4. 运行以下命令:
bash
go run sms.go
如果一切配置正确,你将看到类似 “短信发送成功: RequestId: XXX, Message: OK” 的输出,并且目标手机号会收到短信。
* 并发发送: 如果需要发送大量短信,可以考虑使用 goroutines 来并发发送。
* 重试机制: 对于网络不稳定或阿里云服务短暂故障,可以实现一个重试机制。
* 消息队列: 对于高并发和可靠性要求极高的场景,可以将短信发送请求放入消息队列,然后由消费者异步处理。
* 配置管理: 使用 viper 等库来管理配置,使其更灵活。
* 日志记录: 使用 zap 或 logrus 等更强大的日志库来记录详细的日志信息。
希望这个详细的指南能帮助你成功实现阿里云短信发送!