如何在Go中解码邮件正文

11

我正在开发一款邮件客户端,需要解码电子邮件正文。我正在使用IMAP包获取邮件,但没有“decode”方法。我还尝试过net/mail包,但也没有找到适合的方法。似乎只有头部可以被解析。是否有任何适用的库可以使用?

3个回答

9

一旦使用net/mail解析了邮件并获得了Message,如果正文是quoted-printable编码的(Content-Transfer-Encoding: quoted-printable):

示例:

r := quotedprintable.NewReader(msg.Body)
body, err := ioutil.ReadAll(r) // body now contains the decoded body

如果正文使用base64编码(Content-Transfer-Encoding: base64),则应使用encoding/base64 package

如果它使用不同的编码方式/字符集进行编码,我该怎么办?请参见https://dev59.com/7YHba4cB1Zd3GeqPVsfV。 - hey
1
可能的唯一其他编码方式是7bit。在这种情况下,您不需要做任何事情。 - Ale

5

我曾经使用github.com/jhillyerd/enmime成功地将头部和正文分离出来。只需要提供一个io.Reader r

// Parse message body
env, _ := enmime.ReadEnvelope(r)
// Headers can be retrieved via Envelope.GetHeader(name).
fmt.Printf("From: %v\n", env.GetHeader("From"))
// Address-type headers can be parsed into a list of decoded mail.Address structs.
alist, _ := env.AddressList("To")
for _, addr := range alist {
  fmt.Printf("To: %s <%s>\n", addr.Name, addr.Address)
}
fmt.Printf("Subject: %v\n", env.GetHeader("Subject"))

// The plain text body is available as mime.Text.
fmt.Printf("Text Body: %v chars\n", len(env.Text))

// The HTML body is stored in mime.HTML.
fmt.Printf("HTML Body: %v chars\n", len(env.HTML))

// mime.Inlines is a slice of inlined attacments.
fmt.Printf("Inlines: %v\n", len(env.Inlines))

// mime.Attachments contains the non-inline attachments.
fmt.Printf("Attachments: %v\n", len(env.Attachments))

1
你可以检查像 artagnon/ibex 这样使用 go-imap package 的项目是否提供该功能。
例如,可以查看其 artagnon/ibex/imap.go#L288-L301 测试。
var body []byte
cmd, err = imap.Wait(c.UIDFetch(set, "BODY.PEEK[]"))
if (err != nil) {
    fmt.Println(err.Error())
    return nil
}
body = imap.AsBytes(cmd.Data[0].MessageInfo().Attrs["BODY[]"])
cmd.Data = nil

bytestring, err := json.Marshal(MessageDetail{string(body)})
if (err != nil) {
    fmt.Println(err.Error())
    return nil
}
return bytestring

我最终放弃了Go语言来完成这个项目。Ibex库似乎没有什么帮助。https://dev59.com/7YHba4cB1Zd3GeqPVsfV#24903176 - hey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接