重叠的多部分'no media type'



我正在尝试提取邮件的正文。

我制作了一个函数,当Content-Type具有"multipart"时使用该函数。

像这样:

func multipartFunc(w http.ResponseWriter, content string) string {
msg, err := mail.ReadMessage(bytes.NewBufferString(content))
var uDec []byte 
mediaType, params, err := mime.ParseMediaType(msg.Header.Get("Content-Type"))
if err != nil {
log.Fatal("2 error: ", err)
}
if strings.HasPrefix(mediaType, "multipart/") {
mr := multipart.NewReader(msg.Body, params["boundary"])
for {
p, err := mr.NextPart()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
slurp, err := ioutil.ReadAll(p)
if err != nil {
log.Fatal(err)
}
encoding := p.Header.Get("Content-Transfer-Encodingn")
if encoding == "" {
encoding = "7bit"
}
if strings.Contains(p.Header.Get("Content-Type"), "multipart") {
newContent := "nMime-Version: 1.0n" + "Message-ID: " + randomString(12) + "nContent-Type: " + p.Header.Get("Content-Type") + "nContent-Transfer-Encoding: " + encoding + ";n" + string(slurp)
**ss := multipartFunc(w, newContent)**
return ss
}
if p.Header.Get("Content-Transfer-Encoding") == "base64" {
uDec, _ = base64.StdEncoding.DecodeString(string(slurp))
} else if p.Header.Get("Content-Transfer-Encoding") == "quoted-printable" {
uDec, _ = ioutil.ReadAll(quotedprintable.NewReader(strings.NewReader(string(slurp))))
} else {
uDec = []byte(string(slurp))
}
}
} 
return string(uDec)

示例邮件:

From: <aa@aa.or.kr>
Date: Wed, 07 Oct 2020 09:25:49 +0900
Message-Id: <RWAA4Q95VBU4.esdqwe@ds4>
To: aa@aa.com
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-pm6oKFbVvZj4hXY1hoVA4g=="
--=-pm6oKFbVvZj4hXY1hoVA4g==
Content-Type: multipart/alternative; boundary="=-OM18H8UnjkvG1nNW6D77AQ=="
--=-OM18H8UnjkvG1nNW6D77AQ==
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64
DQoNCg0KCQ0KICAgICAgICAgICAgICAgIA

--=-OM18H8UnjkvG1nNW6D77AQ==
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
PGh0bWwgbGFuZz0ia28iPg0KPG1ldGEgYLTgiPg0KDQoJPGRpdiBpZD0i

--=-OM18H8UnjkvG1nNW6D77AQ==--
--=-pm6oKFbVvZj4hXY1hoVA4g==--

但如果我提取部分重叠的多部分并重新插入它,则出现错误。("无媒体类型"或"格式错误的MIME标头:缺少冒号:%!q"(

我不知道问题出在哪里。

您正在创建一个新消息,其中包含:

newContent := "nMime-Version: 1.0n" + "Message-ID: " + ...

因此,一个示例消息可能是:


Mime-Version: 1.0
Message-ID: RANDOMSTRING

这是从一个空行开始的,这就是将标头与消息分隔开的原因,因此当解析消息时,标头将为空(您可以通过在调用mail.ReadMessage后添加fmt.Printf("Header: %vn", msg.Header)来看到这一点(。

删除n会导致另一个错误(如果您检查了错误,就会发生这种情况——请记住每次调用后都要检查(malformed MIME header: missing colon: "--=-OM18H8UnjkvG1nNW6D77AQ=="。这是因为您没有在页眉末尾添加空行。因此,您需要在末尾添加另一个n

... + encoding + ";nn" + string(slurp)

完成此操作后,代码运行see playground。请注意,我所做的更改只是为了让这个运行;我没有进行任何进一步的检查。我留下了一些调试代码(Printf(,向您展示我是如何跟踪问题的(如果您提出进一步的问题,发布一个最小、可复制的示例会使这个过程更容易(。

相关内容