使用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
相关产品推荐
相关产品推荐

