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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:16:27