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

我正在尝试在 Go (Golang) 中发送一封包含电子邮件正文和文件附件(CSV 文件)的电子邮件。

我遵循mime多部分消息的标准,但是我不太熟悉遵循该标准的消息的结构。我模糊地遵循一位同事的Python代码片段作为使用Python库email(我认为这是来自标准库)的指南,例如MIMETextMIMEMultipart.

执行以下 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)...")

}


Qyouu
浏览 263回答 2
2回答

ABOUTYOU

巧合的是,前几天我也遇到了类似的问题。我需要在正文内容类型和正文本身的开头之间有一个空行。以下是这部分代码的更新行:    mime.WriteString("Content-Type: text/plain; charset=utf-8\r\n")     mime.WriteString("\r\nThis should be the email message body (v2)...")为了清楚起见,这个换行符 (\r\n) 不必完全位于此处,它可以附加到上面的内容类型行。它只需要在内容类型和正文开头之间看到一个空行。我假设附件的附加没有问题,对吗?我的假设是,这是因为在添加附件数据之前,内容处置行的末尾有双换行符。

森栏

阅读 RFC 规范对我有帮助:请注意,封装边界必须出现在行的开头,即在 CRLF 之后,并且初始 CRLF 被视为封装边界的一部分,而不是前面部分的一部分。边界后面必须紧跟另一个 CRLF 和下一部分的标头字段,或者是两个 CRLF,在这种情况下,下一部分没有标头字段(因此假定为 Content-Type text/清楚的)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go