You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:38:28