Email &引用;短语中缺少单词:“不支持字符集”;,使用邮件包时

Email &引用;短语中缺少单词:“不支持字符集”;,使用邮件包时,email,go,mime-types,mime,Email,Go,Mime Types,Mime,我试图解析电子邮件,但我在使用邮件包时遇到这种错误。这是邮件包上的错误还是我应该自己处理的问题 短语中缺少单词:不支持字符集:“gb18030” 不支持字符集:“koi8-r” 短语中缺少单词:不支持字符集:“ks_c_5601-1987” 我怎样才能修好它们?我想我应该用,但我不知道怎么用 . 下面是电子邮件标题的外观 Received: from smtpbg303.qq.com ([184.105.206.26]) by mx-ha.gmx.net (mxgmxus001) with E

我试图解析电子邮件,但我在使用邮件包时遇到这种错误。这是邮件包上的错误还是我应该自己处理的问题

短语中缺少单词:不支持字符集:“gb18030”

不支持字符集:“koi8-r”
短语中缺少单词:不支持字符集:“ks_c_5601-1987”

我怎样才能修好它们?我想我应该用,但我不知道怎么用 . 下面是电子邮件标题的外观

Received: from smtpbg303.qq.com ([184.105.206.26]) by mx-ha.gmx.net
 (mxgmxus001) with ESMTPS (Nemesis) id 0MAOx2-1X2yNC2ZFC-00BaVU for
 <sormester@lobbyist.com>; Sat, 14 Jun 2014 18:11:48 +0200
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201307;
    t=1402762305; bh=imEvSr8IPsqWTXU63xUHRv+wuQG+Tcz2mPP9ai4rrE4=;
    h=X-QQ-FEAT:X-QQ-SSF:X-HAS-ATTACH:X-QQ-BUSINESS-ORIGIN:
     X-Originating-IP:In-Reply-To:References:X-QQ-STYLE:X-QQ-mid:From:To:Subject:Mime-Version:Content-Type:Content-Transfer-Encoding:Date:
     X-Priority:Message-ID:X-QQ-MIME:X-Mailer:X-QQ-Mailer:
     X-QQ-ReplyHash:X-QQ-SENDSIZE:X-QQ-FName:X-QQ-LocalIP;
    b=QXs4CveboS8nG6htN9W6amC3X+F7X3ZtFrt6jrjWI+RmbvqBuTCVmX9IlaqCX84H8
     n14x2Wp7x4kDYcNRqhe+HjTpf715TTQXc4d40b9e38frC/5qIhpMtYNsD8iEJwRzHW
     U3xi8Yq7OCIB303fIpytx8tOjexQpZKSHbJ7ecX0=
X-QQ-FEAT: zaIfg0hwV2pIDflZYPQUsuPPXG5wtRVHJU6PiOYLBBA=
X-QQ-SSF: 00010000000000F000000000000000L
X-HAS-ATTACH: no
X-QQ-BUSINESS-ORIGIN: 2
X-Originating-IP: 180.155.99.102
In-Reply-To: <trinity-b7c6d611-52fd-4afa-b739-2deb243532a6-1402761364579@3capp-mailcom-lxa05>
References: <97e07dab7c2d1a005ed928c4350690e0@hotels-desk.co.uk>,
 <tencent_105D3DC11702F53465C0025D@qq.com>
    <trinity-b7c6d611-52fd-4afa-b739-2deb243532a6-1402761364579@3capp-mailcom-lxa05>
X-QQ-STYLE: 
X-QQ-mid: webmail474t1402762303t356131
From: "=?gb18030?B?08bTzg==?=" <38438nx@qq.com>
To: "=?gb18030?B?V2lsaGVsbSBLdW1tZXI=?=" <sormester@lobbyist.com>
Subject: =?gb18030?B?u9i4tKO6ILvYuLSjulBhbGFjZSBXZXN0bWluc3Rl?=
 =?gb18030?B?cjogMDEtMDctMjAxNCAtIDA0LTA3LTIwMTQ=?=
