如何知道发出去的邮件是否已读?

!!! WANRING !!!
提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,用户将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任。

TL;DR

通过用户打开邮件中的第三方图片,并分析这张图片的请求日志来逆向推断邮件是否被打开阅读。

前言

这个标题的问题源于我的一个好友最近要申请博士,但是有急于想知道教授有没有看到「套瓷」(拉近乎,搞好关系。在出国留学申请中,指通过联系教授达到增加自己被录取和获得奖学金的机会)邮件,所以有了这篇文章。

我们用户在浏览邮件时,往往内容不单单只有文字,还有一些图片文件。虽然对用户无感,但是实际上,用户在互联网上做的任何操作,都会被记录下来,也就是所谓的「用户行为日志」,至于是被谁记录的,大概可以理解为,从你的电脑到目标位置所经过的每一个节点,都有被记录的可能(网络服务提供商、操作系统、邮件软件、邮件服务商或目标站点等等)。

而我们可以通过用逆向的方法思考一下,如果在整个邮件发送过程中加入一个可以自由操纵的节点,那么就能够截获到目标用户有没有打开邮件。

原理

简单来说就是,我们可以在发送的邮件中,插入一张自定义的照片,然后每次接收者打开邮件,就会加载图片,这个时候,储存图片的服务器就会记录这次访问的时间、地点、客户端类型。

流程解释

  1. 教授收到了一封邮件,并决定打开读一读;
  2. 软件会自动向邮件服务器请求邮件的具体内容;
  3. 如果这份邮件里包含了一段文本以及一张我们插入第三方图片,此时会分别请求文本以及图片;
  4. 具体的文本内容会从邮件服务器中获取得到;
  5. 第三方图片,则会直接访问图片地址并返回图片,同时服务器会记载每次请求的客户端信息日志。

我们的具体操作关键就是在第五步,通过查看这个「客户端信息日志」来确定图片是否以及何时被加载,来反向推算出邮件是否被读过。

具体实现

显而易见,要实现上述第五步的操作,就需要拥有一个可以「放置图片而且能够查看访问日志」的服务器。我们有以下几种方法来实现:

  1. 拥有一个服务器/vps,通过搭建nginx服务器查看access_log来实现

    优点:自己掌握服务器,实时知道日志信息
    缺点:偏向技术类,对于非开发人员有实现难度。我会在系列下一篇文章通过「docker一键部署nginx」教程来详解讲解

  2. 使用云储存服务商,例如七牛、又拍云,提供的易用服务,快速实现上述功能。

    优点:对于非技术类人员来说较为友好,同时提供可视化界面
    缺点:服务器不在自己手里,日志的生成有延时,七牛只能看7小时前的

使用七牛云实现

  1. 首先我们确定最终收到的邮件样式如下,我们把小心机藏在了最后模拟的「联系方式」图片中。

  2. 我们打开七牛的「管理控制台」,并添加一个「对象储存」。

    此处我们省略注册过程,如果你需要注册的话,可以考虑点击我这个邀请链接,好像双方都有优惠活动。


  1. 创建成功后自动进入该储存空间的页面,可以看到右侧有一个「域名」,这就是外界访问这个空间文件的域名,同时注意到,这种测试域名的使用是有限制的,总结一下:
  • 只能用30天,30天后这个域名就失效了,过往发出去的邮件里的图片在30天后,收件人就彻底看不见了
  • 这个域名一天被访问的流量总和不能超过10G。(空间只有一张图片10M,图片在今天被访问100次,则空间本日的流量为1000M)

  1. 进入「内容管理」,上传图片,并获取这张图片的「外链」。

形如以下样式:

1
http://pihggo7u2.bkt.clouddn.com/banner_mini.png

  1. 进入「空间设置」,开启「空间日志」并保存设置。这是最为关键的一步,如果忘记打开,就会前功尽废了。

  2. 把这张外链图片添加到我们的邮件中,请注意,是以链接图片的形式添加,而不是上传本地的照片。只有对方是通过链接访问我们的图片,才有可能被记录到浏览。

  3. 发送后,静待七牛的「访问日志」生成,他会以文件的形式储存在和你照片的同一个文件夹,是以「_log/空间名字/年/月-日-时-分-秒」的命名形式存在,通过添加右边的「…」进行下载,实际上是一个txt文件,我们用任意一种文本编辑软件打开就可以看到。

  1. 打开后,我来介绍一下,日志的组成。

  2. 那我们就可以通过定期的分析日志,就能知道,哪一个时间这个邮件被访问过了。

我们怎么知道是哪个老师/用户访问了我们的邮件呢?

很显然,上面的情况只能知道,图片被浏览过,邮件被打开阅读了,但是如果同一个邮件发给多个人,如何区分是谁访问呢?
答案是很难,不是说不行,可以通过日志的客户端类型来分析,但是相当不可靠。

所以更好的方案是,针对每一个接收者,我们特意为他设置一个图片文件(图片内容可以是一样的),这样我们就能通过日志里的「被访问文件名」来对应,是哪一封邮件被打开了。

能够知道访问用户的具体地域吗?

可以,但是不一定可靠。
我们在日志文件中,能够拿到访问用户的IP地址,我们去IP地址库中填入这个IP地址就能知道用户的地域情况。

但是为什么说不可靠呢?

  • 因为google这种大型邮件提供商早就为了用户隐私做足了保护,他们会使用google自己的服务器代用户访问照片,然后中转展示给用户,所以日志记录得可能只是google服务器的地址,而不是真的用户地址。
  • 因为一些分发或者CDN的原因,地址记录的可能只是中间中转节点的IP而非目标用户的地址。

这种骚操作的可靠率有多少?

这个我也不能确切的告诉你,因为有一些邮件软件会默认拦截第三方图片的加载导致实际上看了但是日志没有记录的情况。
亲身经历的话,朋友的套瓷邮件倒是每天都有浏览记录,但是这位朋友还没有收到回信哈哈,还是需要继续奋斗呀。

Ps

  • 这个系列的下一章节会介绍,通过自己的服务器或者vps来构建类似服务,更为可靠和实时。
  • 实际上这种应用,还有一些更骚的操作,比如插入「透明照片」、「照片实际上是一个302跳转链接」等等,但是涉及到一些web技术以及安全的技术,有机会会进行一些介绍
  • 本文仅仅只是介绍相关原理,请不要用在非法用途上。