为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕无忌1623718 2022-10-17 19:14:21
我正在使用 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,column3AAA,BBB,CCCDDD,EEE,FFF获得的csv文件:column1,column2,column3AAA,BBB,CCCDDD,EEE,FFF5k§xõí»ã}8文件内容编码有什么问题吗?任何帮助将不胜感激,谢谢!
查看完整描述

1 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

这段代码至少有两个问题:缺少空行来分隔 MIME 标题和正文,然后在末尾添加一些 MIME 边界,即使这不是多部分邮件。当前创建的邮件如下所示:


From: me@example.com

To: you@example.com

Subject: test

MIME-Version: 1.0

Content-Type: text/plain

Content-Transfer-Encoding: base64

Content-Disposition: attachment; filename=test-filename

Y29sdW1uMSxjb2x1bW4yLGNvbHVtbjNcbkFBQSxCQkIsQ0NDXG5EREQsRUVFLEZGRlxu

--973d0754ef322150f1977af176c9e1917c6dea9dfa0390e8e99af038c086--

最后错误的边界被解码为base64,而像“-”这样的无效base64字符被忽略。这会导致输出结束时出现垃圾。


相反,它应该看起来像这样作为一个单独的部分。请注意缺少的(错误的)结束边界,并注意 MIME 标头和正文之间的空行。


From: me@example.com

To: you@example.com

Subject: test

MIME-Version: 1.0

Content-Type: text/plain

Content-Transfer-Encoding: base64

Content-Disposition: attachment; filename=test-filename


Y29sdW1uMSxjb2x1bW4yLGNvbHVtbjNcbkFBQSxCQkIsQ0NDXG5EREQsRUVFLEZGRlxu

或者,它应该作为多部分邮件完成,如下所示。请注意主 MIME 标头中的不同 Content-Type。


From: me@example.com

To: you@example.com

Subject: test

MIME-Version: 1.0

Content-Type: multipart/mixed; 

   boundary=973d0754ef322150f1977af176c9e1917c6dea9dfa0390e8e99af038c086


--973d0754ef322150f1977af176c9e1917c6dea9dfa0390e8e99af038c086

Content-Type: text/plain

Content-Transfer-Encoding: base64

Content-Disposition: attachment; filename=test-filename


Y29sdW1uMSxjb2x1bW4yLGNvbHVtbjNcbkFBQSxCQkIsQ0NDXG5EREQsRUVFLEZGRlxu

--973d0754ef322150f1977af176c9e1917c6dea9dfa0390e8e99af038c086--


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号