PHP: Führen Sie Skript aus, um das Bild in einer E-mail eingebettet zu laden

Dieser Tipp ist nützlich für jeden, der will wissen, ob die e-Mail schickten Sie gelesen wurde. In diesem Fall, Fügen Sie ein Bild im Textkörper der e-Mail-Nachricht, Beim Öffnen, löst ein Skript auf remote-server.

Präsentation

Diese Technik ist weit verbreitet in E-Mail-Marketing verwendet, so dass der Absender Hunderte oder Tausende von E-Mails an Empfänger Ihrer Mailings sendet, um eine Zielgruppe zu erreichen, und wollen das Feedback wissen (Rückgabe) der Kampagne, dh, ob der Empfänger die in die E-Mail eingebettete Anzeige gelesen hat oder nicht.

Wie es funktioniert?
Die Argumentation ist einfach, nur Sie in den Text der E-Mail setzen (Inhalt) ein HTML IMAGE-Tag, mit dem SRC-Attribut, das, nicht direkt zu einem Bild, wie es normalerweise geschieht, jedoch für ein benutzerdefiniertes Skript, das auf einem Remoteserver gehostet wird, wo Sie Routine und, da ja, Rendern eines Bildes (oder nicht). Kompliziert? Dass nichts, siehe Beispiel:

1
2
3
<?PHP
  <Img src="http://seuservidor.com/script.php?email=pessoa@gmail.com&destinatario=Taylor+Lopes" />
?>

Wozu dient es??
Beachten Sie, dass beim Öffnen der E-Mail durch den Benutzer, lädt das vermeintliche Bild automatisch, was eigentlich ein Skript ist. Dies ist nützlich, um E-Mail-Statistiken zu erstellen, die angezeigt wurden, einschließlich der Ermittlung der WHO (Empfänger) Und wann (Datum/Uhrzeit). Natürlich, das ist kein “Raten”, wir wissen, wer die E-Mail geöffnet hat, weil wir diese Daten zum Zeitpunkt des Sendens an die URL des Bildes binden.

Unbequem
Damit dies funktioniert, Der Empfänger muss unbedingt konfiguriert haben, damit seine E-Mail im HTML-Format gelesen wird, Obwohl dies bereits ein Standard ist, der von den meisten Benutzern akzeptiert wird. Im schlimmsten Fall, Der E-Mail-Anbieter zeigt eine Meldung an, die besagt, dass er die Bilder blockiert hat, Fragen Sie jedoch, ob der Benutzer, die auch in der Regel akzeptiert wird, da nur wenige Menschen In dieser Praxis Bosheit sehen. Im Fall von Google, Eine linkförmige Nachricht wird angezeigt, so:

1
2
3
...
  Bilder werden nicht angezeigt - Bilder unten anzeigen - Suport-Bilder immer anzeigen@E-Mail.Microsoft.mit
...

Ich werde zwei Möglichkeiten kommentieren, dies zu tun; beide arbeiten gleichermaßen, Die zweite ist diskreter, wenn Daten nicht in der URL angezeigt werden, Obwohl es mehr Speicherressource erfordert. Komm schon!

Lösung 1

In der Praxis
Sie benötigen nur zwei PHP-Codes:
(1) eine, um die E-Mail im HTML-Format mit dem integrierten IMG-Tag zu senden
(2) und eine weitere, um die Informationen zum Zeitpunkt des Öffnens der E-Mail zu erfassen

SCHRITT 1 – E-Mail

