我正在嘗試在 Go (Golang) 中發(fā)送一封包含電子郵件正文和文件附件(CSV 文件)的電子郵件。我遵循mime多部分消息的標(biāo)準(zhǔn),但是我不太熟悉遵循該標(biāo)準(zhǔn)的消息的結(jié)構(gòu)。我模糊地遵循一位同事的Python代碼片段作為使用Python庫email(我認(rèn)為這是來自標(biāo)準(zhǔn)庫)的指南,例如MIMEText和MIMEMultipart.執(zhí)行以下 Go 代碼時(shí),電子郵件正文未顯示:這有什么問題嗎?如何發(fā)送包含該文件附件和電子郵件正文的電子郵件?該函數(shù)應(yīng)返回一個(gè)字節(jié)切片,用作smtp.SendMail從 Go 標(biāo)準(zhǔn)庫調(diào)用的參數(shù)。請參閱下面的注釋,了解收到的電子郵件發(fā)生的情況( 和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貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
巧合的是,前幾天我也遇到了類似的問題。我需要在正文內(nèi)容類型和正文本身的開頭之間有一個(gè)空行。以下是這部分代碼的更新行:
mime.WriteString("Content-Type: text/plain; charset=utf-8\r\n") mime.WriteString("\r\nThis should be the email message body (v2)...")
為了清楚起見,這個(gè)換行符 (\r\n) 不必完全位于此處,它可以附加到上面的內(nèi)容類型行。它只需要在內(nèi)容類型和正文開頭之間看到一個(gè)空行。
我假設(shè)附件的附加沒有問題,對嗎?我的假設(shè)是,這是因?yàn)樵谔砑痈郊?shù)據(jù)之前,內(nèi)容處置行的末尾有雙換行符。

森欄
TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
閱讀 RFC 規(guī)范對我有幫助:
請注意,封裝邊界必須出現(xiàn)在行的開頭,即在 CRLF 之后,并且初始 CRLF 被視為封裝邊界的一部分,而不是前面部分的一部分。邊界后面必須緊跟另一個(gè) CRLF 和下一部分的標(biāo)頭字段,或者是兩個(gè) CRLF,在這種情況下,下一部分沒有標(biāo)頭字段(因此假定為 Content-Type text/清楚的)。
- 2 回答
- 0 關(guān)注
- 322 瀏覽
添加回答
舉報(bào)
0/150
提交
取消