Golang:解析来自maildir的多部分电子邮件

Golang:解析来自maildir的多部分电子邮件,go,Go,我需要解析从unix maildir读取的多部分电子邮件文件。 你能推荐一个合适的图书馆来做这件事吗 这些电子邮件通过IMAP吸入并转储到maildir。 我需要解析这些电子邮件文件并提取所有部分,包括标题、base64附件、html部分和纯文本部分 谢谢 编辑 我知道我可以用关键词和资料来搜索图书馆,但如果可能的话,我也想听听关于质量和经验的意见 我可以处理实际的maildir和提取邮件文件。我关心的是多部分电子邮件的解析(作为字符串输入)和提取单个部分。以下是我的示例:缺少的部分是提取附件。

我需要解析从unix maildir读取的多部分电子邮件文件。 你能推荐一个合适的图书馆来做这件事吗

这些电子邮件通过IMAP吸入并转储到maildir。 我需要解析这些电子邮件文件并提取所有部分,包括标题、base64附件、html部分和纯文本部分

谢谢

编辑

我知道我可以用关键词和资料来搜索图书馆,但如果可能的话,我也想听听关于质量和经验的意见


我可以处理实际的maildir和提取邮件文件。我关心的是多部分电子邮件的解析(作为字符串输入)和提取单个部分。

以下是我的示例:缺少的部分是提取附件。请让我知道如果你发现了那部分。。。几个星期以来我一直在挠头提取附件

import (
    "fmt"
    "io/ioutil"
    "net/mail"
)

func extractEmail(mail *mail.Message){
    header := mail.Header

    fmt.Println(header.Get("Date"))
    fmt.Println(header.Get("From"))
    fmt.Println(header.Get("To"))
    fmt.Println(header.Get("cc"))
    fmt.Println(header.Get("bcc"))
    fmt.Println(header.Get("Subject"))

    body, err := ioutil.ReadAll(mail.Body)
    if err != nil {
        checkErr(err, "Reading Body")
    }

    fmt.Println(body)
}

以下是我的示例:缺少的部分是提取附件。请让我知道如果你发现了那部分。。。几个星期以来我一直在挠头提取附件

import (
    "fmt"
    "io/ioutil"
    "net/mail"
)

func extractEmail(mail *mail.Message){
    header := mail.Header

    fmt.Println(header.Get("Date"))
    fmt.Println(header.Get("From"))
    fmt.Println(header.Get("To"))
    fmt.Println(header.Get("cc"))
    fmt.Println(header.Get("bcc"))
    fmt.Println(header.Get("Subject"))

    body, err := ioutil.ReadAll(mail.Body)
    if err != nil {
        checkErr(err, "Reading Body")
    }

    fmt.Println(body)
}

我很幸运能用这个包裹做到这一点。给定一个
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))
//解析消息体
env,:=enmime.ReadEnvelope(r)
//可以通过Envelope.GetHeader(名称)检索标题。
fmt.Printf(“From:%v\n”,env.GetHeader(“From”))
//地址类型头可以解析为已解码邮件的列表。地址结构。
列表,地址:=环境地址列表(“收件人”)
对于u,addr:=范围列表{
fmt.Printf(“收件人:%s\n”,地址名称,地址地址地址)
}
fmt.Printf(“主题:%v\n”,环境GetHeader(“主题”))
//纯文本正文以mime.text的形式提供。
fmt.Printf(“文本正文:%v chars\n”,len(环境文本))
//HTML正文存储在mime.HTML中。
fmt.Printf(“HTML正文:%v chars\n”,len(env.HTML))
//Inlines是内联附件的一部分。
fmt.Printf(“内联线:%v\n”,len(环境内联线))
//附件包含非内联附件。
fmt.Printf(“附件:%v\n”,len(环境附件))

我很幸运能用这个软件包做到这一点。给定一个
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))
//解析消息体
env,:=enmime.ReadEnvelope(r)
//可以通过Envelope.GetHeader(名称)检索标题。
fmt.Printf(“From:%v\n”,env.GetHeader(“From”))
//地址类型头可以解析为已解码邮件的列表。地址结构。
列表,地址:=环境地址列表(“收件人”)
对于u,addr:=范围列表{
fmt.Printf(“收件人:%s\n”,地址名称,地址地址地址)
}
fmt.Printf(“主题:%v\n”,环境GetHeader(“主题”))
//纯文本正文以mime.text的形式提供。
fmt.Printf(“文本正文:%v chars\n”,len(环境文本))
//HTML正文存储在mime.HTML中。
fmt.Printf(“HTML正文:%v chars\n”,len(env.HTML))
//Inlines是内联附件的一部分。
fmt.Printf(“内联线:%v\n”,len(环境内联线))
//附件包含非内联附件。
fmt.Printf(“附件:%v\n”,len(环境附件))

所有这些库都专门处理maildir,而不是多部分电子邮件解析。感谢您的帮助…我自己还没有使用过这些库,但是标准库中的net/mail、mime、mime/multipart包可能提供了足够的功能。所有这些库都专门处理maildir,而不是多部分电子邮件解析。感谢您的帮助…我自己还没有使用过这些库,但标准库中的net/mail、mime、mime/multipart包可能提供了足够的功能。如果电子邮件正文中有任何非常大的单行,此库将无法工作。看起来目前有一个解决方法(缺点是它通过使用换行符切碎长字符串来更改原始内容):如果电子邮件正文中有任何非常大的单行,则此库不起作用。目前似乎有一个解决方法(缺点是它通过使用换行符切碎长字符串来更改原始内容):