You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用net/mail解析邮件时部分Header丢失的问题问询

关于Go net/mail包解析邮件Header的问题解答

1. 为什么遍历mail.Header拿不到Message-ID,但Get方法可以?

Go标准库的net/mail.Header本质是map[string][]string,但它会对所有Header键做规范化处理——把键转换成全小写形式,比如原始的Message-ID会被转成message-id存在map里。

如果遍历的时候你在找Message-ID这个原始格式的键,自然找不到;但Header.Get()方法内部会自动把传入的键转换成规范化的小写,再去map里匹配,所以能成功拿到对应的值。比如遍历打印所有键时,你看到的会是message-id,而非原始的Message-ID。

2. 如何确保获取邮件中所有Header?

分两种场景处理:

  • 若不需要保留Header的原始大小写,直接遍历mail.Header的键值对即可,所有Header都会被存入这个map,不会丢失,只是键是小写规范化后的形式。
  • 若需要严格保留Header的原始大小写(比如特殊场景需匹配原始格式),net/mail包的处理逻辑满足不了,因为它会强制规范化键。这时需要手动解析原始邮件内容:
    • 用bufio.Scanner逐行读取原始邮件,直到遇到空行(Header与Body的分隔线)
    • 处理Header折叠行:如果某行开头是空格或制表符,说明是上一个Header的续行,需合并到上一行
    • 自行拆分每一行的键和值,保留原始键名的大小写

内容的提问来源于stack exchange,提问作者Ben Webb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 13:02:04