使用PHP和图像跟踪电子邮件

问题描述 投票:22回答:3

我已经看到像spypig.com这样的服务在电子邮件中放置一个小图像,并在打开时从哪里跟踪。他们跟踪城市,国家,IP地址等。这是怎么做到的?

  1. 我们怎么知道邮件何时开通?图像是如何生成的?
  2. 如何检测IP地址以及如何从中获知位置?
php email geolocation tracking spy
3个回答
54
投票

基本上,在您的电子邮件的HTML正文中,将有一个<img>标记,如下所示:

<img src="http://www.yoursite.com/tracker.php?id=123456" alt="" />

当有人阅读他的邮件时,如果启用了图像,电子邮件客户端将向tracker.php发送请求,以加载图像,并将其作为参数传递给id=123456

这个tracker.php脚本将在您的服务器上,并且,当被调用时,它将:

  • 检查id参数,
  • 使用它来查找它对应的电子邮件地址 - 在为每个订阅者生成电子邮件时,您将为每封电子邮件生成不同的id
  • 做一些事情 - 比如日志“电子邮件123456已被打开”,还有一些额外的信息
  • 返回小图片的内容;像一个1x1透明的GIF。

tracker.php脚本知道它被调用的IP地址 - 就像任何其他PHP脚本一样:

$ipAddress = $_SERVER['REMOTE_ADDR'];

并且,从此IP地址开始,您可以使用地理定位服务来查找电子邮件已在世界中的哪个位置打开。 举几个例子,你可以看看MaxMindIPInfoDB

如您所知,id=123456对应于一个特定的电子邮件地址,这可以找出每个订阅者的位置。


10
投票

1.将跟踪器图像放在电子邮件中

<img src="http://www.yoursite.com/tracker.php?eid=123456&uid=123" alt="" width="1px" height="1px">

它的工作非常简单,一旦您的邮件打开,该跟踪器图像就会将请求发送到服务器,从该请求我们可以通过使用userID创建图像URL来获取信息,并且还可以考虑用户读取该邮件。

注意:不要使用display:none;用于隐藏图像的属性,可以通过垃圾邮件算法进行过滤。并且不要放置任何JavaScript代码,它也会阻止垃圾邮件过滤器

2.在tracker.php上

<?php
header("Content-Type: image/jpeg"); // it will return image 
readfile("img.jpg");

dbfunction(); // place your db code
?>

3.通过以下功能获取IP地址。

function get_client_ip() {
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR']))
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}
$PublicIP = get_client_ip();

4.地点:

任何地理定位服务都可以获得该位置,您可以使用开源GeoLocation finder,如nekudofreegeoip

例如

<?php
$json  = file_get_contents("http://ipinfo.io/$PublicIP/geo");
$json  =  json_decode($json ,true);
$country =  $json['country_name'];
$region= $json['region_name'];
$city = $json['city'];
?>

2
投票

关于问题的第一部分,我所做的是从PHP文件返回图像。除了返回图像(它可以是1x1像素透明png)之外,所有信息都记录到数据库中。这样,当调用PHP文件时,您知道图像已加载,即已读取电子邮件。问题是许多现代客户端不会自动加载图像。出于隐私原因,这是为了不允许您尝试做的事情。

关于第二部分,有几个地理定位Web服务,您可以在其中提交IP并获取地理位置。您可以在返回1x1像素图像的PHP文件中执行此操作。以下是关于此网站的一个很好的主题:Geolocation web service recommendations

© www.soinside.com 2019 - 2024. All rights reserved.