微读 Go 标准库 - net/mail 解析邮件地址与消息格式
专注于 Golang 相关文章和资料的开源项目 go-home ,欢迎关注!
想要解析邮件地址或处理邮件消息?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 解析邮件地址与消息格式的更多相关文章
- Python常用的标准库以及第三方库有哪些?
20个必不可少的Python库也是基本的第三方库 读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz ...
- Python常用的标准库以及第三方库
Python常用的标准库以及第三方库有哪些? 20个必不可少的Python库也是基本的第三方库 读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们 ...
- Python 常用的标准库以及第三方库有哪些?
作者:史豹链接:https://www.zhihu.com/question/20501628/answer/223340838来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- python标准库00 学习准备
Python标准库----走马观花 python有一套很有用的标准库.标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以 ...
- Python 标准库、第三方库
Python 标准库.第三方库 Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具.这些库可用于文件读写 ...
- 【c++ Prime 学习笔记】第17章 标准库特殊设施
17.1 tuple类型 tuple是类似pair的模板: pair和tuple的成员类型都可以不相同 pair恰好有两个成员,tuple可有任意数量的成员 按照不同参数数量和类型实例化出的tuple ...
- 【python】标准库的大致认识
正如那句 Python 社区中很有名的话所说的:“battery included”,Python 的一大好处在于它有一套很有用的标准库(standard library).标准库是随着 Python ...
- Python标准库——走马观花
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python有一套很有用的标准库(standard library).标准库会随着 ...
- stm32存储器映像和标准库中定义外设地址的方法
结合存储器映像理解stm32标准库中定义外设地址的方法. stm32f103zet6是32位的.它所能访问的地址空间范围为2^32=4GB,把4GB分为8个block,分别为block0-block- ...
- C语言-12-日期和时间处理标准库详细解析及示例
概述 标准库 提供了用于日期和时间处理的结构和函数 是C++语言日期和时间处理的基础 与时间相关的类型 clock_t,本质是:unsigned long typedef unsigned long ...
随机推荐
- 100万QPS短链系统如何设计?
前言 凌晨两点,监控大屏突然飙红--短链服务QPS突破80万! 数据库连接池告急,Redis集群响应延迟突破500ms. 这不是演习,而是某电商平台大促的真实场景. 当每秒百万级请求涌向你的短链服务, ...
- Centos设置Redis自启动(Systemd)
前言 在生产环境中,我们在设置Redis服务自启动时有多种方式,这里采用Systemd管理方式进行设置Redis, Systemd管理起centos7版本中使用了systemd,systemd同时兼容 ...
- Vertx Mysql数据库优化 (七)
项目github地址:https://github.com/fotocj007/VertxWebApi 前一章节完成了mysql客户端的链接和基本重新,每次重新都需要写sql语句,这章优化一下mysq ...
- C#:从反编译的代码来看record类型
从C#9开始,可以使用record关键字来定义一个具有不可变属性的引用类型,编译器会为该类型生成大量的模板代码.C#10以后,record struct用来定义值类型,record class或rec ...
- Github 2FA验证的解决方法
当前使用GitHub需要启用 2FA 验证,也就是除了账号密码外还有一个实时码,需要额外输入这个正确的实时码才能开启 2FA 验证和后续登陆. 浏览器插件 这是目前我在使用的方法.在浏览器中添加一个叫 ...
- 【6】树的DFS序、直径、重心
前言 树上操作是 OI 重要的一环,树的 DFS 序.直径.重心这一堆东西也是树上操作的基础.树的 DFS 序可以把树上问题转化为区间问题,树的直径的性质经常是解题的关键,树的重心可以防止一些树上算法 ...
- JF 笔试 反思
ifconfig 是 window ipconfig 是 linux下的 搞混了 还有子网的信息,不清楚 有空看吧 所谓的Virtual Judge是区别于Online Judge而言的,OJ ...
- java 中的函数参数传递方式
简介 值传递. 但是对于基本数据类型, 传递的是就是数值, 如果不是基本数据类型, 传递的就是对象的地址,也就是将对象的地址拷贝了一份传递过去. 参考链接 https://www.cnblogs.co ...
- leetcode 443 压缩字符串
简介 常规思路, 看了官方的. code class Solution { public int compress(char[] chars) { int anchor = 0, write = 0; ...
- 无重复字符最长子串无重复字符最长子串 leetcode 3
简介 使用滑动窗口 https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/h ...