Mime-Version: 1.0
Content-Type: multipart/alternative;
    boundary="----=_NextPart_539C743F_08A07490_0157E268"
Content-Transfer-Encoding: 8Bit
Date: Sun, 15 Jun 2014 00:11:43 +0800
X-Priority: 3
Message-ID: <tencent_573A737E73016B9F5A3D10C1@qq.com>
X-QQ-MIME: TCMime 1.0 by Tencent
X-Mailer: QQMail 2.x
X-QQ-Mailer: QQMail 2.x
X-QQ-ReplyHash: 170675637
X-QQ-SENDSIZE: 520
X-QQ-FName: 7B2EFFAD16B8462B84D3499A4CC7DDEF
X-QQ-LocalIP: 163.177.66.155
Envelope-To: <sormester@lobbyist.com>
X-GMX-Antispam: 0 (Mail was not recognized as spam); Detail=V3;
X-GMX-Antivirus: 0 (no virus found)
邮件包似乎只能解码
rfc247
,但字符集包不支持这一点

character set "rfc2047" not found

这似乎能解决这个问题?

< P>我希望这能帮助那些考虑去处理电子邮件的人(即开发客户端应用程序)。对于电子邮件处理来说,标准的Go标准库似乎还不够成熟。它不能处理多部分、不同的字符集等。在尝试了几乎一天的不同破解和包之后,我决定扔掉go代码,使用一个旧的好JavaMail解决方案。

Alexey Vasiliev的MIT许可包括一个
解析器
包,该包应用解码头所需的任何编码包(肉在里面)

软件包似乎也使用它来解码/转换内容,不过由于将
[]字节
正文转换为
字符串
,会产生一些额外的分配。如果您觉得API不适合您,您至少可以使用代码来查看如何完成

通过godoc.org的“…并由3个包导入”链接从--hooray godoc.org!找到。

我一直在使用它,它似乎对此没有问题。它将解析标题和正文内容。给定一个
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(环境附件))

对GB18030的底层支持已经存在,ks_c_5601-1987也已经存在——不过,要将其与头解析联系起来,还有很多工作要做,而且我对您正在使用的其他软件包还不够熟悉,无法立即知道如何做到这一点。我正在使用标准库中的imap软件包来“提取”以字节为单位的电子邮件,然后使用邮件包kage来解析它,并从标题中实际获取“from”、“to”、“subject”等字段。在我看来,寻找不同的包并找到支持特定字符集的方法是不对的。我认为邮件包应该开箱即用。如果它只处理一个字符集,mail.ParseAddress函数有什么用?老实说,我发现你的frustration在这里是可以理解的。Go通常擅长网络服务和用所有语言处理字符,所以这是一个盲点,这让人感到惊讶。有趣的是,我在这方面也几乎浪费了一天时间。在一段非常有趣的旅程中,第一个Go让人头疼。这个答案已经过时了……今天的Go有“mime/多部分”它处理创建或解析包含SMTP通信的多部分邮件
package main

import (
        "bufio"
        "bytes"
        "fmt"
        "net/textproto"
        "github.com/le0pard/go-falcon/parser"
)

var msg = []byte(`Subject: =?gb18030?B?u9i4tKO6ILvYuLSjulBhbGFjZSBXZXN0bWluc3Rl?=
 =?gb18030?B?cjogMDEtMDctMjAxNCAtIDA0LTA3LTIwMTQ=?=

`)


func main() {
        tpr := textproto.NewReader(bufio.NewReader(bytes.NewBuffer(msg)))
        mh, err := tpr.ReadMIMEHeader()
        if err != nil {
                panic(err)
        }
        for name, vals := range mh {
                for _, val := range vals {
                        val = parser.MimeHeaderDecode(val)
                        fmt.Print(name, ": ", val, "\n")
                }
        }
}
// 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))