web-dev-qa-db-ja.com

PHPと画像でメールを追跡する

私はspypig.comのようなサービスが小さな画像を電子メールに入れ、それが開かれたとき、どこから来たかを追跡するのを見てきました。都市、国、IPアドレスなどを追跡します。これはどのように行われますか?

  1. メールが開封されたことをどのように知ることができますか?そして、画像はどのように生成されますか?
  2. IPアドレスはどのように検出され、どのようにしてそこから場所を知ることができますか?
28
esafwan

基本的に、メールのHTML本文には、次のような<img>タグがあります。

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

誰かが画像を有効にしてメールを読むと、メールクライアントはtracker.phpにリクエストを送信して画像を読み込み、id=123456をパラメータとして渡します。


このtracker.phpスクリプトはサーバー上にあり、呼び出されると、次のようになります。

  • idパラメータを確認し、
  • これを使用して、対応するメールアドレスを見つけます。サブスクライバーごとにメールを生成すると、メールごとに異なるidが生成されます。
  • ログ "Email 123456が開かれました"などのいくつかの操作といくつかの追加情報
  • 小さな画像のコンテンツを返します。 1x1の透明なGIFのように。


tracker.phpスクリプトは、他のPHPスクリプトと同様に、どのIPアドレスから呼び出されたかを認識しています。

$ipAddress = $_SERVER['REMOTE_ADDR'];

そして、このIPアドレスから始めて、地理位置情報サービスを使用して、世界中のどこから電子メールが開かれたかを知ることができます。
いくつかの例として、 MaxMind 、または IPInfoDB を見てみましょう。

id=123456は特定の1つのメールアドレスに対応していることをご存知のとおり、これにより、サブスクライバーのそれぞれがどこにいるかがわかります。

54
Pascal MARTIN

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 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'];
?>
10
NaveenDA

質問の最初の部分について、私がしたことは、PHPファイルから画像を返すことでした。画像(1x1ピクセルの透明なpngの場合もあります)を返すことを除いて、すべての情報をこのように、PHPファイルが呼び出されると、画像が読み込まれたこと、つまり電子メールが読み込まれたことがわかります。問題は、最新のクライアントの多くが画像を自動的に読み込まないことです。これは、プライバシー上の理由から、ユーザーが実行しようとしていることだけを許可しないためです。

2番目の部分については、IPを送信してジオロケーションを取得するいくつかのジオロケーションWebサービスがあります。これは、PHPファイルで行うことができます。これは、このサイトのこのスレッドに関する良いスレッドです: ジオロケーションWebサービスの推奨事項

2
Elad Lachmi

画像を非表示にするためのヒントを探していましたが、最も簡単な方法は次のようです:

<img src="http://www.yoursite.com/tracker.php?id=123456" alt="" width="1" height="1" border="0">

パスカルの見事な説明を完了する。

0