Go语言利用net/mail包解析邮件地址与消息格式

 更新时间:2025年08月28日 09:35:47   作者:MARIOW  
Go 的 net/mail 包提供了符合 RFC 5322 标准的邮件解析能力,让你轻松处理邮件相关的各种场景,下面就跟随小编一起来深入了解下具体实现吧

想要解析邮件地址或处理邮件消息?Go 的 net/mail 包提供了符合 RFC 5322 标准的邮件解析能力,让你轻松处理邮件相关的各种场景。

1. 解析邮件地址

最常见的需求就是解析邮件地址。net/mail 能智能识别各种格式:

package main

import (
    "fmt"
    "net/mail"
)

func main() {
    // 解析带名称的邮件地址
    addr, _ := mail.ParseAddress("张三 <zhangsan@example.com>")
    fmt.Println(addr.Name)    // 张三
    fmt.Println(addr.Address) // zhangsan@example.com
    
    // 解析纯邮件地址
    addr2, _ := mail.ParseAddress("admin@example.com")
    fmt.Println(addr2.Address) // admin@example.com
}

2. 批量解析邮件地址列表

处理群发邮件?ParseAddressList 一次搞定多个地址:

addresses := "Alice <alice@example.com>, Bob <bob@example.com>, charlie@example.com"
list, _ := mail.ParseAddressList(addresses)

for _, addr := range list {
    fmt.Printf("姓名: %s, 邮箱: %s\n", addr.Name, addr.Address)
}
// 输出:
// 姓名: Alice, 邮箱: alice@example.com
// 姓名: Bob, 邮箱: bob@example.com
// 姓名: , 邮箱: charlie@example.com

3. 读取完整邮件消息

net/mail 能解析完整的邮件消息,包括头部和正文:

import (
    "io"
    "net/mail"
    "strings"
)

func parseEmail(emailContent string) {
    reader := strings.NewReader(emailContent)
    msg, _ := mail.ReadMessage(reader)
    
    // 获取邮件头部信息
    header := msg.Header
    fmt.Println("发件人:", header.Get("From"))
    fmt.Println("收件人:", header.Get("To"))
    fmt.Println("主题:", header.Get("Subject"))
    fmt.Println("日期:", header.Get("Date"))
    
    // 读取邮件正文
    body, _ := io.ReadAll(msg.Body)
    fmt.Println("正文:", string(body))
}

4. 解析邮件日期

邮件日期格式复杂?ParseDate 帮你转换成 Go 的 time.Time:

// 解析 RFC 5322 格式的日期
dateStr := "Mon, 23 Jun 2024 09:30:00 +0800"
t, _ := mail.ParseDate(dateStr)
fmt.Println(t.Format("2006-01-02 15:04:05"))
// 输出: 2024-06-23 09:30:00

// 也能处理带时区的格式
dateStr2 := "23 Jun 2024 09:30:00 EST"
t2, _ := mail.ParseDate(dateStr2)
fmt.Println(t2.UTC())

5. 构建邮件地址字符串

Address 类型提供了 String() 方法,能正确格式化邮件地址:

addr := &mail.Address{
    Name:    "技术支持",
    Address: "support@example.com",
}
fmt.Println(addr.String())
// 输出: "技术支持" <support@example.com>

// 特殊字符会自动转义
addr2 := &mail.Address{
    Name:    `John "The Boss" Doe`,
    Address: "john@example.com",
}
fmt.Println(addr2.String())
// 输出: "John \"The Boss\" Doe" <john@example.com>

6. 处理邮件头部编码

处理国际化邮件?net/mail 支持 RFC 2047 编码的头部:

// 解析包含中文的邮件
emailStr := `From: =?UTF-8?B?5byg5LiJ?= <zhangsan@example.com>
To: lisi@example.com
Subject: =?UTF-8?B?5rWL6K+V6YKu5Lu2?=

邮件正文内容`

msg, _ := mail.ReadMessage(strings.NewReader(emailStr))
from, _ := msg.Header.AddressList("From")
fmt.Println(from[0].Name) // 能正确解析出中文名

7. 验证邮件地址格式

利用 ParseAddress 进行邮件格式验证:

