6

私は何年もの間「ビーコン」画像を使用して電子メールを追跡してきましたが、画像のダウンロードを許可するクライアントにとっては、電子メールを開いた人の数を追跡するのに非常に役立ちました。

クライアントが実際にメールを読んだ時間を示すサービス「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);」とは思いません。発砲することができます。

ポストトラックの大量メールキャンペーンを見て、下から上に「ハラガシ」と言っています。

「トラッキング画像をバイトごとに返すトラッキングハンドラを作成するだけです。バイトごとに応答をフラッシュし、一定期間スリープします。

ストリームが閉じられた例外が発生した場合、クライアントは電子メールを閉じています(削除されたか、知っている別の電子メールに変更されました)。

例外の時点で、クライアントが電子メールを「読んだ」時間はわかります。」

このような「追跡ハンドラーを単純に構築する」方法や、ユーザーが切断したときにコードの実行を強制的に停止するコードに実装できるソリューションを知っている人はいますか?

4

2 に答える 2

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秒ずつ増やすのは簡単でした。

于 2012-06-30T12:52:46.727 に答える
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;
于 2012-06-29T14:19:11.750 に答える