如何通过MIME在邮件主题行显示预览文本(Golang AWS SES-v2)
使用Golang AWS SES-v2配置MIME实现邮件主题行显示预览文本
核心逻辑
要让邮件主题行下方显示指定预览文本而非正文内容,需要在MIME结构中添加专门的预览头,同时配合标准的多部分MIME格式,确保主流邮件客户端能正确识别预览内容。
完整实现代码
以下是包含MIME构建、SES-v2发送的完整Golang代码:
package main import ( "bytes" "context" "encoding/base64" "fmt" "log" "mime/multipart" "net/textproto" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/sesv2" "github.com/aws/aws-sdk-go-v2/service/sesv2/types" ) func buildMIMEMessage(from, to, subject, previewText, htmlBody string) (string, error) { var buf bytes.Buffer writer := multipart.NewWriter(&buf) // 构建邮件基础头 headers := textproto.MIMEHeader{} headers.Set("From", from) headers.Set("To", to) headers.Set("Subject", subject) // 添加预览文本专用头,兼容多数客户端 headers.Set("X-Preview", previewText) headers.Set("Content-Type", fmt.Sprintf("multipart/alternative; boundary=%s", writer.Boundary())) // 写入纯文本部分(作为预览备选,部分客户端优先读取) textPart, err := writer.CreatePart(textproto.MIMEHeader{ "Content-Type": []string{"text/plain; charset=utf-8"}, }) if err != nil { return "", err } // 纯文本开头放预览,后续可追加完整纯文本正文 fmt.Fprintf(textPart, "%s\n\n%s", previewText, "这里是纯格式的完整正文内容") // 写入HTML正文部分 htmlPart, err := writer.CreatePart(textproto.MIMEHeader{ "Content-Type": []string{"text/html; charset=utf-8"}, }) if err != nil { return "", err } fmt.Fprint(htmlPart, htmlBody) // 结束MIME写入 if err := writer.Close(); err != nil { return "", err } // 按SES要求编码为Base64 return base64.StdEncoding.EncodeToString(buf.Bytes()), nil } func main() { // 加载AWS配置 cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-east-1")) // 替换为你的AWS区域 if err != nil { log.Fatalf("加载AWS配置失败: %v", err) } client := sesv2.NewFromConfig(cfg) // 邮件参数配置 from := "sender@yourdomain.com" to := "recipient@targetdomain.com" subject := "你的邮件主题" previewText := "这是要显示在主题行下方的预览文本内容" htmlBody := "<html><body><h1>邮件正文标题</h1><p>这里是HTML格式的完整邮件正文</p></body></html>" // 构建MIME消息 mimeMessage, err := buildMIMEMessage(from, to, subject, previewText, htmlBody) if err != nil { log.Fatalf("构建MIME消息失败: %v", err) } // 发送邮件请求 input := &sesv2.SendEmailInput{ Content: &types.EmailContent{ Raw: &types.RawMessage{ Data: []byte(mimeMessage), }, }, Destination: &types.Destination{ ToAddresses: []string{to}, }, FromEmailAddress: aws.String(from), } _, err = client.SendEmail(context.TODO(), input) if err != nil { log.Fatalf("发送邮件失败: %v", err) } log.Println("邮件发送成功") }
关键配置说明
- 预览文本头:
X-Preview是主流客户端支持的自定义头,直接指定预览内容;部分客户端也可识别X-SES-Preview头,可按需添加。 - MIME结构:采用
multipart/alternative类型,同时包含text/plain和text/html部分,text/plain开头放置预览文本,作为自定义头不生效时的备选方案。 - Base64编码:SES的Raw消息要求必须经过Base64编码,所以构建完MIME后需完成编码步骤。
注意事项
- 确保AWS账号已验证发件邮箱或域名,避免邮件被拦截。
- 不同客户端对预览文本的识别逻辑有差异,同时设置自定义头和纯文本预览可提升兼容性。
- 替换代码中的AWS区域、发件人、收件人等参数为实际信息。
内容的提问来源于stack exchange,提问作者Aanchal Sharma
相关产品推荐
相关产品推荐