func isValidEmail(email string) bool {
    _, err := mail.ParseAddress(email)
    return err == nil
}

// 测试
fmt.Println(isValidEmail("user@example.com"))     // true
fmt.Println(isValidEmail("invalid.email"))        // false
fmt.Println(isValidEmail("user@"))                // false

8. 提取邮件附件信息

虽然 net/mail 不直接处理附件,但能获取相关头部信息:

msg, _ := mail.ReadMessage(reader)
contentType := msg.Header.Get("Content-Type")

// 检查是否为 multipart 消息
if strings.Contains(contentType, "multipart") {
    // 获取边界标识
    boundary := extractBoundary(contentType)
    fmt.Println("这是一个包含附件的邮件")
    fmt.Println("边界标识:", boundary)
}

// 检查附件相关头部
disposition := msg.Header.Get("Content-Disposition")
if strings.Contains(disposition, "attachment") {
    fmt.Println("发现附件")
}

net/mail 包虽然简单,却是处理邮件相关任务的利器。它严格遵循 RFC 标准,让你的邮件处理代码更加健壮可靠。记住,它主要用于解析邮件格式,如果需要发送邮件,你需要配合 net/smtp 包使用。

到此这篇关于Go语言利用net/mail包解析邮件地址与消息格式的文章就介绍到这了,更多相关Go解析邮件地址与消息格式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go语言中os包的用法实战大全

    go语言中os包的用法实战大全

    Go在os中提供了文件的基本操作,包括通常意义的打开、创建、读写等操作,除此以外为了追求便捷以及性能上,Go还在io/ioutil以及bufio提供一些其他函数供开发者使用,这篇文章主要给大家介绍了关于go语言中os包用法的相关资料,需要的朋友可以参考下
    2024-02-02
  • Golang中使用JSON的一些小技巧分享

    Golang中使用JSON的一些小技巧分享

    这篇文章主要分享了Golang中使用JSON的一些小技巧,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • 浅析Go语言中Channel的各种用法

    浅析Go语言中Channel的各种用法

    这篇文章主要带大家一起来学习一下Go语言中的if语句,也就是大家口中的判断语句。文中的示例代码讲解详细,对我们学习Go语言有一定帮助,需要的可以参考一下
    2022-11-11
  • 使用Go语言进行条件编译的示例代码

    使用Go语言进行条件编译的示例代码

    Go的条件编译主要通过构建标签(build tags)和构建约束(build constraints)来实现,这些标签和约束可以让我们针对不同的操作系统、架构或特定条件编写特定代码,本文给大家介绍了如何使用Go语言进行条件编译,需要的朋友可以参考下
    2024-06-06
  • 一文带你吃透Go语言中的原子操作

    一文带你吃透Go语言中的原子操作

    原子操作是解决并发编程中共享数据访问问题的一种常见机制,下面就来和大家深入介绍原子操作的原理、用法以及在解决并发问题中的应用,需要的可以参考一下
    2023-06-06
  • golang读取文件的常用方法总结

    golang读取文件的常用方法总结

    今天小编就为大家分享一篇关于golang读取文件的常用方法总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • Go语言中多重赋值里的空白标识符的使用

    Go语言中多重赋值里的空白标识符的使用

    Go语言中,空白标识符_用于多重赋值时忽略多余值,提升代码简洁性,适用于函数返回、遍历映射、接口断言、数据库查询及通道接收等场景,下面就来介绍一下,感兴趣的可以了解一下
    2025-06-06
  • Golang最大递减数算法问题分析

    Golang最大递减数算法问题分析

    这篇文章主要介绍了Golang最大递减数算法问题分析,结合实例形式分析了Go语言数字遍历与运算相关操作技巧,需要的朋友可以参考下
    2017-01-01
  • golang环形队列实现代码示例

    golang环形队列实现代码示例

    这篇文章主要介绍了golang环形队列实现代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • golang通过反射手动实现json序列化的方法

    golang通过反射手动实现json序列化的方法

    在 Go 语言中,JSON 序列化和反序列化通常通过标准库 encoding/json 来实现,本文给大家介绍golang  通过反射手动实现json序列化的方法,感兴趣的朋友一起看看吧
    2024-12-12

最新评论