
在使用Go语言的net/smtp包发送邮件时,一个常见的困扰是发件人地址(From address)无法正确设置,导致邮件在接收方显示为空白或被标记为垃圾邮件。这是因为smtp.SendMail函数期望的邮件内容,实际上包含了用户自定义的头部信息和邮件正文,两者之间需要用两个换行符分隔。
构建正确的邮件内容
SMTP协议对邮件内容有特定的格式要求。除了邮件正文,还需要包含必要的头部信息,例如From(发件人地址)和Subject(邮件主题)。这些头部信息和邮件正文需要组合成一个字符串,并传递给smtp.SendMail函数。
以下是一个示例,展示了如何构建包含发件人地址和主题的邮件内容:
package main
import (
"fmt"
"log"
"net/smtp"
)
func main() {
// 邮箱配置
from := "sender@example.com" // 你的发件人邮箱
password := "your_password" // 你的邮箱密码
to := []string{"recipient@example.com"} // 收件人邮箱
// SMTP 服务器地址和端口
smtpServer := "smtp.example.com"
smtpPort := 587 // 或其他端口,例如 465
// 构建邮件内容
subject := "这是一封来自Go的测试邮件"
body := "你好,这是一封使用Go语言 net/smtp 包发送的测试邮件!"
message := fmt.Sprintf("From: %s\r\n", from)
message += fmt.Sprintf("To: %s\r\n", to[0]) // 简单起见,只取第一个收件人
message += fmt.Sprintf("Subject: %s\r\n", subject)
message += "\r\n" // 头部信息和正文之间需要一个空行
message += body
// 认证信息
auth := smtp.PlainAuth("", from, password, smtpServer)
// 发送邮件
err := smtp.SendMail(fmt.Sprintf("%s:%d", smtpServer, smtpPort), auth, from, to, []byte(message))
if err != nil {
log.Fatal(err)
}
fmt.Println("邮件发送成功!")
}代码解释:
立即学习“go语言免费学习笔记(深入)”;
- from、password、to、smtpServer、smtpPort: 这些变量用于配置你的邮箱信息、SMTP服务器地址和端口。请根据你使用的邮箱服务商进行相应的配置。
- subject 和 body: 定义了邮件的主题和正文内容。
- message: 这是构建邮件内容的关键部分。 我们使用 fmt.Sprintf 函数将 From、To、Subject 等头部信息格式化到字符串中,并在最后添加一个空行 (\r\n) 分隔头部和正文。 注意,头部信息必须以 \r\n 结尾。
- auth: 创建 SMTP 认证信息,使用 smtp.PlainAuth 函数。
- smtp.SendMail: 调用 smtp.SendMail 函数发送邮件。 注意,传递给 smtp.SendMail 函数的 msg 参数是包含头部信息的完整邮件内容。
注意事项:
- 确保你使用的邮箱服务开启了SMTP服务,并且允许通过客户端发送邮件。
- 某些邮箱服务可能需要设置“应用专用密码”才能用于SMTP认证。
- smtpServer 和 smtpPort 必须与你使用的邮箱服务商提供的SMTP服务器地址和端口匹配。
- 如果你的邮件内容包含中文,可能需要进行编码,以避免乱码问题。可以使用mime/quotedprintable包进行编码。
总结
通过正确构建包含发件人地址的邮件内容,可以避免邮件被识别为垃圾邮件,并确保收件人能够正确识别发件人。在使用net/smtp包发送邮件时,务必注意SMTP协议对邮件格式的要求,将头部信息和邮件正文正确组合,并使用合适的认证方式。










