重叠的多部分“无媒体类型”

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


我制作了一个函数,当 Content-Type 具有“多部分”时使用。


像这样:


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-Encoding\n")

        if encoding == "" {

            encoding = "7bit"

        }

        if strings.Contains(p.Header.Get("Content-Type"), "multipart") {

            newContent := "\nMime-Version: 1.0\n" + "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=="


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


我不知道问题出在哪里。


繁花不似锦
浏览 217回答 1
1回答

长风秋雁

您正在创建一条新消息:newContent&nbsp;:=&nbsp;"\nMime-Version:&nbsp;1.0\n"&nbsp;+&nbsp;"Message-ID:&nbsp;"&nbsp;+&nbsp;...因此,示例消息可能是:Mime-Version:&nbsp;1.0Message-ID:&nbsp;RANDOMSTRING这以一个空行开始,这就是将标头与消息分开的原因,因此当解析消息时,标头将是空白的(您可以通过fmt.Printf("Header: %v\n", msg.Header)在调用后添加来看到这一点mail.ReadMessage)。删除它\n会导致另一个错误(如果您检查错误会发生这种情况 - 请记住在每次通话后检查)malformed MIME header: missing colon: "--=-OM18H8UnjkvG1nNW6D77AQ=="。这是因为您没有在标题末尾添加空行。所以你需要\n在最后添加另一个。...&nbsp;+&nbsp;encoding&nbsp;+&nbsp;";\n\n"&nbsp;+&nbsp;string(slurp)完成此操作后,代码运行请参见 playground。请注意,我所做的更改只是为了让它运行;我没有进行任何进一步的检查。我已经留下了一些调试代码Printf(
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go