PHP: Script uitvoeren bij het laden van ingesloten afbeelding in e-mail

Deze tip is handig voor iedereen die wil weten of de e-mail die u hebt verzonden is gelezen. In dit geval, we voegen een afbeelding in de hoofdtekst van het e-mailbericht dat, wanneer het wordt geopend, zal een script op externe server af te vuren.

Presentatie

Deze techniek wordt veel gebruikt in e-mailmarketing, zodat de afzender honderden of duizenden e-mails naar ontvangers van uw mailing stuurt om een publiek te bereiken, en wil de feedback weten (Terug) van de campagne, IE, of de ontvanger de advertentie in de e-mail heeft gelezen.

Hoe het werkt?
De redenering is eenvoudig, gewoon zet je in het lichaam van de e-mail (Inhoud) een HTML-afbeeldingstag, met het kenmerk SRC aanwijzen, niet direct naar een afbeelding zoals gewoonlijk wordt gedaan, maar voor een aangepast script dat wordt gehost op een externe server, waar u een aantal routine en, er ja, een afbeelding renderen (of niet). Ingewikkeld? Dat niets, zie het voorbeeld:

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

Waar is het voor?
Houd er rekening mee dat wanneer de gebruiker de e-mail opent, laadt automatisch de veronderstelde afbeelding, dat is eigenlijk een script. Dit is handig voor het maken van e-mailstatistieken die zijn bekeken, inclusief het bepalen van de WHO geopend (Ontvanger) en WANNEER (datum/tijd). Natuurlijk, dat is geen “Guessing”, we weten wie de e-mail heeft geopend, omdat we deze gegevens koppelen aan de URL van de afbeelding op het moment dat we deze verzenden.

Lastig
Om dit te laten werken, de ontvanger moet noodzakelijkerwijs hebben geconfigureerd voor hun e-mail te lezen in HTML-formaat, hoewel dit al een standaard is die door de meeste gebruikers wordt geaccepteerd. In het slechtste geval, de e-mailprovider geeft een bericht weer waarin staat dat het de afbeeldingen heeft geblokkeerd, maar vragen of de gebruiker wil weergeven, die ook meestal wordt geaccepteerd, aangezien weinig mensen kwaadwilligheid in deze praktijk zien. In het geval van Google, er verschijnt een linkvormig bericht, Als dit:

1
2
3
...
  Afbeeldingen niet weergegeven - Bekijk onderstaande afbeeldingen - Altijd suport-afbeeldingen weergeven@E-mail.Microsoft.met
...

Ik ga commentaar geven op twee manieren om dit te doen; beide werken even, de tweede is discreter voor het niet weergeven van gegevens in de URL, hoewel het meer opslagbron vereist. Kom nou!

Oplossing 1

In de praktijk
Je hebt maar twee PHP-codes nodig:
(1) een om de e-mail te verzenden in HTML-formaat met de IMG-tag ingebouwd
(2) en een ander om de informatie vast te leggen op het moment dat de e-mail wordt geopend

Stap 1 – E-mail

