如何使用Golang AWS SES-v2发送带PDF附件的邮件?
使用AWS SES-v2发送带PDF附件的邮件
在AWS SES-v2的SendEmail API中,仅通过Content.Raw类型支持发送带附件的邮件——你之前使用的Content.Simple(纯文本/HTML邮件)没有提供附件字段,无法直接添加附件。不过除了直接构造Raw内容,还有两种具体实现思路:
1. 构造MIME格式的Raw邮件(官方推荐)
这是最标准的实现方式,你需要手动构建符合MIME规范的多部分邮件内容,包含正文、PDF附件等模块,再将其传入Content.Raw.Data。
示例代码:
import ( "context" "encoding/base64" "mime/multipart" "net/textproto" "os" "strings" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/sesv2" "github.com/aws/aws-sdk-go-v2/service/sesv2/types" ) func sendEmailWithPDFAttachment(ctx context.Context, client *sesv2.Client) error { // 读取本地PDF文件 pdfBytes, err := os.ReadFile("invoice.pdf") if err != nil { return err } // 构建MIME多部分邮件 var mailContent strings.Builder multipartWriter := multipart.NewWriter(&mailContent) defer multipartWriter.Close() // 添加HTML正文 htmlHeader := textproto.MIMEHeader{ "Content-Type": []string{"text/html; charset=utf-8"}, } htmlPart, err := multipartWriter.CreatePart(htmlHeader) if err != nil { return err } htmlBody := "<p>这是邮件正文,附件为PDF文件</p>" _, _ = htmlPart.Write([]byte(htmlBody)) // 添加PDF附件 pdfHeader := textproto.MIMEHeader{ "Content-Type": []string{"application/pdf"}, "Content-Disposition": []string{`attachment; filename="invoice.pdf"`}, "Content-Transfer-Encoding": []string{"base64"}, } pdfPart, err := multipartWriter.CreatePart(pdfHeader) if err != nil { return err } base64Encoder := base64.NewEncoder(base64.StdEncoding, pdfPart) defer base64Encoder.Close() _, _ = base64Encoder.Write(pdfBytes) // 构造SendEmail请求参数 sendInput := &sesv2.SendEmailInput{ Destination: &types.Destination{ ToAddresses: []string{"receiver@example.com"}, }, Content: &types.EmailContent{ Raw: &types.RawMessage{ Data: mailContent.Bytes(), }, }, FromEmailAddress: aws.String("sender@yourdomain.com"), } // 调用SES-v2发送邮件 _, err = client.SendEmail(ctx, sendInput) return err }
2. 模板邮件+Raw内容(特殊场景)
如果需要使用SES的模板功能(动态替换内容)并添加附件,仍需将模板渲染后的正文与附件打包成MIME格式的Raw内容——本质上还是基于Content.Raw的实现,没有脱离Raw的范畴。
关键说明
SES-v2的Content.Simple类型仅支持纯文本/HTML正文,没有设计附件字段,因此无法直接通过该类型实现带附件的邮件发送。
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

