go语言发送smtp邮件的实现示例
#代码知识 发布时间: 2026-01-12
最近看了下go发送smtp邮件,于是总结一下

简单示例
先上一个最简单的代码 (网上搂的代码改了改)
package main
import (
"fmt"
"net/smtp"
)
const (
// 邮件服务器地址
SMTP_MAIL_HOST = "smtp.qq.com"
// 端口
SMTP_MAIL_PORT = "587"
// 发送邮件用户账号
SMTP_MAIL_USER = "1348581672@qq.com"
// 授权密码
SMTP_MAIL_PWD = "xxxx"
// 发送邮件昵称
SMTP_MAIL_NICKNAME = "lewis"
)
func main() {
//声明err, subject,body类型,并为address,auth以及contentType赋值,
//subeject是主题,body是邮件内容, address是收件人
var err error
var subject, body string
address := "lewissunp@outlook.com"
auth := smtp.PlainAuth("", SMTP_MAIL_USER, SMTP_MAIL_PWD, SMTP_MAIL_HOST)
contentType := "Content-Type: text/html; charset=UTF-8"
//要发送的消息,可以直接写在[]bytes里,但是看着太乱,因此使用格式化
s := fmt.Sprintf("To:%s\r\nFrom:%s<%s>\r\nSubject:%s\r\n%s\r\n\r\n%s",
address, SMTP_MAIL_NICKNAME, SMTP_MAIL_USER, subject, contentType, body)
msg := []byte(s)
//邮件服务地址格式是"host:port",因此把addr格式化为这个格式,直接赋值也行。
addr := fmt.Sprintf("%s:%s", SMTP_MAIL_HOST, SMTP_MAIL_PORT)
//发送邮件
err = smtp.SendMail(addr, auth, SMTP_MAIL_USER, []string{address}, msg)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("send email succeed")
}
}
收到邮件截图
简要说明
- const中SMTP_MAIL_PWD 是我申请开通qq邮箱的smtp服务时,腾讯发来的密码,并不是qq邮箱的密码。
- 可以看到邮件截图中显示(无主题),邮件也没内容,因为subeject和body我只声明了,但并未赋值,因此这俩为空。
- contentType设为text/html,当然也有其他格式。
- 其余的注释里应该说的比较清楚了
稍加改进
我们来加点常用的功能
- 收件人有多个
- 当然还得设置主题和邮件内容
- 发邮件功能单独封装为一个函数,然后main里调用
package main
import (
"fmt"
"net/smtp"
)
const (
// 邮件服务器地址
SMTP_MAIL_HOST = "smtp.qq.com"
// 端口
SMTP_MAIL_PORT = "587"
// 发送邮件用户账号
SMTP_MAIL_USER = "1348581672@qq.com"
// 授权密码
SMTP_MAIL_PWD = "jhguvicvhrnwgaeh"
// 发送邮件昵称
SMTP_MAIL_NICKNAME = "lewis"
)
func main() {
address := []string{"norton_s@qq.com", "lewissunp@outlook.com"}
subject := "test mail"
body :=
`<br>hello!</br>
<br>this is a test email, pls ignore it.</br>`
SendMail(address, subject, body)
}
func SendMail(address []string, subject, body string) (err error) {
// 认证, content-type设置
auth := smtp.PlainAuth("", SMTP_MAIL_USER, SMTP_MAIL_PWD, SMTP_MAIL_HOST)
contentType := "Content-Type: text/html; charset=UTF-8"
// 因为收件人,即address有多个,所以需要遍历,挨个发送
for _, to := range address {
s := fmt.Sprintf("To:%s\r\nFrom:%s<%s>\r\nSubject:%s\r\n%s\r\n\r\n%s", to, SMTP_MAIL_NICKNAME, SMTP_MAIL_USER, subject, contentType, body)
msg := []byte(s)
addr := fmt.Sprintf("%s:%s", SMTP_MAIL_HOST, SMTP_MAIL_PORT)
err = smtp.SendMail(addr, auth, SMTP_MAIL_USER, []string{to}, msg)
if err != nil {
return err
}
}
return err
}
收到邮件截图
简要说明
- 收件人是两个,都收到了
- subject有了
- body使用了br标签换行,直接在``内化换行试了下不行
- 另外如果发邮件报错:550 Mailbox not found or access denied,百度会发现是:您要发送的收件人短时间内收到大量邮件,为避免受到恶意攻击,暂时禁止向该收件人发信,但其实收件人的地址不存在时也会报这个错误。
上一篇 : Openlayers+EasyUI Tree动态实现图层控制
下一篇 : Spring如何集成ibatis项目并实现dao层基类封装
-
SEO外包最佳选择国内专业的白帽SEO机构,熟知搜索算法,各行业企业站优化策略!
SEO公司
-
可定制SEO优化套餐基于整站优化与品牌搜索展现,定制个性化营销推广方案!
SEO套餐
-
SEO入门教程多年积累SEO实战案例,从新手到专家,从入门到精通,海量的SEO学习资料!
SEO教程
-
SEO项目资源高质量SEO项目资源,稀缺性外链,优质文案代写,老域名提权,云主机相关配置折扣!
SEO资源
-
SEO快速建站快速搭建符合搜索引擎友好的企业网站,协助备案,域名选择,服务器配置等相关服务!
SEO建站
-
快速搜索引擎优化建议没有任何SEO机构,可以承诺搜索引擎排名的具体位置,如果有,那么请您多注意!专业的SEO机构,一般情况下只能确保目标关键词进入到首页或者前几页,如果您有相关问题,欢迎咨询!