Go语言通过SMTP发送邮件的实现方法

周叙
周叙
发布时间:2026-10-14 | 2人浏览过
原创

本文介绍在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!")
	}
}

注意事项

  1. 端口选择:上述代码默认使用端口 25。如果服务器要求 SSL/TLS 加密连接,可能需要使用更复杂的 TLS 包装器或者调整端口策略。
  2. 垃圾邮件过滤:如果频繁发送相同内容或使用非企业级邮箱,可能会进入垃圾箱或被拦截。建议在邮件头中添加必要的标识,或确认域名已配置SPF/DKIM记录。
  3. 特殊字符编码:如果标题或正文中包含中文或其他非ASCII字符,建议使用 RFC2047 进行编码,否则接收端可能出现乱码。

总结

通过 Go 标准库 net/smtp,我们可以非常简便地实现邮件发送功能。只需注意认证信息的准确性和邮件格式的规范性,即可完成日常开发中的邮件通知需求。

以上就是Go语言通过smtp发送邮件的详细内容的详细内容,更多关于Go语言邮件模块的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表