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

2021/01/30 05:21 · php ·  · 0评论

我看到过像spypig.com这样的服务,在电子邮件中放置了一个小图像,并跟踪它何时打开以及从何处打开。他们跟踪城市,国家,IP地址等。这是如何完成的?

  1. 我们怎么知道什么时候打开邮件?以及如何生成图像?
  2. 如何检测IP地址以及如何从中得知位置?

基本上,在电子邮件的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对应于一个特定的电子邮件地址,因此可以找出每个订户的位置。

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查找器,例如 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'];
?>

其他答案很好,但是,由于人类似乎相信“任何跟踪都是邪恶的跟踪”,我想通过保留.png/ .jpg/.gif etc图像文件扩展名对用户“不可见”,从而将其进一步发展

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

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

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

关于第二部分,有几个地理位置Web服务,您可以在其中提交IP并获取地理位置。您可以在返回1x1像素图像的PHP文件中执行此操作。这是此站点上的一个很好的线索:
地理位置Web服务建议

本文地址:http://php.askforanswer.com/shiyongphphetuxianggenzongdianziyoujian.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!