gpt4 book ai didi

email - Go(lang)解析电子邮件标题并保持顺序

转载 作者:数据小太阳 更新时间:2023-10-29 03:13:40 27 4
gpt4 key购买 nike

我在 Go 中使用 net/mail 库,一切都很好,但是我想传递原始电子邮件并保持标题的顺序。这很重要,因为在每个邮件服务器上传递消息的邮件服务器都按顺序添加它们的标题。没有顺序,很难知道谁收到了什么、什么时间以及每个服务器添加了什么 header 。net/mailstores the headers in a map ,根据定义,它没有顺序的概念。似乎是一个奇怪的选择,因为标题顺序仅基于电子邮件中的顺序,但事实确实如此。有人对我如何保留阅读 header 的顺序有任何建议吗?

谢谢

最佳答案

net/mail包使用net/textproto包解析邮件头(参见 ReadMessage())。具体来说,它使用 ReadMIMEHeader()为了 header ,记录为:

The returned map m maps CanonicalMIMEHeaderKey(key) to a sequence of values in the same order encountered in the input.

您可以 view the full source如果你愿意,但基本过程是:

headers = make(map[string][]string)
for {
key, value := readNextHeader()
if key == "" {
return headers // End of headers
}

if headers[key] == nil {
headers[key] = []string{value}
} else {
headers[key] = append(headers[key], value)
}
}

的确,标题在邮件中出现的原始顺序丢失了,但我不知道这真正重要的任何情况。什么不会丢失的是多值 header 的顺序。 slice 确保它们是按照它们在电子邮件中出现的顺序排列。

你可以用一个简单的程序来验证这一点,这个程序循环遍历标题和比较值 ( such as this one in thePlayground )。


但是,匹配 ReceivedReceived-SPF header 有点复杂,作为:

  1. 并非每个Received header 都可能有相应的Received-SPF header ;
  2. Received-SPF header 可能不会出现在 Received header 上方;这是 recommended but not mandated by the RFC (此外,许多程序不甚至遵循 RFC,所以无论如何这都不是保证)。

所以你要么需要解析 header 的值并根据它们进行匹配那个,或者使用 net/textproto 包进行更底层的访问标题。您可以使用 ReadMIMEHeader() 的来源作为起点。

关于email - Go(lang)解析电子邮件标题并保持顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43807868/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com