GoLang发送带附件邮件异常:正文与附件合并为noname附件
问题原因与解决方案
问题根源
你手动构建了multipart邮件内容并通过SetBody整体传入,但gopkg.in/mail.v2库本身已内置multipart消息处理逻辑。这种手动构建的内容被库当作单一文本部分,导致邮件客户端无法正确解析,最终将所有内容合并到名为"noname"的附件中。
修正后的代码
package mail import ( "bytes" logging "project/logging" "fmt" "gopkg.in/mail.v2" ) func SendWithAttachment(from string, to []string, subject, bodyHTML string, attachmentName string, attachmentData []byte) error { logoURL := "/path/to/cs.jpg" m := mail.NewMessage() m.SetHeader("From", from) m.SetHeader("To", to...) m.SetHeader("Subject", subject) // 嵌入Logo(需确保HTML中用cid:cs.jpg引用) if err := m.Embed(logoURL); err != nil { logging.NewDefaultLogger().Errorf("Error embedding logo: %s", err) return err } // 设置HTML正文 m.SetBody("text/html", bodyHTML) // 从字节数据添加附件 if err := m.AttachReader(attachmentName, bytes.NewReader(attachmentData)); err != nil { logging.NewDefaultLogger().Errorf("Error adding attachment: %s", err) return err } fmt.Printf("Sending mail.....") err := gs.dialer.DialAndSend(m) if err != nil { logging.NewDefaultLogger().Errorf("Error sending email..: %s", err) return err } return nil }
关键修改点
- 移除手动构建multipart消息的代码,改用库内置的
SetBody和AttachReader方法处理MIME结构 - 使用
SetBody直接设置HTML正文,库自动处理正确的MIME类型与编码 - 通过
AttachReader从字节数据添加附件,库负责处理Content-Disposition、编码等头信息 - 保留
Embed方法嵌入图片,需确保HTML正文中通过cid:格式引用该图片(如<img src="cid:cs.jpg">)
修改后邮件客户端可正确识别正文与独立附件,不会再出现内容合并的异常。
内容的提问来源于stack exchange,提问作者pavan kumar
相关产品推荐
相关产品推荐

