PHP: Skript vid uppladdning av infogad bild i e-post

Detta tips är användbart för dem som vill veta om e-postmeddelandet du skickade lästes. I detta fall, vi sätter in en bild i brödtexten i e-postmeddelandet som, när den öppnas, utlöser ett skript på fjärrservern.

Presentation

Denna teknik används ofta i e-postmarknadsföring, så avsändaren skickar hundratals eller tusentals e-postmeddelanden till mottagare av din direktreklam för att nå en publik, och vill veta feedbacken (Återvända) av kampanjen, IE, om mottagaren har läst annonsen inbäddad i e-postmeddelandet eller inte.

Så här fungerar det?
Resonemanget är enkelt, bara du sätter i kroppen av e-post (Innehåll) en HTML-bildtagg, med SRC-attributet pekande, inte direkt till en bild som vanligtvis görs, men för ett anpassat skript som finns på en fjärrserver, där du kan utföra vissa rutiner och, där ja, göra en bild (eller inte). Komplicerat? Att ingenting, se exempel:

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

Vad är poängen?
Observera att när användaren öppnar e-postmeddelandet, kommer automatiskt att ladda den förmodade bilden, som faktiskt är ett skript. Detta är användbart för att göra e-statistik som har visats, inklusive fastställandet av WHO öppnade (Mottagaren) och NÄR (datum/tid). Självklart, det är ingen “Gissa”, vi vet vem som öppnade e-postmeddelandet, eftersom vi knyter dessa data till webbadressen till bilden vid tidpunkten för att skicka den.

Obekväm
För att detta ska fungera, mottagaren nödvändigtvis måste ha konfigurerat för sin e-post som ska läsas i HTML-format, även om detta redan är en standard som accepteras av de flesta användare. I värsta fall, e-postleverantören kommer att visa ett meddelande om att du har blockerat bilderna, men frågar om användaren vill visa, som också vanligtvis accepteras, eftersom få människor ser illvilja i denna praxis. När det gäller Google, ett meddelande visas i form av en länk, Gillar det här:

1
2
3
...
  Bilder som inte visas - Se bilder nedan - Visa alltid bilder av suport@Email.Microsoft.Med
...

Jag ska kommentera två sätt att göra detta; båda fungerar lika, den andra är mer diskret eftersom den inte visar data i webbadressen, även om det kräver mer lagringsresurs. Kom igen!

Lösning 1

I praktiken
Du behöver bara två PHP-koder:
(1) en för att skicka e-post i HTML-format med img taggen inbäddad
(2) och en annan för att fånga informationen så fort e-postmeddelandet öppnas

Steg 1 – Email

sendmail.php (på andra)
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
  // *** Din e-post (e-post från den sändande)
  $remetente_nome     = "Anonym";
  $remetente_email    = "anonimo@email.com";
 
  // *** Ditt mål (e-post till dem som skickar) 
  $destinatario_nome  = "Mario Bross";
  $destinatario_email = "mariobross@email.com";
 
  // *** Ämnes- och meddelandetext
  $Ämne      = "Testa skriptkörning vid inläsning av avbildning.";
  $Meddelande     = '
    <html lang="pt-br">
      <huvud>
        <meta charset="iso-8859-1" />    
        <avdelning>'.$Ämne.'</avdelning>
      </huvud>
      <kroppen>
        <img src="http://seuservidor.com/script.php?e-post='.Urlencode (Urlencode)($destinatario_email).'&destinatario=".Urlencode (Urlencode)($destinatario_nome).'&ämne=".Urlencode (Urlencode)($Ämne).'" />
      </kroppen>
    </HTML>';
 
  // Rubrik som anger att innehållet är html-typ (så att du kan läsa IMG-taggen och köra skriptet)
  $Huvudet       = "MIME-Version: 1.0\N"; 
  $Huvudet      .= "Content-type: text/html; charset=iso-8859-1\N"; 
  $Huvudet      .= "From: ".(Tom($remetente_nome) ? $remetente_email : '"'.$remetente_nome.'" <'.$remetente_email.'>')."\N";
 
  // Skicka e-postmeddelandet
  $Email = Tom($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.'" <'.$destinatario_email.'>';
  Mail($Email, $Ämne, $Meddelande, $Huvudet);
?>

Steg 2 – Samla in information

Väl, du märkte att när du läser IMG TAG ett samtal kommer att göras till filen “script.php (påtr)script.php”, några? Så nu måste vi skapa den för att ta informationen och lagra den, helst i en databas.

Skapa TABELL
Eftersom vi måste framhärda uppgifterna om den mottagare som öppnade e-postmeddelandet, vi kan skapa en tabell som denna nedan. Se fältet "datahora_visualizado", som hänvisar till sista datum och tid när användaren tittade på e-postmeddelandet och "räknare", som registrerar hur många gånger e-postmeddelandet har visats.

mailing.sql
1
2
3
4
5
6
7
8
9
SKAPA TABELL "direktreklam" (
  INT INTE "id" Null AUTO_INCREMENT PRIMÄR Nyckel ,
  VARCHAR e-post( 100 ),
  "destinatario" VARCHAR( 100 ),
  VARCHAR "ämne"( 200 ),
  DATETIME DATAHORA_ENVIO INTE Null,
  "datahora_visualizado" DATETIME,
  INT "räknare" STANDARD, Nytt år 0
) MOTORN = Myisam ;

Skript för att samla in information och visa en bild
Efterbehandling, låt oss hämta data som mottagarens e-postadress, mottagarens namn, meddelandeämne och datum/tid från dem som öppnade e-postmeddelandet, lagra allt i databasen vi skapade, om vi i framtiden måste göra en statistik. I slutet av skriptet, låt oss faktiskt skapa och visa en bild, bara inte för att få en IMG TAG med existentiell kris :), men om du inte vill visa något, skapa minst en tom bild (1×1 Pixel) inte att få den trasiga taggen.

