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

在 Golang 中附加文件并通过 SMTP 发送时,电子邮件消息没有正文部分

在 Golang 中附加文件并通过 SMTP 发送时,电子邮件消息没有正文部分

Go
Qyouu 2023-06-26 15:26:30
我正在尝试在 Go (Golang) 中发送一封包含电子邮件正文和文件附件(CSV 文件)的电子邮件。我遵循mime多部分消息的标准,但是我不太熟悉遵循该标准的消息的结构。我模糊地遵循一位同事的Python代码片段作为使用Python库email(我认为这是来自标准库)的指南,例如MIMEText和MIMEMultipart.执行以下 Go 代码时,电子邮件正文未显示:这有什么问题吗?如何发送包含该文件附件和电子邮件正文的电子邮件?该函数应返回一个字节切片,用作smtp.SendMail从 Go 标准库调用的参数。请参阅下面的注释,了解收到的电子邮件发生的情况( 和THIS DOES NOT SHOW UP [...])THIS ALSO DOES NOT SHOW UP [...]。func msgWithAttachment(subject, filePath string) ([]byte, error) {    // this is the separator used for the various parts of the MIME message structure    // identified as "boundary"    bPlaceholder := "our-custom-separator"    // the message setup of the common/standard initial part    mime := bytes.NewBuffer(nil)    mime.WriteString(fmt.Sprintf("Subject: %s\r\nMIME-Version: 1.0\r\n", subject))    mime.WriteString(fmt.Sprintf("Content-Type: multipart/mixed; boundary=%s\r\n", bPlaceholder))    // THIS DOES NOT SHOW UP AS THE BODY OF THE EMAIL...    // mime.WriteString("\r\n")    // mime.WriteString(fmt.Sprintf("--%s\r\n", bPlaceholder))    // mime.WriteString("This should be the email message body (v1)...")    // mime.WriteString("\r\n")    // THIS ALSO DOES NOT SHOW UP AS THE BODY OF THE EMAIL...    // BUT IS NEEDED OTHERWISE THE EMAIL MESSAGE SEEMS TO CONTAIN AS ATTACHMENT THE EMAIL MESSAGE ITSELF    // (CONTAINING ITSELF THE REAL ATTACHMENT)    mime.WriteString(fmt.Sprintf("--%s\r\n", bPlaceholder))    mime.WriteString("Content-Type: text/plain; charset=utf-8\r\n")    mime.WriteString("This should be the email message body (v2)...")}
查看完整描述

2 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

巧合的是,前几天我也遇到了类似的问题。我需要在正文内容类型和正文本身的开头之间有一个空行。以下是这部分代码的更新行:

    mime.WriteString("Content-Type: text/plain; charset=utf-8\r\n")
    mime.WriteString("\r\nThis should be the email message body (v2)...")

为了清楚起见,这个换行符 (\r\n) 不必完全位于此处,它可以附加到上面的内容类型行。它只需要在内容类型和正文开头之间看到一个空行。

我假设附件的附加没有问题,对吗?我的假设是,这是因为在添加附件数据之前,内容处置行的末尾有双换行符。


查看完整回答
反对 回复 2023-06-26
?
森栏

TA贡献1810条经验 获得超5个赞

阅读 RFC 规范对我有帮助:

请注意,封装边界必须出现在行的开头,即在 CRLF 之后,并且初始 CRLF 被视为封装边界的一部分,而不是前面部分的一部分。边界后面必须紧跟另一个 CRLF 和下一部分的标头字段,或者是两个 CRLF,在这种情况下,下一部分没有标头字段(因此假定为 Content-Type text/清楚的)。


查看完整回答
反对 回复 2023-06-26
  • 2 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信