Go语言通过SMTP发送邮件的实现方法
本文介绍在Go语言中如何使用标准库`net/smtp`发送电子邮件。通过封装通用函数,支持配置发件人、密码、SMTP服务器及端口、收件人列表、主题和正文内容,并提供完整的HTML格式邮件发送代码示例。
准备工作
Go语言的标准库已经内置了 `net/smtp` 包,无需安装第三方依赖即可发送邮件。在使用前,请确保你拥有以下信息:
- 发件人邮箱账号(例如:163邮箱或QQ邮箱)。
- 授权码/密码:大多数邮件服务商出于安全考虑,要求使用“授权码”而非登录密码进行SMTP认证,请在邮箱设置中开启SMTP服务并获取授权码。
- SMTP服务器地址与端口:不同服务商的SMTP服务器不同(如163为 smtp.163.com:25),常见端口包括25(明文)、465(SSL加密)或587(TLS加密)。
- 收件人列表:以分号
;分隔的邮箱字符串。
核心实现逻辑
发送步骤主要包括构建邮件认证对象、组装邮件头消息以及调用发送接口。以下为具体代码结构解析:
第1步:定义 SendMail 函数
将SMTP连接参数、邮件内容与收件人逻辑封装为一个独立函数,便于复用。需要传入用户名、密码、主机地址、收件人、主题、正文以及邮件类型(html 或 text)。
package main
import (
"net/smtp"
"fmt"
"strings"
)
// SendMail 发送邮件的核心函数
func SendMail(user, password, host, to, subject, body, mailtype string) error {
// 1. 分割主机地址与端口,提取主机名用于PlainAuth
hp := strings.Split(host, ":")
// 2. 创建简单身份验证器 (Plain Auth)
auth := smtp.PlainAuth("", user, password, hp[0])
// 3. 根据邮件类型设置 Content-Type
var content_type string
if mailtype == "html" {
content_type = "Content-Type: text/html; charset=UTF-8"
} else {
content_type = "Content-Type: text/plain; charset=UTF-8"
}
// 4. 组装完整的邮件消息体
// 包含 To, From, Subject, Headers 和 Body
msg := []byte("To: " + to + "\r\nFrom: " + user + "<" + user + ">\r\nSubject: " + subject + "\r\n" + content_type + "\r\n\r\n" + body)
// 5. 将收件人以分号拆分,准备发送给多个目标
send_to := strings.Split(to, ";")
// 6. 调用smtp.SendMail执行发送
err := smtp.SendMail(host, auth, user, send_to, msg)
return err
}
第2步:编写主程序进行测试
在 main 函数中填入真实的测试数据,发起发送请求并处理错误返回。
func main() {
user := "xxxx@163.com" // 发件人账号
password := "xxxxxx" // 发件人授权码
host := "smtp.163.com:25" // SMTP服务器及端口
to := "xxxxxxxx@gmail.com" // 收件人邮箱,多个用分号隔开
subject := "Test send email by golang"
// 构造 HTML 格式的邮件正文
body := `
<html>
<body>
<h3>
Test send email by golang
</h3>
</body>
</html>
`
fmt.Println("Attempting to send email...")
// 调用封装好的函数,指定类型为 html
err := SendMail(user, password, host, to, subject, body, "html")
if err != nil {
fmt.Println("send mail error!")
fmt.Println(err)
} else {
fmt.Println("send mail success!")
}
}
注意事项
- 端口选择:上述代码默认使用端口 25。如果服务器要求 SSL/TLS 加密连接,可能需要使用更复杂的 TLS 包装器或者调整端口策略。
- 垃圾邮件过滤:如果频繁发送相同内容或使用非企业级邮箱,可能会进入垃圾箱或被拦截。建议在邮件头中添加必要的标识,或确认域名已配置SPF/DKIM记录。
- 特殊字符编码:如果标题或正文中包含中文或其他非ASCII字符,建议使用 RFC2047 进行编码,否则接收端可能出现乱码。
总结
通过 Go 标准库 net/smtp,我们可以非常简便地实现邮件发送功能。只需注意认证信息的准确性和邮件格式的规范性,即可完成日常开发中的邮件通知需求。
以上就是Go语言通过smtp发送邮件的详细内容的详细内容,更多关于Go语言邮件模块的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













