首页 > 后端开发 > Golang > 正文

Go语言中正确使用smtp.SendMail发送包含“发件人”地址的邮件教程

聖光之護
发布: 2025-10-08 11:54:01
原创
787人浏览过

Go语言中正确使用smtp.SendMail发送包含“发件人”地址的邮件教程

本文旨在解决Go语言smtp.SendMail函数发送邮件时“发件人”地址缺失的问题。核心在于smtp.SendMail的body参数需包含邮件头部信息(如From、Subject)与邮件正文,两者通过双换行符分隔。正确构造邮件体是确保邮件客户端正常显示发件人信息并避免被标记为垃圾邮件的关键,这对于邮件的可靠投递至关重要。

理解smtp.SendMail的邮件体结构

在使用go语言的net/smtp包中的smtp.sendmail函数发送邮件时,一个常见的误解是其msg(消息体)参数仅指邮件的正文内容。然而,smtp.sendmail函数期望的msg参数实际上是一个包含邮件所有内容(包括邮件头部信息和邮件正文)的完整字符串。邮件头部信息(如from、to、subject、content-type等)与邮件正文之间必须通过一个空行(即两个连续的换行符\n\n)进行分隔。如果邮件头部信息(尤其是from地址)没有被正确地包含在这个msg字符串中,接收邮件的客户端通常会显示“发件人”地址为空,或者直接将邮件标记为垃圾邮件。

正确构造邮件体

要确保邮件能够正确显示发件人信息,并被邮件客户端正常处理,我们需要按照MIME邮件格式规范来构造msg字符串。其基本结构如下:

Header-Field-1: Value-1
Header-Field-2: Value-2
...
Header-Field-N: Value-N

邮件正文内容
登录后复制

其中,Header-Field-N: Value-N代表邮件的各项头部信息,例如From: Your Name <your_email@example.com>。头部信息之后必须是两个连续的换行符\n\n,然后才是邮件的实际正文内容。

一个典型的例子如下:

From: 发件人姓名 <sender@example.com>
Subject: 这是Go语言发送的一封测试邮件
Content-Type: text/plain; charset=UTF-8

您好,

这是一封来自Go语言的测试邮件正文。
请确保发件人信息已正确显示。

此致,
您的应用程序
登录后复制

Go语言实现示例

以下是一个完整的Go语言示例,展示了如何使用smtp.SendMail正确发送包含“发件人”地址的邮件:

立即进入豆包AI人工智官网入口”;

立即学习豆包AI人工智能在线问答入口”;

豆包AI编程
豆包AI编程

豆包推出的AI编程助手

豆包AI编程483
查看详情 豆包AI编程
package main

import (
    "fmt"
    "net/smtp"
    "strings"
)

func main() {
    // SMTP服务器配置
    smtpHost := "smtp.example.com" // 替换为您的SMTP服务器地址
    smtpPort := "587"              // 通常为587(TLS)或465(SSL)
    username := "your_smtp_username@example.com" // SMTP认证用户名
    password := "your_smtp_password"             // SMTP认证密码

    // 发件人与收件人信息
    from := "Your Name <sender@example.com>" // 邮件中显示的From地址
    to := []string{"recipient@example.com"} // 收件人列表
    subject := "Go语言SMTP邮件测试 - 包含发件人"
    body := "您好,\n\n这是一封来自Go语言的测试邮件正文。\n请确保发件人信息已正确显示。\n\n此致,\n您的应用程序"

    // 构造完整的邮件消息体
    // 邮件头部信息与邮件正文之间用双换行符分隔
    msg := []byte(strings.Join([]string{
        "From: " + from,
        "To: " + strings.Join(to, ","),
        "Subject: " + subject,
        "Content-Type: text/plain; charset=UTF-8", // 声明邮件内容类型和编码
        "", // 头部与正文之间的空行
        body,
    }, "\r\n")) // 使用CRLF作为行结束符,符合SMTP规范

    // SMTP认证
    auth := smtp.PlainAuth("", username, password, smtpHost)

    // 发送邮件
    err := smtp.SendMail(smtpHost+":"+smtpPort, auth, username, to, msg)
    if err != nil {
        fmt.Printf("发送邮件失败: %v\n", err)
        return
    }

    fmt.Println("邮件发送成功!")
}
登录后复制

