如何在Go中解码邮件正文

hey*_*hey 10 email go html-email

我正在研究电子邮件客户端,其中一部分我需要解码电子邮件正文.我正在使用IMAP包来获取消息,但没有"解码"方法.我也检查了网/邮件包也没有运气.只有标题似乎有一个解析器.我可以使用任何lib吗?

Ale*_*Ale 9

一旦使用net/mail解析电子邮件并有一条消息,如果正文是引用可打印的编码(Content-Transfer-Encoding: quoted-printable):

例:

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

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


All*_*uce 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))
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 1

您可以检查像artagnon/ibex使用该go-imap包的项目是否提供该功能。
例如,参见其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
Run Code Online (Sandbox Code Playgroud)