Отслеживание электронной почты с помощью PHP и изображений - PullRequest
24 голосов
/ 27 марта 2011

Я видел, как сервис spypig.com помещает маленькое изображение в электронное письмо и отслеживает, когда оно открывается и откуда. Они отслеживают город, страну, IP-адрес и т. Д. Как это сделать?

  1. Как мы узнаем, когда почта открыта? И как это изображение генерируется?
  2. Как определяется IP-адрес и как можно узнать местоположение из это?

Ответы [ 3 ]

54 голосов
/ 27 марта 2011

По сути, в теле HTML вашего письма будет тег <img>, который будет выглядеть следующим образом:

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

Когда кто-то читает его почту с включенными изображениями, почтовый клиент отправит запрос на tracker.php, чтобы загрузить изображение, передав ему id=123456 в качестве параметра.


Этот tracker.php скрипт будет на вашем сервере, и при вызове он будет:

  • Проверьте параметр id,
  • Используйте его, чтобы узнать, какому адресу электронной почты он соответствует - при создании электронного письма для каждого из ваших подписчиков вы сгенерировали id, отличающееся для каждого электронного письма.
  • Сделайте что-нибудь, например, log "электронная почта 123456 открыта" , а также некоторые дополнительные сведения
  • вернуть содержимое маленького изображения; как прозрачный GIF 1x1.


Сценарий tracker.php знает, с какого IP-адреса он был вызван, как и любой другой сценарий PHP:

$ipAddress = $_SERVER['REMOTE_ADDR'];

И, начиная с этого IP-адреса, вы можете использовать службу геолокации, чтобы узнать, откуда в мире открыта электронная почта.
В качестве пары примеров вы можете взглянуть на MaxMind или IPInfoDB

Поскольку вы знаете, что id=123456 соответствует одному конкретному адресу электронной почты, это позволяет выяснить, где находится каждый из ваших подписчиков.

10 голосов
/ 21 июля 2016

1. Поместите изображение трекера на E-mail

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

Его работа очень проста. После того, как ваша почта открыта, это изображение трекера отправляет запрос на сервер, из этого запроса мы можем получить информацию, создав URL-адрес изображения с идентификатором пользователя, а также посчитав, что эта почта читается пользователь.

Примечание: не использовать дисплей: нет; свойство для скрытия ваших изображений, оно может фильтровать по алгоритму спама. И не размещайте никакие коды JavaScript, он также блокирует спам-фильтр

2. На трекере.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 с открытым исходным кодом, например nekudo , freegeoip .

например

<?php
$json  = file_get_contents("https://freegeoip.net/json/$PublicIP");
$json  =  json_decode($json ,true);
$country =  $json['country_name'];
$region= $json['region_name'];
$city = $json['city'];
?>
2 голосов
/ 27 марта 2011

Что касается первой части вопроса, то, что я сделал, вернул изображение из php-файла.Помимо возврата изображения (это может быть прозрачный png размером 1x1), вы можете записать всю информацию в базу данных.Таким образом, когда вызывается php-файл, вы знаете, что изображение было загружено, т.е. письмо прочитано.Проблема в том, что многие современные клиенты не загружают изображения автоматически.Это делается для того, чтобы не допустить того, что вы пытаетесь сделать из соображений конфиденциальности.

Что касается второй части, существует несколько веб-служб геолокации, где вы отправляете IP и получаете геолокацию.Вы можете сделать это в php-файле, который возвращает изображение 1x1 пикселей.Вот хорошая ветка об этом на этом сайте: Рекомендации веб-сервиса Geolocation

...