首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用PHP和图像跟踪电子邮件

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

Stack Overflow用户
提问于 2011-03-27 17:39:39
回答 4查看 49.1K关注 0票数 34

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

  1. 我们如何知道邮件何时打开?图像是如何生成的?
  2. 如何检测IP地址,以及如何根据IP地址知道位置?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-27 17:50:48

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

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

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

tracker.php脚本将位于您的服务器上,当被调用时,它将:

  • 检查id参数,
  • 使用它来查找它对应的电子邮件地址--当为您的每个订阅者生成电子邮件时,您将为每个电子邮件生成不同的id
  • 会做一些事情--如日志“电子邮件123456已打开”,以及一些额外的gif小图像的内容;如1x1透明gif。

<id>F216

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

$ipAddress = $_SERVER['REMOTE_ADDR'];

而且,从这个IP地址开始,你可以使用地理定位服务来找出电子邮件是从世界的哪个地方打开的。

作为两个示例,您可以查看MaxMindIPInfoDB

正如你所知道的,id=123456对应于一个特定的电子邮件地址,这可以让你找出你的每个订阅者在哪里。

票数 67
EN

Stack Overflow用户

发布于 2016-07-21 12:09:07

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

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

它的工作非常简单,一旦你的邮件打开,追踪器图像发送请求到服务器,从该请求中,我们可以通过使用userID创建图像地址来获取信息,也可以将该邮件视为由用户读取。

注意:不要使用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'];
?>
票数 17
EN

Stack Overflow用户

发布于 2020-01-24 21:19:51

其他的答案都很好,但是,既然人类似乎确信“任何跟踪都是邪恶的跟踪”,我喜欢更进一步,通过保留.png/.jpg/.gif等图像文件扩展名对用户“不可见”。

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

AddHandler application/x-httpd-lsphp .png 

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

您可能已经有一个允许在.htm/.html文件中使用AddHandler的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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5448381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档