我一直使用“信标”图像跟踪电子邮件多年,而那些允许图像下载的客户端已经很好地跟踪了有多少人打开了电子邮件。
我遇到了服务“DidTheyReadIt”,它显示了客户端实际阅读电子邮件的时间,我用他们的免费服务测试了它,它实际上非常接近我打开电子邮件的时间。
我很好奇他们如何实现跟踪这一点的能力,我确信无论选择何种解决方案,它都会给服务器/数据库带来很大的负担,并且很多社区都会回复“停止,否并且“不要”但我确实想调查一下并尝试一下,即使它足以让我在服务器上运行测试并说“地狱没有”。
我做了一些谷歌搜索,发现这篇文章有一个基本的解决方案http://www.re-cycledair.com/tracking-email-open-time-with-php
我在信标图片页面中使用sleep()进行了测试:
<?php
set_time_limit(300); //1000 seconds
ignore_user_abort(false);
$hostname_api = "*";
$database_api = "*";
$username_api = "*";
$password_api = "*";
$api = mysql_pconnect($hostname_api, $username_api, $password_api) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_select_db($database_api, $api);
$fileName = "logo.png";
$InsertSQL = "INSERT INTO tracker (FileName,Time_Start,Time_End) VALUES ('$fileName',Now(),Now()+1)";
mysql_select_db($database_api, $api);
$Result1 = mysql_query($InsertSQL, $api) or die(mysql_error());
$TRID = mysql_insert_id();
//Open the file, and send to user.
$fp = fopen($fileName, "r");
header("Content-type: image/png");
header('Content-Length: ' . filesize($fileName));
readfile($fileName);
set_time_limit(60);
$start = time();
for ($i = 0; $i < 59; ++$i) {
// Update Read Time
$UpdateSQL = "UPDATE tracker SET Time_End = Now() WHERE TRID = '$TRID'";
mysql_select_db($database_api, $api);
$Result1 = mysql_query($UpdateSQL, $api) or die(mysql_error());
time_sleep_until($start + $i + 1);
}
?>
上面代码的问题(除了每秒更新一次数据库)是一旦脚本运行,即使用户断开连接(或在这种情况下移动到另一封电子邮件),它仍继续运行。
我添加了“ignore_user_abort(false);”,但是因为没有连接到邮件客户端并且已经写入了标题我不认为“ignore_user_abort(false);”可以开火。
我查看帖子Track mass email campaigns,从底部“Haragashi”开始说:
“你可以简单地构建一个跟踪处理程序,逐字节地返回跟踪图像。每个字节刷新响应并休眠一段时间。
如果遇到流关闭异常,客户端已关闭电子邮件(已删除或更改为其他知道的电子邮件)。
在例外情况下,您知道客户“读取”电子邮件的时间。“
有谁知道我怎么能“简单地构建这样的跟踪处理程序”或者知道我可以在我的代码中实现的解决方案,这将迫使代码在用户断开连接时停止运行?
答案 0 :(得分:1)
我认为问题是你没有经常进行标题重定向。之所以有必要是因为一旦脚本开始在PHP + Apache中执行,它基本上会忽略客户端直到完成。如果每隔X秒强制重定向一次,则会使服务器重新评估客户端是否仍然连接。如果客户端未连接,则无法强制重定向,因此会停止跟踪时间。
当我玩这些东西时,我的代码看起来像:
header("Content-type: image/gif");
while(!feof($fp)) {
sleep(2);
if(isset($_GET['clientID'])) {
$redirect = $_SERVER['REQUEST_URI'];
} else {
$redirect = $_SERVER['REQUEST_URI'] . "&clientID=" . $clientID;
}
header("Location: $redirect");
exit;
}
如果设置了客户端ID,那么在此代码块之上,我将记录此尝试以读取数据库中的信标。每次服务器强制重定向时,很容易将电子邮件列的时间增加2秒。
答案 1 :(得分:0)
你不会做更像这样的事情:
<?php
// Time the request
$time = time();
// Ignore user aborts and allow the script
// to run forever
ignore_user_abort(true);
set_time_limit(0);
// Run a pointless loop that sometime
// hopefully will make us click away from
// page or click the "Stop" button.
while(1)
{
// Did the connection fail?
if(connection_status() != CONNECTION_NORMAL)
{
break;
}
// Sleep for 1 seconds
sleep(1);
}
// Connention is now terminated, so insert the amount of seconds since start
$duration = time() - $time;