我应该如何解析电子邮件标头?是否有任何有力的lib来正确解析电子邮件标题?我正在开发一个电子邮件客户端,由于某些原因,标准mail lib似乎无法处理所有类型的mime类型/标头。实际上它在我测试过的20%的电子邮件中失败了。
header := imap.AsBytes(rsp.MessageInfo().Attrs["RFC822.HEADER"])
msg, err := mail.ReadMessage(bytes.NewReader(header))
if err != nil {
err = fmt.Errorf("msg %s, err", err)
log.Error(err)
}
mg.From, err = msg.Header.AddressList("From")
if err != nil {
log.Error(err)
}
以下标题中的代码似乎失败了。我也开始使用enmime来处理mail未处理的案件,但仍有未处理的标题(见下文)。我不确定如何处理这个问题。我应该在它上面写一个正则表达式吗?
E0722 17:01:33.876922 89702 imap.go:146]标题图[X-Gmx-Antivirus:[0(未发现病毒)]收到:[来自smtp2.ono.com([62.42.230.179])by mx-ha.gmx.net(mxgmxus002),ESMTP(Nemesis)id 0MQRb8-1XLJaM3en6-00Tmzn for;星期一,2014年6月9日11:27:43 +0200来自PCRafaelRomero(85.137.226.62)by smtp2.ono.com(8.6.122.04)(经过认证为sanromero)id 5385D185003E1FAE for admin@xax.com;星期一,2014年6月9日11:27:40 +0200]抄送:[]
的Content-Type:multipart / alternative的; boundary =" ---- = _ NextPart_000_3F41_01CF83D5.D1B66CE0"]内容 - 语言:[es] X-Antivirus-Status:[Clean]返回路径:[romero@ono.com] X-Gmx-Antispam :[0(邮件未被识别为垃圾邮件); Detail = V3;]来自:[] X-Mailer:[Microsoft Office Outlook 12.0] X-Antivirus:[avast! (VPS 140608-1,2014年8月6日),出站消息] X-UI-Filterresults:[notjunk:1; V01:K0:nbs2GLFYQvI =:2WsgrcdLWXLFAMJ3EjKYwQVnkC oiOf739mgPzbtBEXoW8E51lMNdd8vNfEFb0 + OkeNCBh8OsnZap9qjj8b + hzWGsIEHvhFW1W5j 0h4k3ZxERUU3vVKNgAG + // QA3GnXL67cHvc0rLbyytAtv2ydIdsQVp1wG / IkJ3p9bscQVKKd / TE9Jfqg7YxyPDlS3zXIYql4IQQ8MMG8T + pCqUQ + SNDZ / hcr2otZNk729nQMHlw0I2B5CZ6N99 FRmFvfhUn67ZPjLZVzKrfk2cRVGISw8 / GMrrrm2zggVrlS2GhpzIchxD1TR14fYZ3qz2M4UCI S86WLbTAaQZp3PuIlhAqx1K13DV1IUTdlEs + J6QF1UdJUthb7IGQXCYzIogA6OWOdXzybYpeI foiqJDkSXyBDmHiDi1dwBS6W0u7 + nBW9zlhc26rDXImEcbAv + wrdMyUXxlJi3Tqnd0cZ8BuZY IhrarB4 / fFFuVdnCz970O7PyoC6 + O5g + QoFU9LJRx0O2U6sgjXXe8c21EysIyqCg73M53Z0EM hbcZ5xk / 6Bc880 + yKrfB2w42kZg6bZVMKFStHPhZsgJFvZftB9 / AmG08zp1O0uQBGlULFE4 + K DhwCfEAWKkKJClvXPo1Svu9Qw9K59jwPqQVlqLGwdgzE7vscfkj / PomuUUkWRkIwaS7o / WrxR pWyWB / xMVm2ysvUV3Obur2a5J4jKIDLCJNX2grtz7mCjI3DzSL8g6i2qqUn / wueyPxWJGAE3M / 93MRR6Vq4Dh / xUWLi6Z0sOtxjVyymBzL93EWXfzkKmTT3Kk4Fl130S / dJlZL9BRbmQo1 / NFB yIhOjS9CZz1O3XGbCEq1Rl2EWDQoircWoLLV2I40S00qvXlSBgXvbqpr8oGEIrH l5Y2JwyoM0 T + 7h0 / zly8R4UKMizQ4Kh08finfDmTawxI9oD + ap60wB7I4elcntWBA4dUix0DpKd4wYuQxmD RAZdTOflVzi2rrftPMHpWqZ9Qr4LdKqs4fvnI9VHvmfqD68uZN4NVncmUo + xuN0koEWqLOcGM 30niY / 2rtAFOdi10v1dPVJXya / tssEfwhTjT7BFa01jZIcx / IK / I7FkmDAHfIIBiTKcZNaTch XEiOEAX3GR1YnQdcT5Upb87syLJwM8OdwvWVmq4UaVw3Ogrq2t5ZTG / 98 / 7A7aPASMFd2jTVV 97LZ6iJGGbkRkzxZhb0VPjhq2rJFxihpHcCHe7exqicy2 + FLbFetRYaI1JthWjj5PTSdsqmGH PBO + vg1S147tH4vPBii25Op5f3JXr5OUX2uSmcDhSrG3og4hWTZI6zMUtaJVE5IZsuGuVuInJ TWCLzuqkpJ9g3uIA6ECoKW7ODibg4evlXJp9VMEgxyOqBRg =] X-CTCH-REFID:[STR = 0001.0A0B0203.53957E0C.00D9, ss = 1,re = 0.000,recu = 0.000,reip = 0.000,cl = 1,cld = 1,fgs = 0]日期:[Mon,9 Jun 2014 11:27:27 +0200]线程索引:[Ac + DxFZYas1DTYB / S / anWwcW8Cz4Ag ==] X-Ctch-Spam:[Unknown] X-Ctch-Vod:[Unknown] Message-Id:[< 3f4001cf83c5 $ 0e2d9ce0 $ 2a88d6a0 $ @ com>] Envelope-To:[]主题:[预订。] Mime-版本:[1.0]],错误邮件:标题不在消息中
编辑:
我稍微修改了代码并带来了enmime包以检查几个邮件失败的情况。但是我仍然收到错误:multipart: NextPart: EOF
所以我想知道接下来应该尝试什么。
我还注意到我收到此错误,这可能与多部分错误直接相关。基本上邮件包不会解析邮件,因此enime包报告文件结束。
我正在尝试解析电子邮件而我遇到了这种错误
missing word in phrase: charset not supported: "gb18030"
charset not supported: "koi8-r"
missing word in phrase: charset not supported: "ks_c_5601-1987"
header := imap.AsBytes(rsp.MessageInfo().Attrs["RFC822.HEADER"])
msg, err := mail.ReadMessage(bytes.NewReader(header))
if err != nil {
err = fmt.Errorf("msg %s, err", err)
log.Error(err)
// return mgs, err
}
mg.From, err = msg.Header.AddressList("From")
if err != nil {
mime, err := enmime.ParseMIMEBody(msg)
if err != nil {
log.Error(err)
return mgs, err
}
mg.From[0].Address = mime.GetHeader("From")
if mg.From[0].Address == "" {
log.Error(fmt.Errorf("from is empty %v", header))
return mgs, err
}
mg.From[0].Name = mime.GetHeader("From")
log.Infof("mime FROM is %v", mg.From[0].Address)
答案 0 :(得分:0)
您没有特别解析任何标头,所有标头最初都以相同的方式解析。
您提供的所有信息都与您的实际错误消息无关:
mail: header not in message
您致电mail.ErrHeaderNotPresent
时返回 Header.AddressList("From")
(唯一的其他地方邮件返回错误为Header.Date
)。
这不是致命的;只需检查mail.ErrHeaderNotPresent
,如果您不需要,请继续。
答案 1 :(得分:0)
如果您使用的是Go 1.5,则可以使用mime package的新功能。
如果您使用的是旧版Go,则可以使用my drop-in replacement。
示例:
dec := new(mime.WordDecoder)
from, err := dec.DecodeHeader(msg.Header["From"])
if err != nil {
panic(err)
}
fmt.Println(subject)
// from now contains the decoded header