亚马逊AWS官方博客

使用 Amazon SES 列表功能实现邮件的取消订阅

邮件营销是一种广泛使用的在线营销方式,但同时也存在一些问题和挑战,为了保护用户的权益,减少垃圾邮件的困扰,主流邮件服务提供商如 Gmail 和 Yahoo Mail 制定了一系列发送者要求,其中包括提供一键取消订阅功能。

一键取消订阅(One-Click Unsubscribe)是指在邮件正文或标题中提供一个明确的链接,允许收件人快速退订该邮件列表或主题,无需进行复杂的操作。这一要求的目的是提高用户体验,减少投诉率,从而维护良好的发送声誉。

该要求的理论依据来自于 RFC(Request for Comments)文档,这是由互联网工程任务组(IETF)发布的一系列描述互联网相关技术标准的文档。其中:

RFC 2369 定义了”List-Unsubscribe”标头字段,用于指定退订邮件列表的方式,如邮件地址或网页链接。

RFC 8058 对此进行了扩展,引入了”List-Unsubscribe-Post”标头字段,支持通过 HTTP POST 请求进行退订操作。

通过在邮件中包含这些标头字段,发送者可以为收件人提供方便的一键退订渠道,从而降低投诉风险,提高发送声誉。

Amazon Simple Email Service (Amazon SES) 利用原生的列表和订阅管理功能来帮助用户遵守 Gmail 和 Yahoo Mail 的发送要求。利用 Amazon SES 发送邮件时,在 X-SES-LIST-MANAGEMENT-OPTIONS 的标头中指定 contactListName 和 topicName,Amazon SES 将自动为该邮件增加取消订阅的链接。当用户通过该链接取消订阅后,Amazon SES 将不再向该联系人发送对应主题的邮件。

使用流程

创建列表和主题

在邮件的 X-SES-LIST-MANAGEMENT-OPTIONS 标头中指定  contactListName 和 topicName,需要通过 Amazon SES 的列表管理功能创建列表和主题。

执行以下命令创建 list-demo 的联系人列表及两个测试使用的主题。在这里,我们创建两个用于示例的 topic1 和 topic2 主题。

aws sesv2 create-contact-list --contact-list-name list-demo \
    --topics TopicName=topic1,DisplayName=topic1,DefaultSubscriptionStatus=OPT_IN \
    TopicName=topic2,DisplayName=topic2,DefaultSubscriptionStatus=OPT_IN

注意:每个账号在一个区域只能创建一个联系人列表,每个列表最多可以包含 20 个主题。

执行以下命令确认列表及主题创建成功。

aws sesv2 get-contact-list --contact-list-name list-demo

为发送邮件增加标头

在发送邮件时,通过添加 X-SES-LIST-MANAGEMENT-OPTIONS  标头,指定为上一步创建的 ContactListName 及 TopicName。以下为 java 以 SMTP 协议发送邮件时的部分代码示例。

MimeMessage msg = new MimeMessage(session);
msg.addHeader("X-SES-LIST-MANAGEMENT-OPTIONS", "list-demo; topic=topic1");

在邮件的正文内容中,通过插入 {{amazonSESUnsubscribeUrl}} 占位符的方式,可以让 Amazon SES 将占位符代替为相应的取消订阅链接。在接收到邮件后,您可以查看到邮件正文中具有相关的链接。

最终用户取消订阅样例

通过访问邮件的链接,可以看到当前收件人当前订阅的主题。取消勾选主题 topic1 并点击 Update 按钮进行取消 topic1 的订阅进行测试。

通过以下命令,查看相应收件人的订阅状态,在输出的内容中,可以查看到相应的主题 topic1 目前处于取消订阅的状态。

aws sesv2 get-contact --contact-list-name list-demo --email-address <email-address>

注意:默认情况下,只有在发送了邮件给相关收件人以后,才可以通过命令查看收件人的订阅状态。您也可以通过 createImportJob 的方式,将现有联系人导入到 Amazon SES。

当您再次发送主题为 topic1 的邮件给取消该主题的收件人时,该收件人将不再接收到该类邮件,而发送主题 topic2 时,收件人仍然可以正常接收邮件。

最后,清理该次测试所使用的联系人列表,您可以通过以下命令删除创建的列表。

aws sesv2 delete-contact-list —contact-list-name list-demo

总结

在这篇文章中,您使用 Amazon SES 的列表管理及订阅管理的功能,简单地通过在发送邮件时增加 X-SES-LIST-MANAGEMENT-OPTIONS 标头及插入 {{amazonSESUnsubscribeUrl}} 占位符的方式,实现了收件人的取消订阅功能,这也让您的邮件发送遵守了 Gmail 和Yahoo Mail 对于批量发送邮件的要求,提高了用户的体验。

参考链接

  1. 使用列表管理- Amazon Simple Email Service
  2. 使用订阅管理 – Amazon Simple Email Service
  3. Using one-click unsubscribe with Amazon SES

本篇作者

黄际东

亚马逊云科技解决方案架构师,有过银行、旅游、直播、教育等行业的十多年项目经验。曾独立主导实现从零到千万用户级别的教育类应用,也参与研发过月活跃用户过千万的全球知名直播平台。在互联网领域拥有多年的研发及运维经验,是一个喜欢编程的解决方案架构师。

汤力嘉

亚马逊云科技高级解决方案架构师,负责基于亚马逊云科技的云计算方案的架构设计,在游戏、多媒体方向有丰富部署实践经验。