0

0

Go语言SMTP发送邮件:正确设置发件人地址及邮件头部

心靈之曲

心靈之曲

发布时间:2025-10-08 11:46:11

|

267人浏览过

|

来源于php中文网

原创

Go语言SMTP发送邮件:正确设置发件人地址及邮件头部

Go语言net/smtp发送邮件时,常遇到发件人地址缺失导致邮件被判为垃圾邮件的问题。本文详细讲解了smtp.SendMail函数对邮件内容(msg参数)的预期格式,强调邮件头部(如From、Subject)必须与邮件正文通过双换行符\r\n\r\n分隔,并提供示例代码和注意事项,确保邮件能正确显示发件人信息并被邮件服务商正常接收。

理解net/smtp的邮件内容结构

在使用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语言免费学习笔记(深入)”;

  1. 头部格式: 每个头部字段都应遵循Header-Name: Header Value的格式。
  2. From头部: 推荐格式为发件人名称 ,例如From: Go Mailer
  3. 分隔符: 头部信息与邮件正文之间必须使用两个回车换行符(\r\n\r\n)进行分隔。单个\r\n用于分隔不同的头部字段。
  4. Content-Type: 建议添加Content-Type头部,明确邮件的类型(如text/plain或text/html)和字符编码(如UTF-8),以避免乱码问题。

Go语言示例代码

以下是一个完整的Go语言示例,演示如何使用net/smtp包发送一封包含正确发件人地址及其他头部信息的邮件:

动易拍卖程序
动易拍卖程序

功能与改进:后台新增功能:语言设置中增:繁体中文版,适合港澳台地区使用(英文版随后增加)页面广告中增:浮动文字广告,可以自己随心修改广告内容啊商品列表页面增:对商品名称可以将商品加粗,加粗加红显示,来推荐用户的商品增加邮件服务功能:对所有涉及到发送邮件的页面,都使用了邮件发送程序使程序更加的完善另外增加了对browse.asp页显示分类的管理更正了已知BUG

下载
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("邮件发送成功!请检查收件箱。")
}

注意事项与最佳实践

  1. 发件人身份与认证信息的分离:

    • smtp.PlainAuth中的username和password是用于向SMTP服务器证明发送者身份的凭据。
    • 邮件头部中的From字段(例如From: Go Mailer )是邮件接收方客户端用于显示发件人信息的。
    • smtp.SendMail的第三个参数from(在示例中是fromEmail)是SMTP协议中MAIL FROM命令使用的发件人地址,它告诉SMTP服务器邮件的实际来源。
    • 通常情况下,这三者(认证用户名、From头部邮箱、smtp.SendMail的from参数)应该保持一致,即都是你的发件邮箱地址,以确保邮件能被正确发送和识别。
  2. 邮件编码与MIME类型:

    • 为避免邮件内容出现乱码,强烈建议在邮件头部中明确指定Content-Type和charset。例如:
      • 纯文本邮件:Content-Type: text/plain; charset=UTF-8
      • HTML邮件:Content-Type: text/html; charset=UTF-8
    • 对于包含附件或复杂内容的邮件,需要构建更复杂的MIME多部分(multipart)结构,这超出了smtp.SendMail的简单msg字符串处理范围,通常需要借助第三方库(如go-gomail)或手动构建MIME结构。
  3. 安全性(TLS/SSL):

    • 在生产环境中,务必使用加密连接发送邮件,以保护传输中的数据安全。
    • SMTP服务通常通过端口587(使用STARTTLS进行加密升级)或端口465(隐式SSL/TLS)提供加密服务。
    • net/smtp.SendMail函数在连接到端口587时,如果服务器支持,可能会自动进行STARTTLS升级。但为了更严格的控制和确保加密,更推荐使用net/smtp.Dial手动建立连接,然后调用client.StartTLS()。
    • 对于端口465,通常需要使用crypto/tls包建立TLS连接,然后将该连接传递给smtp.NewClient。
  4. 错误处理:

    • 始终检查smtp.SendMail函数的返回值,及时捕获并处理可能发生的错误,例如网络问题、认证失败、SMTP服务器拒绝等。

相关专题

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

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

591

2023.06.14

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

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

638

2023.06.21

html网页制作
html网页制作

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

458

2023.07.31

html空格
html空格

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

240

2023.08.01

html是什么
html是什么

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

2850

2023.08.11

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

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

500

2023.08.11

html转txt
html转txt

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

306

2023.08.31

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

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

417

2023.09.01

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

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

相关下载

更多

精品课程

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

共46课时 | 2.7万人学习

AngularJS教程
AngularJS教程

共24课时 | 2.1万人学习

CSS教程
CSS教程

共754课时 | 17.1万人学习

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

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