web-dev-qa-db-fra.com

Suivi des emails avec PHP et image

J'ai vu le service comme spypig.com placer une petite image dans l'e-mail et effectuer le suivi de son ouverture et de son emplacement. Ils suivent la ville, le pays, l'adresse IP, etc. Comment cela se fait-il?

  1. Comment savons-nous quand le courrier est ouvert? Et comment l'image Est-elle générée?
  2. Comment l'adresse IP est-elle détectée et comment est-il possible de connaître l'emplacement à partir de ?
20
esafwan

En gros, dans le corps HTML de votre email, il y aura une balise <img> qui ressemblera à ceci:

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

Quand quelqu'un lit son courrier, avec les images activées, le client de messagerie envoie une demande à tracker.php, pour charger l'image, en lui passant id=123456 en tant que paramètre.


Ce script tracker.php sera sur votre serveur et, lorsqu'il sera appelé, il:

  • Vérifiez le paramètre id
  • Utilisez-le pour trouver à quelle adresse électronique il correspond. Lors de la génération du courrier électronique pour chacun de vos abonnés, vous aurez généré une id différente pour chaque courrier électronique.
  • Faites des choses - comme log "le courrier électronique 123456 a été ouvert" , et quelques informations supplémentaires
  • renvoyer le contenu d'une petite image; comme un 1x1 gif transparent.


Le script tracker.php sait à partir de quelle adresse IP il a été appelé - comme tout autre script PHP:

$ipAddress = $_SERVER['REMOTE_ADDR'];

Et, à partir de cette adresse IP, vous pouvez utiliser un service de géolocalisation pour savoir d'où le courrier électronique a été ouvert dans le monde.
Quelques exemples, vous pouvez regarder MaxMind ou IPInfoDB

Comme vous savez que id=123456 correspond à une adresse électronique spécifique, cela permet de savoir où se trouve chacun de vos abonnés.

50
Pascal MARTIN

1. Placez l’image de suivi sur l’e-mail

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

Son fonctionnement est très simple. Une fois votre courrier ouvert, cette image de suivi envoie la demande au serveur. À partir de cette demande, nous pouvons obtenir des informations en créant l’URL de l’image avec l’identifiant de l’utilisateur, et aussi considérer que ce courrier est lu par l’utilisateur.

Remarque: n'utilisez pas display: none; propriété pour cacher vos images, il peut filtrer par algorithme de spam. Et ne placez aucun code javascript, il bloque également le filtre anti-spam 

2. Sur le tracker.php

<?php
header("Content-Type: image/jpeg"); // it will return image 
readfile("img.jpg");

dbfunction(); // place your db code
?>

3. L'adresse IP est obtenue par la fonction suivante.

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. Emplacement:

La localisation utilise tous les services de géolocalisation. Vous pouvez utiliser un outil de recherche de géolocalisation en source libre, tel que nekudo , freegeoip .

par exemple

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

A propos de la première partie de la question, ce que j'ai fait était de retourner l'image à partir d'un fichier php. En plus de renvoyer une image (il peut s'agir d'un png transparent de 1 x 1 pixel), vous enregistrez toutes les informations dans la base de données. Ainsi, lorsque le fichier php est appelé, vous savez que l’image a été chargée, c’est-à-dire que le courrier électronique a été lu. Le problème est que beaucoup de clients modernes ne chargent pas les images automatiquement. Ceci pour ne pas autoriser le genre de chose que vous essayez de faire, pour des raisons de confidentialité.

À propos de la deuxième partie, il existe plusieurs services Web de géolocalisation, dans lesquels vous soumettez une IP et obtenez la géolocalisation. Vous pouvez le faire dans le fichier php qui renvoie l’image 1x1 pixel. Voici un bon fil à ce sujet sur ce site: Recommandations de services Web de géolocalisation

2
Elad Lachmi

Je cherchais un conseil pour masquer l'image, le moyen le plus simple semble être le cas: 

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

pour compléter l'explication brillante de Pascal.

0
Guillaume Blanco