Verzendpost.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
  // *** Uw e-mail (e-mail van degenen die verzenden)
  $remetente_nome     = 'Anoniem';
  $remetente_email    = 'anonimo@email.com';
 
  // *** Uw doelwit (e-mail naar degenen die) 
  $destinatario_nome  = 'Mario Bross';
  $destinatario_email = 'mariobross@email.com';
 
  // *** Onderwerp en hoofd van de boodschap
  $Onderwerp      = 'Testen van scriptuitvoering bij het laden van afbeeldingen.';
  $Bericht     = '
    <html lang="pt-br">
      <hoofd>
        <meta charset="iso-8859-1" />    
        <titel>'.$Onderwerp.'</titel>
      </hoofd>
      <lichaam>
        <img src="http://seuservidor.com/script.php?e-mail='.Urlencode($destinatario_email).'&destinatario='.Urlencode($destinatario_nome).'&subject=".Urlencode($Onderwerp).'" />
      </lichaam>
    </HTML>';
 
  // Koptekst waarin staat dat de inhoud HTML-type is (om de IMG-tag te kunnen lezen en het script uit te voeren)
  $koptekst       = "MIME-Version: 1.0\N"; 
  $koptekst      .= "Content-type: tekst/html; charset=ISO-8859-1\N"; 
  $koptekst      .= "From: ".(Lege($remetente_nome) ? $remetente_email : '"'.$remetente_nome.'" <'.$remetente_email.'>')."\N";
 
  // De e-mail verzenden
  $E-mail = Lege($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.'" <'.$destinatario_email.'>';
  Mail($E-mail, $Onderwerp, $Bericht, $koptekst);
?>

Stap 2 – Informatie vastleggen

Goed, je merkte dat bij het lezen van de IMG TAG een oproep zal worden gedaan om het bestand “script.php”, Rechts? Dus nu moeten we het maken om de informatie te nemen en op te slaan, bij voorkeur in een database.

TABEL maken
Omdat we de gegevens van de ontvanger die de e-mail heeft geopend, moeten blijven bestaan, we kunnen een tabel als deze hieronder. Bekijk het veld 'datahora_visualizado', dat verwijst naar de laatste datum en tijd waarop de gebruiker de e-mail en de 'teller', dat het aantal keren dat de e-mail is bekeken, vast te leggen.

mail-in.sql
1
2
3
4
5
6
7
8
9
TABEL 'mailing' MAKEN (
  INT NIET 'id' Null Null AUTO_INCREMENT PRIMAIR Sleutel ,
  VARCHAR-e-mail( 100 ),
  'destinatario' VARCHAR( 100 ),
  VARCHAR 'onderwerp'( 200 ),
  'datahora_envio' DATUMTIJD NIET Null Null,
  'datahora_visualizado' DATETIME,
  'teller' INT Standaard 0
) MOTOR = Myisam ;

Script om informatie vast te leggen en een afbeelding weer te geven
Afwerking, laten we gegevens zoals e-mail van de ontvanger, naam van de ontvanger, onderwerp van het bericht en de datum/tijd van wie de e-mail heeft geopend, alles opslaan in de database die we hebben gemaakt, voor het geval we in de toekomst een statistiek moeten maken. Aan het einde van het script, laten we daadwerkelijk een afbeelding maken en weergeven, gewoon niet om een IMG TAG te krijgen met existentiële crisis :), maar als je niets wilt weergeven, ten minste één lege afbeelding maken (1×1 Pixel) niet om de gebroken tag te krijgen.

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
  // Initialiseert en verwerkt invoerparameters
  $destinatario_email = Trim(strip_tags(addslashes($_ VERZOEK['e-mail'])));
  $destinatario_nome  = Trim(strip_tags(addslashes($_ VERZOEK['destinatario'])));
  $Onderwerp            = Trim(strip_tags(addslashes($_ VERZOEK["onderwerp"])));       
 
  // Maakt verbinding met database (UW VERBINDING AANPASSEN)
  $koppeling = Mysql_connect('mysql.seuservidor.com', Root, '***uw wachtwoord***') of of Sterven('Geen verbinding maken met de database.'); 
  Mysql_select_db('uw database') of of Sterven('Kan database niet selecteren');
 
  // Sql en inserts in de database monteren, als e-mail nog niet bestaat, of updates teller als er sprake is van
  $SQL = 'SELECT email FROM maladireta WHERE email="'.$destinatario_email.'"';
  $Res = Mysql_query($SQL);
  Als (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.'"';    
  }
  anders {
    $SQL = "INVOEGEN IN FINANCIËLE WAARDEN (Null Null, "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$Onderwerp.'", "'.Datum("Y-m-d H:I:s').'", Null Null, 0)';
  }
  Mysql_query($SQL);
 
  // Hiermee maakt en geeft u de ingesloten afbeelding weer voor e-mail
  koptekst("Content-type: afbeelding/png");
  $Img = beeldcreatefrompng("imagem.png");
  imagepng($Img);
  afbeeldingdestroy($Img);
?>

Opmerking: Vergeet niet om een afbeelding naast het script te zetten, in het geval, Ik noemde het “foto.png”. Deze afbeelding wordt weergegeven in de hoofdtekst van de e-mail van de ontvanger, en dat is waar de marketing personeel zet de advertentie, maar het kan een logo of wat je wilt. Het script is getest en werkt!

Oplossing 2