script.php (påtr)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
  // Initierar och hanterar indataparametrar
  $destinatario_email = Trimma(strip_tags(addlashes($_REQUEST["e-post"])));
  $destinatario_nome  = Trimma(strip_tags(addlashes($_REQUEST["destinatario"])));
  $Ämne            = Trimma(strip_tags(addlashes($_REQUEST["ämne"])));       
 
  // Ansluter till databasen (JUSTERA ANSLUTNINGEN)
  $länk = Mysql_connect("mysql.seuservidor.com", Root, '***ditt lösenord***') Eller (Det gick inte att ansluta till databasen.); 
  Mysql_select_db("dina databaser") Eller (Det gick inte att välja databas);
 
  // Monterar SQL och infogar det i databasen, ärende-e-post ännu inte finns, eller räknaruppdateringar om det finns
  $SQL = 'SELECT email FROM maladireta WHERE email="'.$destinatario_email.'"';
  $Res = Mysql_query($SQL);
  Om (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.'"';    
  }
  annat {
    $SQL = 'INFOGA I UTSKICKSVÄRDEN (Null, "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$Ämne.'", "'.Datum("Y-m-d H:I:s').'", Null, 0)';
  }
  Mysql_query($SQL);
 
  // Skapar och visar infogad bild till e-postmeddelandet
  Huvudet("Content-type: bild/png");
  $Img = bildskapafrånpng("imagem.png");
  imagepng (bildpng)($Img);
  imagedestroy($Img);
?>

Obs: Não esqueça de colocar junto ao script uma imagem, i fall, chamei deimagem.png”. Essa imagem irá aparecer no corpo do e-mail do destinatário, e é onde o pessoal de marketing coloca a propaganda, mas pode ser um logotipo ou o que você desejar. O Script foi testado e funciona!

Lösning 2

Outra possibilidade
Conforme sugerido pelo colega Leandro, uma opção mais discreta eseguraseria, ao invés de estampar na URL da imagem um monte de dados como email, Ämne, etc, criar um HASH no momento do envio do e-mail vinculando-o a esses dados, e enviar na URL somente o HASH. Quando o destinatário abrir o email e carregar a imagem, irá trafegar apenas o HASH que então será capturado pelo nosso script e vinculado aos dados que queremos saber.

Criando a tabela de hash e vínculo de dados
Vamos criar a tabela que será populada toda vez que enviarmos um e-mail. Note o campo `hash`, que servirá como vínculo do e-mail que foi enviado e os dados do destinatário que ficaram armazenados na tabela.

mailing.sql
1
2
3
4
5
6
7
8
9
10
SKAPA TABELL "direktreklam" (
  INT INTE "id" Null AUTO_INCREMENT PRIMÄR Nyckel ,
  `hash` VARCHAR( 50 ) NOT Null,
  VARCHAR e-post( 100 ),
  "destinatario" VARCHAR( 100 ),
  VARCHAR "ämne"( 200 ),
  DATETIME DATAHORA_ENVIO INTE Null,
  "datahora_visualizado" DATETIME,
  INT "räknare" STANDARD, Nytt år 0
) MOTORN = Myisam

Enviando o e-mail

