带有 CSV 附件的 SMTP 电子邮件 - 文件末尾有额外字符

我正在使用 Golang 创建一个电子邮件客户端,以发送带有 CSV 文件的电子邮件。一切正常,除了在收到的电子邮件附件中,我可以在文件末尾看到一些不需要的额外字符。


我的代码片段:



import (

    "bytes"

    "encoding/base64"

    "fmt"

    "mime/multipart"

    "net/smtp"


    ...

)


func SendEmail(cfg Config) error {


    body := bytes.NewBuffer(nil)

    body.WriteString(fmt.Sprintf("From: %s\n", cfg.EmailFrom))

    body.WriteString(fmt.Sprintf("To: %s\n", cfg.EmailTo))

    body.WriteString(fmt.Sprintf("Subject: %s\n", cfg.EmailSubject))


    // csv file to attach

    fileContents := `column1,column2,column3\nAAA,BBB,CCC\nDDD,EEE,FFF\n`

    fileContentBytes := []byte(fileContents)


    body.WriteString("MIME-Version: 1.0\n")

    writer := multipart.NewWriter(body)

    boundary := writer.Boundary()


    // attach file

    body.WriteString("Content-Type: text/plain\n")

    body.WriteString("Content-Transfer-Encoding: base64\n")

    body.WriteString(fmt.Sprintf("Content-Disposition: attachment; filename=%s\n", "test-filename"))


    encodedBytes := make([]byte, base64.StdEncoding.EncodedLen(len(fileContentBytes)))

    base64.StdEncoding.Encode(encodedBytes, fileContentBytes)

    body.Write(encodedBytes)

    body.WriteString(fmt.Sprintf("\n--%s--", boundary))


    err = smtp.SendMail(cfg.EmailSMTPHost+":"+cfg.EmailSMTPPort,

        nil, cfg.EmailFrom, []string{cfg.EmailTo}, body.Bytes())

    if err != nil {

        return errors.Wrap(err, "smtp.SendMail failed")

    }


    return nil

}

预期的 csv 文件:


column1,column2,column3

AAA,BBB,CCC

DDD,EEE,FFF

获得的csv文件:


column1,column2,column3

AAA,BBB,CCC

DDD,EEE,FFF

5k§xõí»ã}8

文件内容编码有什么问题吗?任何帮助将不胜感激,谢谢!


慕无忌1623718
浏览 151回答 1
1回答

BIG阳

这段代码至少有两个问题:缺少空行来分隔 MIME 标题和正文,然后在末尾添加一些 MIME 边界,即使这不是多部分邮件。当前创建的邮件如下所示:From: me@example.comTo: you@example.comSubject: testMIME-Version: 1.0Content-Type: text/plainContent-Transfer-Encoding: base64Content-Disposition: attachment; filename=test-filenameY29sdW1uMSxjb2x1bW4yLGNvbHVtbjNcbkFBQSxCQkIsQ0NDXG5EREQsRUVFLEZGRlxu--973d0754ef322150f1977af176c9e1917c6dea9dfa0390e8e99af038c086--最后错误的边界被解码为base64,而像“-”这样的无效base64字符被忽略。这会导致输出结束时出现垃圾。相反,它应该看起来像这样作为一个单独的部分。请注意缺少的(错误的)结束边界,并注意 MIME 标头和正文之间的空行。From: me@example.comTo: you@example.comSubject: testMIME-Version: 1.0Content-Type: text/plainContent-Transfer-Encoding: base64Content-Disposition: attachment; filename=test-filenameY29sdW1uMSxjb2x1bW4yLGNvbHVtbjNcbkFBQSxCQkIsQ0NDXG5EREQsRUVFLEZGRlxu或者,它应该作为多部分邮件完成,如下所示。请注意主 MIME 标头中的不同 Content-Type。From: me@example.comTo: you@example.comSubject: testMIME-Version: 1.0Content-Type: multipart/mixed;    boundary=973d0754ef322150f1977af176c9e1917c6dea9dfa0390e8e99af038c086--973d0754ef322150f1977af176c9e1917c6dea9dfa0390e8e99af038c086Content-Type: text/plainContent-Transfer-Encoding: base64Content-Disposition: attachment; filename=test-filenameY29sdW1uMSxjb2x1bW4yLGNvbHVtbjNcbkFBQSxCQkIsQ0NDXG5EREQsRUVFLEZGRlxu--973d0754ef322150f1977af176c9e1917c6dea9dfa0390e8e99af038c086--
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go