找回密码
 立即注册
首页 业界区 业界 微读 Go 标准库 - net/mail 解析邮件地址与消息格式 ...

微读 Go 标准库 - net/mail 解析邮件地址与消息格式

押疙 2025-9-28 18:34:09
专注于 Golang 相关文章和资料的开源项目 go-home ,欢迎关注!
想要解析邮件地址或处理邮件消息?Go 的 net/mail 包提供了符合 RFC 5322 标准的邮件解析能力,让你轻松处理邮件相关的各种场景。
1. 解析邮件地址

最常见的需求就是解析邮件地址。net/mail 能智能识别各种格式:
  1. package main
  2. import (
  3.     "fmt"
  4.     "net/mail"
  5. )
  6. func main() {
  7.     // 解析带名称的邮件地址
  8.     addr, _ := mail.ParseAddress("张三 <zhangsan@example.com>")
  9.     fmt.Println(addr.Name)    // 张三
  10.     fmt.Println(addr.Address) // zhangsan@example.com
  11.    
  12.     // 解析纯邮件地址
  13.     addr2, _ := mail.ParseAddress("admin@example.com")
  14.     fmt.Println(addr2.Address) // admin@example.com
  15. }
复制代码
2. 批量解析邮件地址列表

处理群发邮件?ParseAddressList 一次搞定多个地址:
  1. addresses := "Alice , Bob <bob@example.com>, charlie@example.com"
  2. list, _ := mail.ParseAddressList(addresses)
  3. for _, addr := range list {
  4.     fmt.Printf("姓名: %s, 邮箱: %s\n", addr.Name, addr.Address)
  5. }
  6. // 输出:
  7. // 姓名: Alice, 邮箱: alice@example.com
  8. // 姓名: Bob, 邮箱: bob@example.com
  9. // 姓名: , 邮箱: charlie@example.com
复制代码
3. 读取完整邮件消息

net/mail 能解析完整的邮件消息,包括头部和正文:
  1. import (
  2.     "io"
  3.     "net/mail"
  4.     "strings"
  5. )
  6. func parseEmail(emailContent string) {
  7.     reader := strings.NewReader(emailContent)
  8.     msg, _ := mail.ReadMessage(reader)
  9.    
  10.     // 获取邮件头部信息
  11.     header := msg.Header
  12.     fmt.Println("发件人:", header.Get("From"))
  13.     fmt.Println("收件人:", header.Get("To"))
  14.     fmt.Println("主题:", header.Get("Subject"))
  15.     fmt.Println("日期:", header.Get("Date"))
  16.    
  17.     // 读取邮件正文
  18.     body, _ := io.ReadAll(msg.Body)
  19.     fmt.Println("正文:", string(body))
  20. }
复制代码
4. 解析邮件日期

邮件日期格式复杂?ParseDate 帮你转换成 Go 的 time.Time:
  1. // 解析 RFC 5322 格式的日期
  2. dateStr := "Mon, 23 Jun 2024 09:30:00 +0800"
  3. t, _ := mail.ParseDate(dateStr)
  4. fmt.Println(t.Format("2006-01-02 15:04:05"))
  5. // 输出: 2024-06-23 09:30:00
  6. // 也能处理带时区的格式
  7. dateStr2 := "23 Jun 2024 09:30:00 EST"
  8. t2, _ := mail.ParseDate(dateStr2)
  9. fmt.Println(t2.UTC())
复制代码
5. 构建邮件地址字符串

Address 类型提供了 String() 方法,能正确格式化邮件地址:
  1. addr := &mail.Address{
  2.     Name:    "技术支持",
  3.     Address: "support@example.com",
  4. }
  5. fmt.Println(addr.String())
  6. // 输出: "技术支持" <support@example.com>
  7. // 特殊字符会自动转义
  8. addr2 := &mail.Address{
  9.     Name:    `John "The Boss" Doe`,
  10.     Address: "john@example.com",
  11. }
  12. fmt.Println(addr2.String())
  13. // 输出: "John "The Boss" Doe" <john@example.com>
复制代码
6. 处理邮件头部编码

处理国际化邮件?net/mail 支持 RFC 2047 编码的头部:
  1. // 解析包含中文的邮件
  2. emailStr := `From: =?UTF-8?B?5byg5LiJ?= <zhangsan@example.com>
  3. To: lisi@example.com
  4. Subject: =?UTF-8?B?5rWL6K+V6YKu5Lu2?=
  5. 邮件正文内容`
  6. msg, _ := mail.ReadMessage(strings.NewReader(emailStr))
  7. from, _ := msg.Header.AddressList("From")
  8. fmt.Println(from[0].Name) // 能正确解析出中文名
复制代码
7. 验证邮件地址格式

利用 ParseAddress 进行邮件格式验证:
  1. func isValidEmail(email string) bool {
  2.     _, err := mail.ParseAddress(email)
  3.     return err == nil
  4. }
  5. // 测试
  6. fmt.Println(isValidEmail("user@example.com"))     // true
  7. fmt.Println(isValidEmail("invalid.email"))        // false
  8. fmt.Println(isValidEmail("user@"))                // false
复制代码
8. 提取邮件附件信息

虽然 net/mail 不直接处理附件,但能获取相关头部信息:
  1. msg, _ := mail.ReadMessage(reader)
  2. contentType := msg.Header.Get("Content-Type")
  3. // 检查是否为 multipart 消息
  4. if strings.Contains(contentType, "multipart") {
  5.     // 获取边界标识
  6.     boundary := extractBoundary(contentType)
  7.     fmt.Println("这是一个包含附件的邮件")
  8.     fmt.Println("边界标识:", boundary)
  9. }
  10. // 检查附件相关头部
  11. disposition := msg.Header.Get("Content-Disposition")
  12. if strings.Contains(disposition, "attachment") {
  13.     fmt.Println("发现附件")
  14. }
复制代码
net/mail 包虽然简单,却是处理邮件相关任务的利器。它严格遵循 RFC 标准,让你的邮件处理代码更加健壮可靠。记住,它主要用于解析邮件格式,如果需要发送邮件,你需要配合 net/smtp 包使用。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册