
在使用go语言的net/smtp包发送邮件时,开发者常会遇到邮件发送成功但收件人邮箱中不显示发件人信息(或显示为未知发件人)的问题,甚至导致邮件直接进入垃圾箱。这通常不是因为smtp.sendmail函数本身的问题,而是对msg参数的理解有误。
smtp.SendMail函数的msg参数并非仅仅指邮件的正文内容。它实际上期望接收一个包含完整邮件结构(包括所有必要的邮件头部信息和邮件正文)的字符串,然后将其转换为字节切片。这些头部信息,如From(发件人)、To(收件人)、Subject(主题)等,对于邮件客户端正确解析和显示邮件至关重要。
核心要点: 邮件的头部信息与邮件正文之间必须使用两个连续的换行符(\r\n\r\n)进行分隔。这是MIME邮件格式的基本要求。
为了确保邮件能够正确显示发件人信息并被邮件服务商正常处理,我们需要手动构建包含头部信息的邮件内容字符串。一个典型的邮件内容字符串结构如下:
From: 发件人名称 <发件人邮箱地址> To: 收件人邮箱地址 Subject: 邮件主题 Content-Type: text/plain; charset=UTF-8 邮件正文内容
请注意以下几点:
立即学习“go语言免费学习笔记(深入)”;
以下是一个完整的Go语言示例,演示如何使用net/smtp包发送一封包含正确发件人地址及其他头部信息的邮件:
package main
import (
"fmt"
"log"
"net/smtp"
"strings"
)
// sendEmailWithProperHeaders 函数用于发送一封带有完整头部信息的邮件
func sendEmailWithProperHeaders(
smtpHost string, // SMTP服务器主机名
smtpPort string, // SMTP服务器端口
username string, // 用于SMTP认证的用户名(通常是发件邮箱)
password string, // 用于SMTP认证的密码或授权码
fromEmail string, // 邮件From头中显示的发件人邮箱地址
fromName string, // 邮件From头中显示的发件人名称
toEmail string, // 收件人邮箱地址
subject string, // 邮件主题
body string, // 邮件正文内容
) error {
// 拼接SMTP服务器地址和端口
addr := smtpHost + ":" + smtpPort
// 创建SMTP认证器。PlainAuth需要用户名、密码和SMTP服务器主机名。
// 注意:username和password是用于SMTP服务器认证的凭据。
auth := smtp.PlainAuth("", username, password, smtpHost)
// 使用strings.Builder高效构建邮件头部和正文
msgBuilder := strings.Builder{}
// 添加邮件头部信息,每个头部字段后跟一个回车换行符(\r\n)
msgBuilder.WriteString(fmt.Sprintf("From: %s <%s>\r\n", fromName, fromEmail))
msgBuilder.WriteString(fmt.Sprintf("To: %s\r\n", toEmail))
msgBuilder.WriteString(fmt.Sprintf("Subject: %s\r\n", subject))
// 推荐添加Content-Type和Charset,避免乱码
msgBuilder.WriteString("Content-Type: text/plain; charset=UTF-8\r\n")
// 关键:头部信息与邮件正文之间使用两个回车换行符(\r\n\r\n)进行分隔
msgBuilder.WriteString("\r\n")
// 添加邮件正文
msgBuilder.WriteString(body)
// 将构建好的字符串转换为字节切片作为smtp.SendMail的msg参数
message := msgBuilder.String()
// smtp.SendMail的to参数是一个字符串切片,包含实际的收件人邮箱地址
to := []string{toEmail}
// 调用smtp.SendMail发送邮件
// 参数:SMTP服务器地址,认证信息,发件人邮箱(用于SMTP事务),收件人邮箱列表,邮件内容(含头部)
err := smtp.SendMail(addr, auth, fromEmail, to, []byte(message))
if err != nil {
return fmt.Errorf("发送邮件失败: %w", err)
}
return nil
}
func main() {
// 请替换为你的实际SMTP服务器信息和邮箱凭据
// 例如:smtp.qq.com, smtp.gmail.com, smtp.163.com
smtpHost := "smtp.example.com"
smtpPort := "587" // 常用端口:587 (TLS), 465 (SSL)
username := "your_smtp_username@example.com" // SMTP认证用户名,通常是邮箱地址
password := "your_smtp_password" // 邮箱授权码或密码(非登录密码)
// 邮件内容设置
fromEmail := "sender@example.com" // 邮件From头显示的发件人邮箱
fromName := "Go Mailer Service" // 邮件From头显示的发件人名称
toEmail := "recipient@example.com" // 收件人邮箱
subject := "Go语言SMTP邮件头部正确设置示例"
body := "您好,这是一封通过Go语言`net/smtp`发送的测试邮件。\n\n此邮件已正确设置发件人地址及其他头部信息,确保在邮件客户端中正常显示。"
// 调用函数发送邮件
err := sendEmailWithProperHeaders(
smtpHost, smtpPort, username, password,
fromEmail, fromName, toEmail, subject, body,
)
if err != nil {
log.Fatalf("邮件发送失败: %v", err)
}
fmt.Println("邮件发送成功!请检查收件箱。")
}
发件人身份与认证信息的分离:
邮件编码与MIME类型:
安全性(TLS/SSL):
错误处理:
以上就是Go语言SMTP发送邮件:正确设置发件人地址及邮件头部的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号