私は何年もの間「ビーコン」画像を使用して電子メールを追跡してきましたが、画像のダウンロードを許可するクライアントにとっては、電子メールを開いた人の数を追跡するのに非常に役立ちました。
クライアントが実際にメールを読んだ時間を示すサービス「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);」とは思いません。発砲することができます。
ポストトラックの大量メールキャンペーンを見て、下から上に「ハラガシ」と言っています。
「トラッキング画像をバイトごとに返すトラッキングハンドラを作成するだけです。バイトごとに応答をフラッシュし、一定期間スリープします。
ストリームが閉じられた例外が発生した場合、クライアントは電子メールを閉じています(削除されたか、知っている別の電子メールに変更されました)。
例外の時点で、クライアントが電子メールを「読んだ」時間はわかります。」
このような「追跡ハンドラーを単純に構築する」方法や、ユーザーが切断したときにコードの実行を強制的に停止するコードに実装できるソリューションを知っている人はいますか?