Een andere mogelijkheid
Zoals voorgesteld door collega Leandro, een meer discrete optie en “Veilige” Het zou, in plaats van stempelen op de url van de afbeelding veel gegevens zoals e-mail, Onderwerp, enz, een HASH maken op het moment dat de e-mail wordt verzonden door deze aan die gegevens te koppelen, en stuur in de URL alleen de HASH. Wanneer de ontvanger de e-mail opent en de afbeelding uploadt, zal alleen het verkeer van de HASH die vervolgens zal worden vastgelegd door ons script en gekoppeld aan de gegevens die we willen weten.

De hashtabel en gegevenskoppeling maken
Laten we de tabel maken die wordt ingevuld elke keer dat we een e-mail verzenden. Let op het veld Hash, die zal dienen als de link van de verzonden e-mail en de gegevens van de ontvanger die in de.

mail-in.sql
1
2
3
4
5
6
7
8
9
10
TABEL 'mailing' MAKEN (
  INT NIET 'id' Null Null AUTO_INCREMENT PRIMAIR Sleutel ,
  `Hash" VARCHAR( 50 ) Niet Null Null,
  VARCHAR-e-mail( 100 ),
  'destinatario' VARCHAR( 100 ),
  VARCHAR 'onderwerp'( 200 ),
  'datahora_envio' DATUMTIJD NIET Null Null,
  'datahora_visualizado' DATETIME,
  'teller' INT Standaard 0
) MOTOR = Myisam

De e-mail verzenden

Verzendpost.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
  // *** Uw e-mail (e-mail van degenen die verzenden)
  $remetente_nome     = 'Anoniem';
  $remetente_email    = 'anonimo@email.com';
 
  // *** Uw doelwit (e-mail naar degenen die) 
  $destinatario_nome  = 'Mario Bross';
  $destinatario_email = 'mariobross@email.com';
 
  // *** Andere gegevens blijven bestaan en HASH (Id)
  $Hash               = MD5 MD5(Rand Rand());
  $Onderwerp            = 'Testen van scriptuitvoering bij het laden van afbeeldingen.';
  $datahora_envio     = Datum("Y-m-d H:I:s');
 
  // Maakt verbinding met database
  $koppeling = Mysql_connect('mysql.seuservidor.com', Root, '***uw wachtwoord***') of of Sterven('Geen verbinding maken met de database.'); 
  Mysql_select_db('uw database') of of Sterven('Kan database niet selecteren');  
 
  // Sql en inserts in de database monteren
  $SQL = "INVOEGEN IN FINANCIËLE WAARDEN (Null Null, "'.$Hash.'", "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$Onderwerp.'", "'.$datahora_envio.'", Null Null, 0)';
  Mysql_query($SQL);
 
  // *** Bericht dat moet worden verzonden
  $Bericht     = '
    <html lang="pt-br">
      <hoofd>
        <meta charset="iso-8859-1" />    
        <titel>'.$Onderwerp.'</titel>
      </hoofd>
      <lichaam>
        <img src="http://seuservidor.com/script.php?hash='.$Hash.'" />
      </lichaam>
    </HTML>';
 
  // Koptekst waarin staat dat de inhoud HTML-type is (om de IMG-tag te kunnen lezen en het script uit te voeren)
  $koptekst       = "MIME-Version: 1.0\N"; 
  $koptekst      .= "Content-type: tekst/html; charset=ISO-8859-1\N"; 
  $koptekst      .= "From: ".(Lege($remetente_nome) ? $remetente_email : '"'.$remetente_nome.'" <'.$remetente_email.'>')."\N";
 
  // De e-mail verzenden
  $E-mail = Lege($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.'" <'.$destinatario_email.'>';
  Mail($E-mail, $Onderwerp, $Bericht, $koptekst);
?>

Merk op dat, in dit geval, de URL (Src) van de afbeelding blijft alleen over met de HASH.

Boekhoude-e-mail bekeken

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
  // Legt de HASH van de bekeken e-mail vast
  $Hash = Trim(strip_tags(addslashes($_ VERZOEK[Hash])));
 
  // Maakt verbinding met database
  $koppeling = Mysql_connect('mysql.seuservidor.com', Root, '***uw wachtwoord***') of of Sterven('Geen verbinding maken met de database.'); 
  Mysql_select_db('uw database') of of Sterven('Kan database niet selecteren');
 
  // Sql mounts en werkt e-mail- en tellerweergavedatum bij in de database
  $SQL = 'SELECT hash FROM maladireta WHERE hash="'.$Hash.'"';
  $Res = Mysql_query($SQL);
  Als (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);
  }
 
  // Hiermee maakt en geeft u de ingesloten afbeelding weer voor e-mail
  koptekst("Content-type: afbeelding/png");
  $Img = beeldcreatefrompng("imagem.png");
  imagepng($Img);
  afbeeldingdestroy($Img);
?>

Oh, als u de e-mails wilt raadplegen die vanaf een datum zijn bekeken, kan een script maken met een SQL-type dat, in het geval, zoekt alle recente e-mailrecords die worden bekeken vanuit 27 Januari 2013. De tip is…

1
2
3
4
5
6
7
8
 
  SELECTEER * 
  VAN 'mailing' WAAR teller > 0 En 
      Datum(datahora_visualizado) >= Datum("2013-01-27")
;
Totaal aantal treffers: 34927

8 Reacties op “PHP: Script uitvoeren bij het laden van ingesloten afbeelding in e-mail

  1. Leandro Toetsen zei:

    Taylor,
    Het is geen goede gewoonte om de e-mail van de gebruiker in de afbeeldingslink te plaatsen. In het ideale instantie de gegevens in de bank op het moment van indiening en plaats een hash of tabel-id in de link, om te bepalen wie de e-mail heeft geopend.

    • Hallo Leandro, bedankt voor de reactie. Dit is discutabel. Denken over informatiebeveiliging je gelijk hebt, maar in de praktijk zou het juist zijn preciousness, omdat de e-mailkoppeling (Afbeelding) dat u belangrijk vindt om te beschermen, alleen beschikbaar is in de inbox van de ontvanger zelf. Het is hetzelfde als iets voor me verbergen dat ik al ken.! Bovendien, je zou hebben om in uw bank een andere tabel met de duizenden records van uw mailing, zelfs zonder te weten of de e-mails bevatten zijn er geldig. Dus als je wilde. “enchugar” uw bank, Kon, omdat omwille van de referentiële integriteit tussen de tabellen, zou nodig zijn om de administratie bij te houden, op straffe van nooit weten wie de e-mail opende. Maar omdat we het over veiligheid hebben., om te voorkomen dat de e-mail onderschept door een leven wireshark, wat gedaan zou kunnen worden is het gebruik van SSL (HTTPS) beide in het verzenden van de e-mail, zoals voor in de afbeelding link. Maar ik vond je voorstel leuk., Ik ga zo'n oplossing publiceren., Bedankt!

  2. OLA ,
    Ik ben op zoek naar het IP van de persoon die het bericht gelezen te krijgen , maar als het een hotmail-account bijvoorbeeld het pikt een IP met domein band in de VS. Dus het helpt me niet veel . Hoe krijg ik de echte IP van zijn machine ?

  3. Régis zei:

    Vreemd Soms werkt het en soms werkt het niet met Behulp van Chrome, Opera en Fire Fox in gmail en hotmail – de cache en cookies wissen, maar soms niet schrijven naar bd of de e-mail is geopend of niet !!

  4. Diego zei:

    Jongens.. Ik heb een registratiescript met naam. E-mail…Cpf…Rg…Ik wilde dat na de gebruiker alles registreren en stuur naar mijn database …geeft iets terug naar zijn e-mail automatico.. Type
    Voorbeeld:”informatie met succes geregistreerd..” wachten op ons contact

    Het zou hebben als??

    • Oeps, zoals je zei in de Post: “Om dit te laten werken, de ontvanger moet noodzakelijkerwijs hebben geconfigureerd voor hun e-mail te lezen in HTML-formaat”. Standaard wordt HTML weergegeven, maar zelfs Gmail als u de weergave wijzigt in TEKST, dan zal het niet werken, omdat het gewoon de HTML-TAC's als tekst zal weergeven in plaats van ze weer te geven.

Laat een antwoord achter

De uw e-mailadres zal niet worden gepubliceerd. Verplichte velden zijn gemarkeerd met *