最近需要做个邮件已读功能,本文记录了实现的过程。
场景
最近工作消息模块通过邮件发消息,需要有个邮件追踪的功能,即邮件发出去能知道是否已读并记录状态。
思路
一. 利用阅读回执
阅读回执的原理就是发送邮件的时候,在 header 信息中增加("Disposition-Notification-To","1")
,接收方打开后会回一封邮件给发送方,表明之前的邮件已读。在实际测试中发现接收方收到后可以选择是否发送回执,如果不发送,对于发送方来说是未读。即使默认自动回执,不同邮箱回执格式不同,也无法判断是哪条消息记录,凉凉~ 此方案不适合。
二. 使用 JavaScript 或者其他方案
本想使用 JavaScript,经查询为了安全,邮件中不允许运行 JavaScript 。既然 js 不行,考虑邮件发送的时候默认在邮件中加一张图片,利用打开邮件时加载图片来实现,网上也有类似的邮件追踪工具,感觉可行,开始干活
实现
可以使用 logo 或者 1*1px 的透明图片,插入到邮件中的效果如下,12345 为消息记录的id,用来与业务对应
1 | <img src="http://域名/track?msgId=123456" id="track" style="" alt="" /> |
img 标签加载时是 get 请求,后台写个方法用来接这个请求的参数,pom 依赖和 controller 内容如下
1 | <dependency> |
1 |
|
经测试,可以拿到传递过来的参数 msgId,如果需要也可以获取 IP 等其他信息
优点和局限性
优点:
- 实现简单,没有太多代码和逻辑
- 与阅读回执不同,邮件追踪不需要对方确认属于强制追踪阅读情况
局限性:
- 在某些特定的网络(系统),因为限制访问图片的链接,邮件追踪可能无法生效
- 某些邮件客户端限制了打开图片,或者只使用文本方式查看邮件内容,邮件追踪也无法生效