0

0

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

聖光之護

聖光之護

发布时间:2025-10-08 11:54:01

|

801人浏览过

|

来源于php中文网

原创

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 。头部信息之后必须是两个连续的换行符\n\n,然后才是邮件的实际正文内容。

一个典型的例子如下:

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

您好,

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

此致,
您的应用程序

Go语言实现示例

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

SuperDesign
SuperDesign

开源的UI设计AI智能体

下载

立即学习go语言免费学习笔记(深入)”;

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 " // 邮件中显示的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包进行可靠邮件发送的基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

620

2023.06.14

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

661

2023.06.21

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

474

2023.07.31

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

245

2023.08.01

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2904

2023.08.11

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

508

2023.08.11

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

313

2023.08.31

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

427

2023.09.01

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

8

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

AngularJS教程
AngularJS教程

共24课时 | 3万人学习

CSS教程
CSS教程

共754课时 | 23.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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