sendmail.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?PHP
  // *** Ihre E-Mail (E-Mail von denen, die senden)
  $remetente_nome     = 'Anonym';
  $remetente_email    = "anonimo@email.com";
 
  // *** Ihr Ziel (E-Mail an diejenigen, die) 
  $destinatario_nome  = 'Mario Bross';
  $destinatario_email = 'mariobross@email.com';
 
  // *** Betreff und Text der Botschaft
  $Betreff      = 'Skriptausführung beim Laden von Bild testen.';
  $Nachricht     = "
    <html lang="pt-br">
      <Kopf>
        <meta charset="iso-8859-1" />    
        <Titel>".$Betreff."</Titel>
      </Kopf>
      <Körper>
        <img src="http://seuservidor.com/script.php?email='.Urlencode($destinatario_email)."&destinatario='.Urlencode($destinatario_nome)."&subject='.Urlencode($Betreff)."" />
      </Körper>
    </html>";
 
  // Header, der angibt, dass der Inhalt HTML-Typ ist (um das IMG-Tag lesen und das Skript ausführen zu können)
  $Header       = "MIME-Version: 1.0\n"; 
  $Header      .= "Content-type: Text/html; charset=ISO-8859-1\n"; 
  $Header      .= "From: ".(Leer($remetente_nome) ? $remetente_email : '"'.$remetente_nome."" <".$remetente_email.">")."\n";
 
  // Senden Sie die E-Mail
  $E-Mail = Leer($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome."" <".$destinatario_email.">";
  Mail($E-Mail, $Betreff, $Nachricht, $Header);
?>

SCHRITT 2 – Erfassen von Informationen

Gut, Sie haben bemerkt, dass beim Lesen der IMG TAG ein Anruf an die Datei erfolgt “script.php”, Rechts? Jetzt müssen wir es erstellen, um die Informationen zu nehmen und zu speichern, vorzugsweise in einer Datenbank.

Erstellen von TABELLE
Da wir die Daten des Empfängers, der die E-Mail geöffnet hat, beibehalten müssen, wir können eine Tabelle wie diese unten erstellen. Siehe das Feld "datahora_visualizado", die sich auf das letzte Datum und die Uhrzeit bezieht, zu der der Benutzer die E-Mail 'Zähler', , die die Anzahl der Angezeigtder E-Mails aufzeichnet.

maladireta.sql
1
2
3
4
5
6
7
8
9
CREATE TABLE 'Mailing' (
  INT NICHT 'id' NULL AUTO_INCREMENT PRIMARY SCHLÜSSEL ,
  VARCHAR E-Mail( 100 ),
  'destinatario' VARCHAR( 100 ),
  VARCHAR 'Subjekt'( 200 ),
  'datahora_envio' DATETIME NICHT NULL,
  'datahora_visualizado' DATETIME,
  'Zähler' INT Standard 0
) MOTOR = Myisam ;

Skript zum Erfassen von Informationen und Anzeigen eines Bildes
Finishing, lassen Sie uns Daten wie E-Mail des Empfängers, Name des Empfängers, Betreff der Nachricht und Datum/Uhrzeit von, der die E-Mail geöffnet hat, Speichern von allem in der von uns erstellten Datenbank, für den Fall, dass wir in Zukunft eine Statistik. Am Ende des Skripts, Lassen Sie uns tatsächlich ein Bild erstellen und anzeigen, nur nicht, um eine IMG TAG mit existenzieller Krise zu bekommen :), aber wenn Sie nichts anzeigen möchten, Erstellen Sie mindestens ein leeres Bild (1×1 Pixel) das defekte Tag nicht zu erhalten.

script.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?PHP
  // Initialisiert und verarbeitet Eingabeparameter
  $destinatario_email = Trimmen(strip_tags(Addslashes($_ ANFRAGE['E-Mail'])));
  $destinatario_nome  = Trimmen(strip_tags(Addslashes($_ ANFRAGE['destinatario'])));
  $Betreff            = Trimmen(strip_tags(Addslashes($_ ANFRAGE["Thema"])));       
 
  // Stellt eine Verbindung zur Datenbank her (PASSEN SIE IHRE VERBINDUNG AN)
  $Link = mysql_connect("mysql.seuservidor.com", 'Root', '***Ihr Passwort***') oder oder Sterben('Fehler beim Herstellen einer Verbindung mit der Datenbank.'); 
  mysql_select_db('Ihre Datenbank') oder oder Sterben('Datenbank konnte nicht ausgewählt werden');
 
  // Mountt SQL und fügt in die Datenbank ein, Wenn keine E-Mail vorhanden ist, oder aktualisiert Zähler, wenn
  $SQL = 'SELECT email FROM maladireta WHERE email="'.$destinatario_email.'"';
  $Res = mysql_query($SQL);
  wenn (Mysql_num_rows($Res) > 0) {
    $SQL = 'UPDATE maladireta SET datahora_visualizado="'.Datum('Y-m-d H:(I):s').'", contador=contador+1 WHERE email="'.$destinatario_email.'"';    
  }
  anderes {
    $SQL = "EINFÜGEN IN FINANZIELLE WERTE (null, "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$Betreff.'", "'.Datum('Y-m-d H:(I):s').'", null, 0)";
  }
  mysql_query($SQL);
 
  // Erstellt und zeigt das eingebettete Bild per E-Mail an
  Header("Content-type: bild/png");
  $IMG = imagecreatefrompng("imagem.png");
  imagepng($IMG);
  imagedestroy($IMG);
?>

Hinweis: Vergessen Sie nicht, ein Bild neben das Skript zu setzen, im Fall, ich nannte es “image.png”. Dieses Bild wird im Textkörper der E-Mail des Empfängers angezeigt., und das ist, wo die Marketing-Mitarbeiter die Werbung, aber es kann ein Logo sein oder was auch immer Sie wollen. Das Skript wurde getestet und funktioniert!

Lösung 2

Eine weitere Möglichkeit
Wie von Kollege Leandro vorgeschlagen, eine diskretere Option und “Sicher” würde, Anstatt auf die URL des Bildes zu stempeln, viele Daten wie E-Mail, Betreff, etc., Erstellen Sie ein HASH zum Zeitpunkt des Sendens der E-Mail, indem Sie sie mit diesen Daten verknüpfen, und senden Sie die URL nur die HASH. Wenn der Empfänger die E-Mail öffnet und das Bild hochlädt, traffic nur die HASH, die dann von unserem Skript erfasst und mit den Daten verknüpft wird, die wir wissen möchten.

Erstellen der Hashtabelle und der Datenverknüpfung
Erstellen wir die Tabelle, die jedes Mal gefüllt wird, wenn wir eine E-Mail senden. Beachten Sie das Feld Hash, die als Link der gesendeten E-Mail und der Daten des Empfängers dienen, die in der.

maladireta.sql
1
2
3
4
5
6
7
8
9
10
CREATE TABLE 'Mailing' (
  INT NICHT 'id' NULL AUTO_INCREMENT PRIMARY SCHLÜSSEL ,
  `Hash' VARCHAR( 50 ) NICHT NULL,
  VARCHAR E-Mail( 100 ),
  'destinatario' VARCHAR( 100 ),
  VARCHAR 'Subjekt'( 200 ),
  'datahora_envio' DATETIME NICHT NULL,
  'datahora_visualizado' DATETIME,
  'Zähler' INT Standard 0
) MOTOR = Myisam

Senden der E-Mail

sendmail.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?PHP
  // *** Ihre E-Mail (E-Mail von denen, die senden)
  $remetente_nome     = 'Anonym';
  $remetente_email    = "anonimo@email.com";
 
  // *** Ihr Ziel (E-Mail an diejenigen, die) 
  $destinatario_nome  = 'Mario Bross';
  $destinatario_email = 'mariobross@email.com';
 
  // *** Andere zu verbleibende Daten und HASH (Bezeichner)
  $Hash               = MD5(RAND());
  $Betreff            = 'Skriptausführung beim Laden von Bild testen.';
  $datahora_envio     = Datum('Y-m-d H:(I):s');
 
  // Stellt eine Verbindung zur Datenbank her
  $Link = mysql_connect("mysql.seuservidor.com", 'Root', '***Ihr Passwort***') oder oder Sterben('Fehler beim Herstellen einer Verbindung mit der Datenbank.'); 
  mysql_select_db('Ihre Datenbank') oder oder Sterben('Datenbank konnte nicht ausgewählt werden');  
 
  // Mountt SQL und fügt in die Datenbank ein
  $SQL = "EINFÜGEN IN FINANZIELLE WERTE (null, "'.$Hash.'", "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$Betreff.'", "'.$datahora_envio.'", null, 0)";
  mysql_query($SQL);
 
  // *** Zu sendende Nachricht
  $Nachricht     = "
    <html lang="pt-br">
      <Kopf>
        <meta charset="iso-8859-1" />    
        <Titel>".$Betreff."</Titel>
      </Kopf>
      <Körper>
        <img src="http://seuservidor.com/script.php?hash='.$Hash."" />
      </Körper>
    </html>";
 
  // Header, der angibt, dass der Inhalt HTML-Typ ist (um das IMG-Tag lesen und das Skript ausführen zu können)
  $Header       = "MIME-Version: 1.0\n"; 
  $Header      .= "Content-type: Text/html; charset=ISO-8859-1\n"; 
  $Header      .= "From: ".(Leer($remetente_nome) ? $remetente_email : '"'.$remetente_nome."" <".$remetente_email.">")."\n";
 
  // Senden Sie die E-Mail
  $E-Mail = Leer($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome."" <".$destinatario_email.">";
  Mail($E-Mail, $Betreff, $Nachricht, $Header);
?>

Beachten Sie, dass, In diesem Fall, die URL (Src) des Bildes bleibt nur mit dem HASH.

Buchhaltungs-E-Mail angezeigt

script.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?PHP
  // Erfasst das HASH der angezeigten E-Mail
  $Hash = Trimmen(strip_tags(Addslashes($_ ANFRAGE[Hash])));
 
  // Stellt eine Verbindung zur Datenbank her
  $Link = mysql_connect("mysql.seuservidor.com", 'Root', '***Ihr Passwort***') oder oder Sterben('Fehler beim Herstellen einer Verbindung mit der Datenbank.'); 
  mysql_select_db('Ihre Datenbank') oder oder Sterben('Datenbank konnte nicht ausgewählt werden');
 
  // Mountt SQL und aktualisiert E-Mail- und Zähleransichtsdatum in der Datenbank
  $SQL = 'SELECT hash FROM maladireta WHERE hash="'.$Hash.'"';
  $Res = mysql_query($SQL);
  wenn (Mysql_num_rows($Res) > 0) {
    $SQL = 'UPDATE maladireta SET datahora_visualizado="'.Datum('Y-m-d H:(I):s').'", contador=contador+1 WHERE hash="'.$Hash.'"';
    mysql_query($SQL);
  }
 
  // Erstellt und zeigt das eingebettete Bild per E-Mail an
  Header("Content-type: bild/png");
  $IMG = imagecreatefrompng("imagem.png");
  imagepng($IMG);
  imagedestroy($IMG);
?>

Ah, Wenn Sie die E-Mails konsultieren möchten, die ab einem Datum angezeigt wurden, könnte ein Skript mit einem SQL-Typ erstellen, der, im Fall, durchsucht alle letzten E-Mail-Datensätze, die von 27 Januar 2013. Der Tipp ist…

1
2
3
4
5
6
7
8
 
  WÄHLEN SIE * 
  VON 'MAILING', WO ZÄHLER > 0 Und 
      DATUM(datahora_visualizado) >= DATUM("2013-01-27")
;
Total hits: 34924

8 Kommentare zu “PHP: Führen Sie Skript aus, um das Bild in einer E-mail eingebettet zu laden

  1. Leandro Keys sagte:

    Taylor,
    Es ist keine gute Praxis, die E-Mail des Benutzers im Bildlink zu platzieren. Fügen Sie die Daten idealerweise zum Zeitpunkt der Übermittlung in die Bank ein und platzieren Sie eine Hash- oder Tabellen-ID im Link., um zu ermitteln, wer die E-Mail geöffnet hat.

    • Hi Leandro, Vielen Dank für den Kommentar. Das ist fraglich. Denken Sie an Informationssicherheit, Sie haben Recht, aber in der Praxis wäre es die richtige Kostbarkeit, da der E-Mail-Link (Bild) die Sie für wichtig erachten, um sie zu schützen, sind nur im Posteingang des Empfängers selbst verfügbar. Es ist das gleiche wie etwas vor mir zu verbergen, das ich bereits kenne! Außerdem, Sie müssten in Ihrer Bank einen anderen Tisch mit den Tausenden von Datensätzen aus Ihrem Mailing zu halten, auch ohne zu wissen, ob die darin enthaltenen E-Mails gültig sind. Wenn Sie also “enchugar” Ihre Bank, Konnte, weil aus Gründen der referenziellen Integrität zwischen den Tabellen, müssten die Aufzeichnungen, unter Strafe, nie zu wissen, wer die E-Mail geöffnet hat. Aber da wir über Sicherheit sprechen, um zu vermeiden, dass die E-Mail von einem Life Wireshark abgefangen wird, Was getan werden könnte, ist SSL zu verwenden (https) sowohl beim Senden der E-Mail, wie im Bildlink. Aber ich mochte Ihren Vorschlag, Ich werde eine Lösung wie diese veröffentlichen, Vielen Dank!

  2. OLA ,
    Ich suche die IP der Person, die die Nachricht gelesen hat , Wenn es sich jedoch beispielsweise um ein Hotmail-Konto handelt, nimmt es eine IP-Adresse mit Domainband in den USA auf. Es hilft mir also nicht viel . Wie bekomme ich die echte IP von seiner Maschine ?

  3. Régis sagte:

    Seltsam Manchmal funktioniert es und manchmal funktioniert es nicht mit Chrome, Opera und Fire Fox in Gmail und Hotmail – Cache und Cookies löschen, schreibt aber manchmal nicht an bd, ob die E-Mail geöffnet wurde oder nicht !!

  4. Diego sagte:

    Jungs.. Ich habe ein Registrierungsskript mit Name.. E-Mail…Cpf…rg…Ich wollte, dass nach dem Benutzer registrieren alles und senden Sie an meine Datenbank …gibt etwas an seine E-Mail-Automatik zurück. Typ
    Beispiel:”Informationen erfolgreich registriert..” warten Sie auf unseren Kontakt

    Es hätte??

    • Oops, wie Sie in der Post sagten: “Damit dies funktioniert, Der Empfänger muss unbedingt konfiguriert haben, damit seine E-Mail im HTML-Format gelesen wird”. Standardmäßig wird HTML gerendert, aber auch Gmail, wenn Sie das Rendering in TEXT ändern, dann wird es nicht funktionieren, da die HTML-TAGs einfach als Text angezeigt werden, anstatt sie zu rendern.

Hinterlasse eine Antwort

Die e-Mailadresse wird nicht veröffentlicht. Pflichtfelder sind mit gekennzeichnet. *