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

使用Gomail通过AWS SES发送带PDF附件邮件时附件无法打开问题排查

使用Gomail + AWS SES发送带PDF附件的邮件,附件无法打开的问题排查与解决

问题场景

通过Gomail构建邮件并调用AWS SES的SendRawEmail接口发送,邮件可正常接收、正文可见,但PDF附件点击打开时提示“Something went wrong. Try again later”,且程序日志无报错信息。相关代码如下:

source := aws.String(ses_aws.Sender)
destinations := []string{recipent}

msg := gomail.NewMessage()
msg.SetHeader("From", ses_aws.Sender)
msg.SetHeader("To", recipent)
msg.SetHeader("Subject", "XXX")
msg.SetBody("text/html", "XXXX")
msg.Attach("pdf.pdf",
    gomail.SetCopyFunc(func(w io.Writer) error {
        _, err := w.Write(data)
        return err
    }),
)
var emailRaw bytes.Buffer
msg.WriteTo(&emailRaw)

message := &types.RawMessage{ Data: emailRaw.Bytes() }

input := &ses.SendRawEmailInput{
    Source: source,
    Destinations: destinations,
    RawMessage:     message,
}
output, err := svc.SendRawEmail(context.TODO(), input)
if err != nil {
    return "", err
}

问题原因

核心问题在于附件的MIME头缺失关键属性,或数据编码不符合邮件标准:

  • 自定义SetCopyFunc直接写入原始PDF字节流时,未明确指定Content-Transfer-Encoding(标准应为base64),导致客户端无法正确解码附件数据。
  • Gomail默认生成的MIME头,在配合自定义CopyFunc时,可能未完整填充Content-Type的附加属性(如文件名),引发客户端解析异常。

解决方法

无需手动重复设置已存在的头,只需通过Gomail的选项补充缺失的MIME属性,或调整附件生成方式:

方案1:手动指定MIME头并编码数据

修改Attach调用,补充完整的MIME头,并将PDF数据做base64编码后写入:

import "encoding/base64"

// ...

msg.Attach("pdf.pdf",
    gomail.SetHeader(map[string][]string{
        "Content-Type":                {"application/pdf; name=\"pdf.pdf\""},
        "Content-Disposition":         {"attachment; filename=\"pdf.pdf\""},
        "Content-Transfer-Encoding":   {"base64"},
    }),
    gomail.SetCopyFunc(func(w io.Writer) error {
        encoder := base64.NewEncoder(base64.StdEncoding, w)
        defer encoder.Close()
        _, err := encoder.Write(data)
        return err
    }),
)

方案2:让Gomail自动处理编码与头(更简洁)

若使用内存中的PDF数据,改用CreateAttachment方法,Gomail会自动生成符合标准的MIME头和编码:

msg.CreateAttachment("pdf.pdf",
    gomail.SetHeader(map[string][]string{
        "Content-Type": {"application/pdf"},
    }),
    gomail.SetCopyFunc(func(w io.Writer) error {
        _, err := w.Write(data)
        return err
    }),
)

如果PDF是本地文件,直接调用msg.Attach("path/to/pdf.pdf")即可,Gomail会自动完成所有MIME配置。

额外校验点

  • 验证data变量是否为完整的PDF字节流:可将data写入本地文件,确认文件能正常打开。
  • 检查生成的原始邮件MIME结构:将emailRaw.Bytes()输出到本地文件,用邮件客户端打开验证格式是否符合RFC标准。

内容的提问来源于stack exchange,提问作者YuJun Thelittlemushroom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:02:24