für die meisten Unternehmen ist es interessant ob der User die Email(Newsletter usw.) gelesen(geöffnet) hat oder nicht.
Die verbreiteste Variante ist das mitsenden einer Grafik(Logo zum Beispiel), hier wird der Name(unique ID automatisch generiert ) oder die benötigte unique ID als Variable mit angehangen. Wichtig hierbei ist das die Grafik vom Server geladen wird und nicht als Anhang in der Email.
Im Quelltext der Email sieht das so aus:
https://www.meineDomain.de/image/1245e7r987.jpg
oder angehangen an einer Grafik als $_GET[‚variable‘]:
https://www.meineDomain.de/image/meinLogo.jpg?uniqueID=1245e7r987
Für das Tracken benötigt man eindeuige ID, die in jeder automatisch versendeten Email generiert wird. Diese ID wird/muss abgespeichert werden um eine Zuordnung/Auswertung zu gewährleisten. In den meisten Fällen wird diese ID in einer Datenbank-Tabelle abgespeichert, eine Excel-Tabelle oder eine Textdatei reichen aber zum speichern auch aus.
Was passiert nach dem versenden der Email:
Wenn der User die Email öffnet wird die Grafik vom Server geladen, beim laden vom Server wird ein Script ausgeführt welche die ID abspeichert.
Ab diesem Punkt hat man alle Informationen um ein Script für die Ausgabe der Auswertung fertig zustellen.
Wie kann man das Tracken einer Email als User verhindern?
Ganz einfach: In den man die Email nur als simple Textdatei(Plain Text) öffnet. In diesem Fall werden keine externe Dateien geladen und eine Auswertung
ist nicht möglich. Die meisten Freemail-Anbieter unterstützen die Anzeige aber möglicherweise nicht bzw. in jedem Email-Programm(wie z.Bsp.: Thunderbird oder Microsoft Outlook) findet man diese Einstellung unter Ansicht.
Benötigte Dateien/Funktionen zum Email tracken:
Email-Template / Email-Nachricht
<php>
$uniqueID=rand();
</php>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Meine News</title>
</head>
<body>
<!-- Grafik mit uniqueID -->
<center><img src="https://www.meineDomain.de/image/meinLogo.jpg?uniqueID=<?=$uniqueID?>" alt="" border="0"></center>
<!-- /Ende Grafik mit uniqueID -->
<br><br><br>
Sehr geehrte Damen und Herren
...
...
...
</body>
</html>
Funktion die ausgeführt wird wenn die Email versandt wurde:
<php>
# absenden der Email, im Beispiel mit mail();
mail($userEmail,$subject,$mailText,$emailHeader);
#Insert Werte(Email-Adresse vom Empfänger und #uniqueID) in die Datenbanktabelle
$em=new emailTracking;
$em->sendEmailAnduniqueID($userEmail,$uniqueID)
</php>
PHP-Datei die die Grafik „meinLogo.jpg“ erstellt damit eine PHP-Funktion beim aufruf ausgeführt wird (die Grafik ansich kann ja keine Funktion/Befehle ausführen):
<php>
ini_set('display_errors', 1);
ob_start();
# Eintrag in die DB, wenn die Email aufgerufen wird vom User
$em=new emailTracking;
if(isset($_GET['uniqueID']) && is_numeric($_GET['uniqueID'])){
$em->insertUniqueID();
}
# Grafik wird erstellt
$loadIMG='meinLogo.jpg';
if(isset($_GET['uniqueID'])){
$string=strip_tags($_GET['uniqueID']);
$loadIMG='meinLogo.jpg?uniqueID='.$string;
}
# Ausgabe der Grafik
@header('Content-Type: image/jpeg');
$showIMG =$em->showEmailImage($loadIMG);
imagejpeg($showIMG);
imagedestroy($showIMG);
ob_end_flush();
</php>
Die Klasse „emailTracking“:
<php>
#class emailTracking
#author konstanten.net
class emailTracking{
function showEmailImage($loadIMG)
{
$img = @imagecreatefromjpeg($loadIMG);
return $img;
}
function insertUniqueID()
{
$uid=$this->checkGetValue(($_GET['uniqueID']));
if(isset($uid) && is_numeric($uid))
{
$query="SELECT * FROM `email_send` WHERE uid='".$uid."';
$res=SQL($query);
$countRes=mysqli_num_rows($res);
if($countRes==1)
{
$arr=mysqli_fetch_assoc($res);
$query="SELECT * FROM `email_tracking` WHERE uid='".$uid."' AND `userEmail`='".$arr['userEmail']."';
$resTB2=SQL($query);
$countRes=mysqli_num_rows($resTB2);
if($countRes==0)
{
$insertSQL="INSERT INTO `email_tracking` (`uid`,`userEmail`,`time`) VALUES ('".$uid."','".$arr['userEmail']."','".time()."')";
SQL($insertSQL);
$deleteSQL="DELETE FROM `email_send` WHERE uid='".$uid."'";
SQL($deleteSQL);
}
}
}
}
function sendEmailAnduniqueID($userEmail,$uniqueID)
{
$query="SELECT * FROM `email_send` WHERE uid='".$uniqueID."' AND `userEmail`='".$userEmail."'";
$res=SQL($query);
$countRes=mysqli_num_rows($res);
if($countRes==0)
{
$insertSQL="INSERT INTO `email_send`(`uid`, `userEmail`,`time`) VALUES ('".$uid."','". $userEmail."','".time()."')";
SQL($insertSQL);
}
}
function checkGetValue($val)
{
if(isset($val) && is_numeric($val)){
$val=$val;
}else{
$val=0;
}
return $val;
}
}
Und zum Schluss noch die .htaccess für das „umschreiben“ der Grafik-Datei mit dem Modul mod_rewrite:
RewriteEngine on
RewriteRule ^meinLogo.jpg$ meinLogo.php?%{QUERY_STRING} [L]