sendmail.php (på andra)
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
  // *** Din e-post (e-post från den sändande)
  $remetente_nome     = "Anonym";
  $remetente_email    = "anonimo@email.com";
 
  // *** Ditt mål (e-post till dem som skickar) 
  $destinatario_nome  = "Mario Bross";
  $destinatario_email = "mariobross@email.com";
 
  // *** Outros dados a persistir e HASH (identificador)
  $hash               = md5(rand());
  $Ämne            = "Testa skriptkörning vid inläsning av avbildning.";
  $datahora_envio     = Datum("Y-m-d H:I:s');
 
  // Ansluter till databasen
  $länk = Mysql_connect("mysql.seuservidor.com", Root, '***ditt lösenord***') Eller (Det gick inte att ansluta till databasen.); 
  Mysql_select_db("dina databaser") Eller (Det gick inte att välja databas);  
 
  // Monterar SQL och infogar det i databasen
  $SQL = 'INFOGA I UTSKICKSVÄRDEN (Null, "'.$hash.'", "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$Ämne.'", "'.$datahora_envio.'", Null, 0)';
  Mysql_query($SQL);
 
  // *** Mensagem a ser enviada
  $Meddelande     = '
    <html lang="pt-br">
      <huvud>
        <meta charset="iso-8859-1" />    
        <avdelning>'.$Ämne.'</avdelning>
      </huvud>
      <kroppen>
        <img src="http://seuservidor.com/script.php?hash='.$hash.'" />
      </kroppen>
    </HTML>';
 
  // Rubrik som anger att innehållet är html-typ (så att du kan läsa IMG-taggen och köra skriptet)
  $Huvudet       = "MIME-Version: 1.0\N"; 
  $Huvudet      .= "Content-type: text/html; charset=iso-8859-1\N"; 
  $Huvudet      .= "From: ".(Tom($remetente_nome) ? $remetente_email : '"'.$remetente_nome.'" <'.$remetente_email.'>')."\N";
 
  // Skicka e-postmeddelandet
  $Email = Tom($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.'" <'.$destinatario_email.'>';
  Mail($Email, $Ämne, $Meddelande, $Huvudet);
?>

Perceba que, i detta fall, a URL (SRC) da imagem fica apenas com o HASH.

Contabilizando e-mail visualizado

script.php (påtr)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
  // Captura o HASH do e-mail visualizado
  $hash = Trimma(strip_tags(addlashes($_REQUEST['hash'])));
 
  // Ansluter till databasen
  $länk = Mysql_connect("mysql.seuservidor.com", Root, '***ditt lösenord***') Eller (Det gick inte att ansluta till databasen.); 
  Mysql_select_db("dina databaser") Eller (Det gick inte att välja databas);
 
  // Monta a SQL e atualiza data de visualização do email e contador no banco de dados
  $SQL = 'SELECT hash FROM maladireta WHERE hash="'.$hash.'"';
  $Res = Mysql_query($SQL);
  Om (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);
  }
 
  // Skapar och visar infogad bild till e-postmeddelandet
  Huvudet("Content-type: bild/png");
  $Img = bildskapafrånpng("imagem.png");
  imagepng (bildpng)($Img);
  imagedestroy($Img);
?>

Åh, om du vill konsultera de e-postmeddelanden som visades från ett datum, kan göra ett skript med en SQL-typ som, i fall, söka i alla senaste e-postposter som visas från 27 Januari 2013. Här är tipset…

1
2
3
4
5
6
7
8
 
  VÄLJ * 
  FRÅN "utskick" VAR räknare > 0 OCH, NYA 
      DATUM, NYTT(datahora_visualizado) >= DATUM, NYTT("2013-01-27")
;
Totalt antal träffar: 34932

8 kommentarer till “PHP: Skript vid uppladdning av infogad bild i e-post

  1. Leandro Chaves sade:

    Taylor,
    Det är inte bra att placera användarens e-post på bildlänken. Sätt helst in data i databasen vid tidpunkten för överföringen och placera ett hash- eller tabell-ID i länken, för att identifiera vem som öppnade e-postmeddelandet.

    • Hej Leandro, tack för kommentaren. Det är diskutabelt. Pensando em Segurança da Informação você tem razão, mas na prática seria certo preciosismo, pois o link de e-mail (bild) que você considera importante proteger estará disponível apenas na caixa de entrada do próprio destinatário. É o mesmo que esconder algo de mim que já sei! Dessutom, você teria que manter no seu banco uma outra tabela com os milhares de registros da sua mala-direta, mesmo sem saber se os e-mails ali contidos são válidos. Aí se você quisesseenchugarseu banco, não poderia, pois por uma questão de integridade referencial entre as tabelas, seria obrigado a manter os registros, sob pena de nunca saber quem abriu o e-mail. Mas já que estamos falando de segurança, para evitar ter o e-mail interceptado por um Wireshark da vida, o que poderia ser feito é usar SSL (HTTPS) tanto no envio do e-mail, quanto no link da imagem. Mas gostei da sua proposta, vou publicar uma solução assim, Tack!

  2. OLA ,
    Estou querendo pegar o IP da pessoa que leu a mensagem , entretanto se for um cliente do hotmail por exemplo ele pega um IP com faixa de dominio nos EUA. Daí não me ajuda muito . Como faço para pegar o IP real da maquina dele ?

  3. Régis sade:

    Estranho As vezes funciona e as vezes não funciona usando o Chrome, Opera e Fire Fox no gmail e hotmaillimpo o cache e cookies, mas as vezes não faz a gravação no BD se o email foi aberto ou não !!

  4. diego sade:

    Galera..tenho um script de cadastro com nome..emailcpfrgqueria que depois que usuario cadastrar tudo e enviasse pro meu banco de dadosretorna algo pro email dele automatico..tipo
    EXEMPLO:”informações cadastrada com sucesso..aguarde nosso contato

    Teria como??

    • Morfar, como disse no Post: “För att detta ska fungera, mottagaren nödvändigtvis måste ha konfigurerat för sin e-post som ska läsas i HTML-format”. Por padrão o HTML é renderizado, mas mesmo o Gmail se mudar a renderização para TEXTO, daí não vai funcionar, pois ele vai simplesmente exibir as TAGs HTML como texto ao invés de renderizá-las.

Lämna svar

I din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *