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

时间:2011-03-27 09:39:39

标签: php email geolocation tracking spy

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

  1. 我们如何知道邮件何时开通?图像怎么样? 产生?
  2. 如何检测IP地址以及如何知道位置 它?

4 个答案:

答案 0 :(得分:52)

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

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

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


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

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


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

$ipAddress = $_SERVER['REMOTE_ADDR'];

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

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

答案 1 :(得分:9)

<强> 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。位置:

任何地理定位服务都可以获得该位置,您可以使用nekudofreegeoip这样的开源GeoLocation查找程序。

例如

<?php
$json  = file_get_contents("https://freegeoip.net/json/$PublicIP");
$json  =  json_decode($json ,true);
$country =  $json['country_name'];
$region= $json['region_name'];
$city = $json['city'];
?>

答案 2 :(得分:3)

其他答案很好,但是,由于人类似乎确信“任何跟踪都是邪恶的跟踪”,因此我想通过保留 .png / .jpg / .gif 等图片文件扩展名。

我不确定与所有类型的Web服务器和主机是否兼容,但是对我来说,这是对.htaccess中已经有了的AddHandler指令的快速更改,例如:

AddHandler application/x-httpd-lsphp .png 

......以允许在扩展名为.png的文件中处理PHP代码。

您可能已经有了一个AddHandler行,以允许.htm / .html文件中的PHP;如果是这样,只需将适当的图像文件扩展名添加到列表的末尾即可。

这大概是我的“跟踪图像”代码,文件另存为trackimage.png或其他任何内容:

<?php //silently log user and return image
  $ip=$_SERVER['REMOTE_ADDR'];
  $uri=tidy($_SERVER['SCRIPT_URI']);
  $querystring=tidy($_SERVER['QUERY_STRING']);
  $useragent=tidy($_SERVER['HTTP_USER_AGENT']);

  $json  = file_get_contents("https://ipinfo.io/".$ip."/geo");
  if(($json<>'')&&(strpos($json,"error")===false)){ extract(json_decode($json ,true)); }
  $country=tidy($country);
  $prov=tidy($region);
  $city=tidy($city);
  list($lat,$lon)=explode(',',$loc);
  $lat=tidy($lat);
  $lon=tidy($lon);

  $sql = "INSERT INTO img_track_table set ip='$ip', useragent=$useragent, uri=$uri, " 
    ."querystring=$querystring, country=$country, prov=$prov, city=$city, lat=$lat, lon=$lon;";

  require 'connect.php'; $conn=new mysqli($servername, $username, $password, $dbname);
  if ($conn->connect_error) { /* couldn't connect, but do nothing about it */ } 
  }else{  //run insert query
    if(!$conn->query($sql)) { /* query error, but do nothing about it */ }
    $conn->close();
  }

  //return image
  header("Content-Type: image/png"); 
  readfile("myActualImageFile.png");

  function tidy($str){ //remove quotes and backslashes from string
    if(is_null($str)||($str=="")){return "null";}
    $str=trim(str_replace('\\','',str_replace("'","",str_replace('"',"",$str))));
    if(is_numeric($str)){return $str;}
    return "'$str'"; 
  }

请注意,如果图像之前的代码返回了错误文本或其他内容,则该图像将无法显示。可能还需要研究可能适用于您的情况的安全性问题。例如this

答案 3 :(得分:2)

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

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