本文介绍如何开启打开和点击数据跟踪功能。
前置条件
1.在邮件推送控制台创建发信域名,海外集群可以不备案域名,华东集群需要备案,单击页面上方 备案 > ICP 备案系统 进入备案页面,并填写所有备案所需信息。
2.域名配置时,需配置可选项 CNAME 验证。CNAME值是链接跳转记录,帮助您用来收集打开点击数据。CNAME验证通过后,在控制台查询域名的状态为验证通过。
详情请见:如何验证配置的域名DNS解析是否生效
3.选择状态为 验证通过 的域名所创建的发信地址发信。
4.埋点行为强依赖标签。在设置邮件标签,创建标签,后续发信使用该标签。
注意点
打开和点击行为数据每个整点小时会统计上一个小时内的数据并且持久化,本小时内的埋点数据在下个整点一刻后可以在控制台查看。
约束
发信必须使用邮件标签,且邮件标签需要真实存在。
仅支持内容为html的埋点,邮件内容需要含文档主体元素,形如
<body>您的发信内容</body>
对于点击行为,待埋点的超链接需要以html引用的方式存在,即在html内容中
<html><body><a href=待埋点超链接></body></html>
这种形式,用户待埋点超链接需要是互联网访问的链接,前缀是http://
或者https://
的。点击行为的实现原理是检测到符合上述规范的待埋点链接,然后替换为我们采集服务的链接,待埋点链接会作为采集服务链接的一个参数,发出去的邮件会带上采集服务链接。当收信人点击链接的时候,首先跳转到我们的采集服务,采集服务对链接做合法性检测、解析参数、行为搜集等,然后重定向跳转到您的埋点链接服务。
使用方式
1.控制台发信
1.在新建发送邮件- 任务时,并勾选 开启 邮件跟踪,会包含打开和行为数据。
2.内容需符合上述约束。
2.API或者SDK发信
API或者SDK发信时,设置Tag为真实存在的Tag,ClickTrace设置为字符串”1”。
利用setHtmlBody设置发信内容,内容需符合上述约束。
3.SMTP发信
参照SMTP发信支持按照Tag埋点统计打开邮件数据设置头X-AliDM-Trace,其中Tag需要必须真实存在,OpenTrace对应值是字符串"1",LinkTrace对应值是字符串"1"。目前仅提供了Java的样例,其他语言按照该逻辑修改即可。
限制
smtp发信的邮件正文mime类型为”text/html;charset=UTF-8”,建议将内容传输编码头Content-Transfer-Encoding设置为”quoted-printable”。内容需符合上述约束。
Python示例:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
msg = MIMEMultipart('alternative')
texthtml = MIMEText('''<html><body><a href="https://www.aliyun.com">邮件跟踪</a></body></html>''', _subtype='html',
_charset='UTF-8')
if 'Content-Transfer-Encoding' in msg:
# 如果已设置,则选择第一个值进行替换(通常情况下,这个头只会有一个值)
msg.replace_header('Content-Transfer-Encoding', 'quoted-printable')
else:
# 如果未设置,则添加
msg['Content-Transfer-Encoding'] = 'quoted-printable'
msg.attach(texthtml)
Java示例:
import javax.mail.internet.MimeBodyPart;
// 假设 msg 是你要操作的 MimeMessage 对象,这里以 MimeBodyPart 为例进行演示
// 创建消息主体部分
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent("<html><body><a href=\"https://www.aliyun.com\">邮件跟踪</a></body></html>", "text/html; charset=UTF-8");
// 检查是否已设置'Content-Transfer-Encoding'
String[] cte = textPart.getHeader("Content-Transfer-Encoding");
if (cte == null || cte.length == 0) {
// 如果未设置,则添加
textPart.addHeader("Content-Transfer-Encoding", "quoted-printable");
} else {
// 如果已设置,则选择第一个值进行替换(通常情况下,这个头只会有一个值)
textPart.setHeader("Content-Transfer-Encoding", "quoted-printable");
}