代码解释:

  1. smtpHost, smtpPort, username, password: 这些是连接到SMTP服务器所需的凭据和地址。请务必替换为您的实际信息。
  2. from: 这是邮件中实际显示给收件人的“发件人”地址,格式通常为"显示名称 <邮箱地址>"。
  3. to: 收件人邮箱地址列表。
  4. subject: 邮件主题。
  5. body: 邮件的正文内容。
  6. msg的构造: 这是最关键的部分。我们通过strings.Join将所有邮件头部字段(包括From、To、Subject和Content-Type)与邮件正文连接起来。注意,在所有头部字段之后,我们特意加入了一个空字符串"",它在strings.Join后会生成一个额外的\r\n,从而形成\r\n\r\n(双换行符),将头部与正文分隔开。
  7. Content-Type: text/plain; charset=UTF-8: 强烈建议指定邮件内容的类型和字符编码,特别是当邮件包含非ASCII字符(如中文)时,这能确保邮件在各种客户端中正确显示。
  8. smtp.PlainAuth: 使用PlainAuth进行SMTP认证。请注意,PlainAuth的username参数通常是您SMTP账户的登录邮箱或指定用户名,它与From头部字段中的发件人邮箱可以相同也可以不同,具体取决于您的SMTP服务提供商的策略。在smtp.SendMail的第三个参数中,传入的from地址是PlainAuth的username,这告诉SMTP服务器哪个用户正在尝试发送邮件。
  9. smtp.SendMail: 执行邮件发送操作。参数依次为:SMTP服务器地址(包含端口)、认证信息、实际发送邮件的账户(通常是username)、收件人列表以及构造好的msg字节切片。

重要注意事项

  1. PlainAuth用户名与From地址的区别:smtp.PlainAuth中的username是用于SMTP服务器认证的凭据,它标识了发送邮件的用户身份。而邮件体中的From头部字段是邮件内容的一部分,它告诉接收邮件客户端邮件的来源。这两个地址在很多情况下会相同,但并非强制要求。某些SMTP服务允许用户以其他邮箱地址作为From地址发送邮件(即“代发”),前提是该邮箱地址已通过验证。
  2. 编码问题:如果邮件内容包含非ASCII字符(如中文),务必在邮件头部声明Content-Type: text/plain; charset=UTF-8(或text/html等),并确保您的Go程序以UTF-8编码处理字符串。否则,邮件内容可能会显示为乱码。
  3. 行结束符:SMTP协议标准建议使用CRLF(\r\n)作为行结束符。虽然许多邮件服务器也能处理LF(\n),但为了最佳兼容性,建议使用\r\n。
  4. 防垃圾邮件:正确设置From地址只是第一步。为了避免邮件被标记为垃圾邮件,您可能还需要配置SPF、DKIM和DMARC记录,这些是域名级的邮件认证机制,能有效提升邮件的投递率和可信度。
  5. 错误处理:在实际应用中,务必对smtp.SendMail的返回值进行错误检查,以便及时发现和处理发送失败的情况。

总结

通过本文的讲解和示例,我们明确了Go语言smtp.SendMail函数在发送邮件时,必须将邮件头部信息(包括From地址)与邮件正文一同构造到msg参数中,并通过双换行符\n\n进行分隔。遵循这一规范不仅能确保邮件客户端正确显示发件人信息,还能有效提高邮件的投递成功率,避免被误判为垃圾邮件。理解并正确应用邮件体结构是使用net/smtp包进行可靠邮件发送的基础。

以上就是Go语言中正确使用smtp.SendMail发送包含“发件人”地址的邮件教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号