Go语言的net/mail包可用于解析邮件消息,支持处理邮件头、发件人、收件人及RFC 5322格式内容。通过mail.ReadMessage读取原始邮件文本并解析为*mail.Message对象,获取头部信息与正文;使用mail.ParseAddress或ParseAddressList解析单个或多个邮件地址,提取姓名与邮箱;对于中文编码的标题或名称(如=?UTF-8?B?…?=),需结合mime.DecodeWord进行解码;正文通过message.Body作为io.Reader读取。尽管net/mail不支持MIME多部分解析等复杂功能,但适用于基础邮件解析任务,复杂场景可选用github.com/emersion/go-message等第三方库。

Go语言的net/mail包提供了对邮件消息解析的支持,尤其适用于处理邮件头、发件人、收件人以及解析RFC 5322格式的邮件内容。下面介绍如何使用net/mail来解析一封原始邮件。
读取并解析原始邮件
通常你收到的邮件是一个原始文本(比如从文件或网络流中读取),你可以使用mail.ReadMessage函数来解析它。
这个函数接收一个io.Reader,返回一个*mail.Message对象,包含头部和正文。
示例代码:
package mainimport ( "fmt" "net/mail" "strings")func main() { // 模拟一封原始邮件 rawMessage := `From: sender@example.comTo: recipient@example.comSubject: 测试邮件Date: Mon, 1 Apr 2024 12:00:00 +0800Message-ID: 这是邮件正文。多行内容也可以。` // 使用 strings.NewReader 模拟输入流 reader := strings.NewReader(rawMessage) message, err := mail.ReadMessage(reader) if err != nil { fmt.Println("解析邮件失败:", err) return } // 输出邮件头信息 fmt.Println("发件人:", message.Header.Get("From")) fmt.Println("收件人:", message.Header.Get("To")) fmt.Println("主题:", message.Header.Get("Subject")) fmt.Println("日期:", message.Header.Get("Date")) fmt.Println("消息ID:", message.Header.Get("Message-ID")) // 读取正文内容 body, _ := message.Body.ReadString(-1) fmt.Println("正文:\n", body)}
解析邮件地址
邮件头中的From、To、Cc等字段通常是格式化的邮件地址,例如:"张三 "。可以使用mail.ParseAddress或mail.ParseAddressList来正确解析。
立即学习“go语言免费学习笔记(深入)”;
Otter.ai
一个自动的会议记录和笔记工具,会议内容生成和实时转录
91 查看详情
示例:解析单个地址
addr, err := mail.ParseAddress("张三 ")if err != nil { fmt.Println("解析失败:", err) return}fmt.Printf("姓名: %s, 邮箱: %s\n", addr.Name, addr.Address)// 输出: 姓名: 张三, 邮箱: john@example.com
示例:解析多个收件人
list, err := mail.ParseAddressList("Alice , Bob ")if err != nil { fmt.Println("解析失败:", err) return}for _, addr := range list { fmt.Printf("→ %s (%s)\n", addr.Address, addr.Name)}
处理中文邮件头乱码
实际邮件中,主题或名字可能经过Base64或QP编码(如=?UTF-8?B?5L2g5aW9?=)。net/mail本身不自动解码这些字段,需要结合mime包处理。
示例:解码编码的Header
import ( "mime" "fmt")encodedSubject := "=?UTF-8?B?5L2g5aW95LiW55WM?=" decodedSubject, _ := mime.DecodeWord(encodedSubject) fmt.Println(decodedSubject) // 输出: 你好世界
你可以对Subject、Name等字段使用mime.DecodeWord逐个解码。
常见用途总结
用mail.ReadMessage解析整封邮件结构 通过message.Header.Get获取标准头字段 用mail.ParseAddress(List)安全提取邮箱与姓名 配合mime.DecodeWord处理中文编码问题 正文通过message.Body以io.Reader形式读取
基本上就这些。虽然net/mail功能有限(比如不支持MIME多部分解析),但对于简单邮件文本解析已经足够实用。复杂场景建议结合第三方库如github.com/emersion/go-message。
以上就是Golang如何使用net/mail解析邮件的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1114726.html
微信扫一扫
支付宝扫一扫