PHP: Scenarijus įkeliant įdėtąatį el. paštu

Šis patarimas yra naudingas tiems, kurie nori žinoti, jei išsiųstas el. laiškas buvo perskaitytas. Šiuo atveju, mes įterpiame vaizdą į el. laiško tekstą, kad, kai jis atidaromas, suaktyvins scenarijų nuotoliniame serveryje.

Pristatymas

Šis metodas yra plačiai naudojamas elektroninio pašto rinkodaros, todėl siuntėjas siunčia šimtus ar tūkstančius el. laiškų tiesioginio pašto gavėjams, kad pasiektų auditoriją, ir norite žinoti atsiliepimus (Grįžti) kampanijos, IE, ar gavėjas perskaitė el. laiške įdėtą reklamą.

Kaip tai veikia?
Argumentai yra paprasti, tiesiog jūs įtraukėte į elektroninio pašto kūną (Turinio) HTML IMAGE Žymė, su SRC atributo žymiklio, tiesiogiai ne į vaizdą, kaip paprastai daroma, bet pasirinktinio scenarijaus, nuomojamo nuotoliniame serveryje, kur galite atlikti tam tikrą rutiną ir, ten taip, atvaizduoti vaizdą (ar ne). Sudėtinga? Kad nieko, žr pavyzdys:

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

Kokia prasmė?
Atkreipkite dėmesį, kad kai vartotojas atidaro el., automatiškai įkels tariamą vaizdą, kuris iš tikrųjų yra scenarijus. Tai naudinga atliekant el. Pašto statistiką, kuri buvo peržiūrėta, įskaitant PSO nustatymą, pradėjo (Gavėjas) ir KAI (data / laikas). žinoma, tai ne “Atspėti”, mes žinome, kas atidarė laišką, nes mes susiejame šiuos duomenis su vaizdo URL jo siuntimo metu.

Nepatogu
Tam, kad tai veiktų, gavėjas būtinai turi būti sukonfigūruotas, kad jų elektroninio pašto skaityti HTML formatu, nors tai jau yra standartas, kurį priėmė dauguma vartotojų. Blogiausiu atveju, el. pašto paslaugų teikėjas rodys pranešimą, kad užblokavote vaizdus, bet klausia, ar vartotojas nori rodyti, kuris taip pat paprastai priimamas, nes nedaug žmonių mato blogis šioje praktikoje. "Google" atveju, pranešimas rodomas saito forma, va taip:

1
2
3
...
  Vaizdai nerodomi - Peržiūrėkite vaizdus žemiau - Visada rodyti suport vaizdus@El. pašto.Microsoft.su
...

I'm going to komentuoti du būdus, kaip tai padaryti; abu dirba vienodai, antrasis yra atsargesnis, nes url nerodo duomenų, nors tam reikia daugiau saugojimo išteklių. nagi!

Tirpalas 1

Praktiškai
Jums reikia tik dviejų PHP kodų:
(1) vienas siųsti HTML formatu laišką su img žyma įdėta
(2) ir kitą užfiksuoti informaciją, kai el. laiškas atidaromas

Žingsnis 1 – El. pašto

sendmail.php (El. paštas)
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
  // *** Jūsų el. paštas (el. lai¹k± i¹ siuntimo)
  $remetente_nome     = "Anonimas";
  $remetente_email    = "anonimo@email.com";
 
  // *** Jūsų tikslas (el. paštu tiems, kurie siunčia) 
  $destinatario_nome  = "Mario Bross";
  $destinatario_email = "mariobross@email.com";
 
  // *** Temos ir pranešimo tekstas
  $Tema      = "Testavimas scenarijų vykdymo įkeliant vaizdą.";
  $Pranešimą     = '
    <html lang="pt-br">
      <galva>
        <meta charset="iso-8859-1" />    
        <pavadinimas>'.$Tema.'</pavadinimas>
      </galva>
      <kūno>
        <img src="http://seuservidor.com/script.php?el. paštas = ".Urlenkodas($destinatario_email).'&destinatario = ".Urlenkodas($destinatario_nome).'&tema = ".Urlenkodas($Tema).'" />
      </kūno>
    </HTML>';
 
  // Antraštė, nurodanti, kad turinys yra HTML tipas (todėl jūs galite skaityti IMG žymę ir paleisti scenarijų)
  $antraštės       = "MIME-Version: 1.0\N"; 
  $antraštės      .= "Content-type: tekstas/html; charset =iso-8859-1\N"; 
  $antraštės      .= "From: ".(Tuščias($remetente_nome) ? $remetente_email : '"'.$remetente_nome.'" <'.$remetente_email.'>')."\N";
 
  // Siųsti el. laišką
  $El. pašto = Tuščias($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.'" <'.$destinatario_email.'>';
  Pašto($El. pašto, $Tema, $Pranešimą, $antraštės);
?>

Žingsnis 2Captar informações

Na, você notou que ao ler a TAG IMG será feita uma chamada para o arquivoscript.php”, certo? Então agora temos que criá-lo para pegar as informações e armazená-las, de preferência num banco de dados.

Criando TABELA
Já que precisamos persistir os dados do destinatário que abriu o e-mail, podemos criar uma tabela como esta abaixo. Veja o campo `datahora_visualizado`, que refere-se última data e hora em que o usuário visualizou o e-mail e o campo `contador`, que irá registrar a quantidade de vezes que o e-mail foi visto.

maladireta.sql
1
2
3
4
5
6
7
8
9
CREATE TABLE  `maladireta` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `email` VARCHAR( 100 ),
  `destinatario` VARCHAR( 100 ),
  `assunto` VARCHAR( 200 ),
  `datahora_envio` DATETIME NOT NULL,
  `datahora_visualizado` DATETIME,
  `contador` INT DEFAULT 0
) Variklio = MYISAM ;

Script para captar informações e exibir uma imagem
Finalizando, gaukime duomenis, pvz., gavėjo el. paštas, gavėjo vardas ir pavardė, pranešimo tema ir data / laikas iš tų, kurie atidarė el. laišką, saugoti viską duomenų bazėje, kurią sukūrėme, ateityje turėsime pateikti statistiką. Scenarijaus pabaigoje, let's actually create and display an image Let's tikrųjų sukurti ir rodyti vaizdą, tiesiog negauti IMG TAG egzistencialikrizė :), bet jei nenorite rodyti nieko, sukurti bent vieną tuščią vaizdą (1×1 Pikselių) negauti skaldytų žymelę.

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
  // Inicijuoja ir tvarko įvesties parametrus
  $destinatario_email = Apdaila(strip_tags(addslashes (pridėtibirašiniai brūkšniai)($_ PRAŠYMĄ["el. paštas"])));
  $destinatario_nome  = Apdaila(strip_tags(addslashes (pridėtibirašiniai brūkšniai)($_ PRAŠYMĄ["destinatario"])));
  $Tema            = Apdaila(strip_tags(addslashes (pridėtibirašiniai brūkšniai)($_ PRAŠYMĄ["tema"])));       
 
  // Prisijungia prie duomenų bazės (RYŠIO KOREGAVIMAS)
  $Nuorodą = Mysql_connect("mysql.seuservidor.com", Šaknis, "***jūsų slaptažodis***") Arba Mirti("Nepavyko prisijungti prie duomenų bazės."); 
  Mysql_select_db("jūsų duomenų bazės") Arba Mirti("Nepavyko pasirinkti duomenų bazės");
 
  // Monta a SQL e insere no banco de dados, caso email ainda não exista, ou atualiza contador se existir
  $SQL = 'SELECT email FROM maladireta WHERE email="'.$destinatario_email.'"';
  $res = mysql_query($SQL);
  Jei (mysql_num_rows($res) > 0) {
    $SQL = 'UPDATE maladireta SET datahora_visualizado="'.date('Y-m-d H:i:s').'", contador=contador+1 WHERE email="'.$destinatario_email.'"';    
  }
  kitas {
    $SQL = 'INSERT INTO maladireta VALUES (null, "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$Tema.'", "'.date('Y-m-d H:i:s').'", null, 0)';
  }
  mysql_query($SQL);
 
  // Cria e exibe a imagem embutida ao email
  antraštės("Content-type: image/png");
  $img = imagecreatefrompng("imagem.png");
  imagepng($img);
  imagedestroy($img);
?>

Pastaba: Não esqueça de colocar junto ao script uma imagem, atveju, 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!

Tirpalas 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, Tema, ir t.t., 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.

maladireta.sql
1
2
3
4
5
6
7
8
9
10
CREATE TABLE  `maladireta` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `hash` VARCHAR( 50 ) NOT NULL,
  `email` VARCHAR( 100 ),
  `destinatario` VARCHAR( 100 ),
  `assunto` VARCHAR( 200 ),
  `datahora_envio` DATETIME NOT NULL,
  `datahora_visualizado` DATETIME,
  `contador` INT DEFAULT 0
) Variklio = MYISAM

Enviando o e-mail

sendmail.php (El. paštas)
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
  // *** Jūsų el. paštas (el. lai¹k± i¹ siuntimo)
  $remetente_nome     = "Anonimas";
  $remetente_email    = "anonimo@email.com";
 
  // *** Jūsų tikslas (el. paštu tiems, kurie siunčia) 
  $destinatario_nome  = "Mario Bross";
  $destinatario_email = "mariobross@email.com";
 
  // *** Outros dados a persistir e HASH (identificador)
  $hash               = md5(rand());
  $Tema            = "Testavimas scenarijų vykdymo įkeliant vaizdą.";
  $datahora_envio     = date('Y-m-d H:i:s');
 
  // Prisijungia prie duomenų bazės
  $Nuorodą = Mysql_connect("mysql.seuservidor.com", Šaknis, "***jūsų slaptažodis***") Arba Mirti("Nepavyko prisijungti prie duomenų bazės."); 
  Mysql_select_db("jūsų duomenų bazės") Arba Mirti("Nepavyko pasirinkti duomenų bazės");  
 
  // Monta a SQL e insere no banco de dados
  $SQL = 'INSERT INTO maladireta VALUES (null, "'.$hash.'", "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$Tema.'", "'.$datahora_envio.'", null, 0)';
  mysql_query($SQL);
 
  // *** Mensagem a ser enviada
  $Pranešimą     = '
    <html lang="pt-br">
      <galva>
        <meta charset="iso-8859-1" />    
        <pavadinimas>'.$Tema.'</pavadinimas>
      </galva>
      <kūno>
        <img src="http://seuservidor.com/script.php?hash='.$hash.'" />
      </kūno>
    </HTML>';
 
  // Antraštė, nurodanti, kad turinys yra HTML tipas (todėl jūs galite skaityti IMG žymę ir paleisti scenarijų)
  $antraštės       = "MIME-Version: 1.0\N"; 
  $antraštės      .= "Content-type: tekstas/html; charset =iso-8859-1\N"; 
  $antraštės      .= "From: ".(Tuščias($remetente_nome) ? $remetente_email : '"'.$remetente_nome.'" <'.$remetente_email.'>')."\N";
 
  // Siųsti el. laišką
  $El. pašto = Tuščias($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.'" <'.$destinatario_email.'>';
  Pašto($El. pašto, $Tema, $Pranešimą, $antraštės);
?>

Atkreipkite dėmesį, kad, Šiuo atveju, URL (Src) vaizdas yra tik su maiša.

Peržiūrėtas el. laiško skaičiavimas

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
  // Fiksuoja el. laiško maišos maišą
  $hash = Apdaila(strip_tags(addslashes (pridėtibirašiniai brūkšniai)($_ PRAŠYMĄ[Maišos])));
 
  // Prisijungia prie duomenų bazės
  $Nuorodą = Mysql_connect("mysql.seuservidor.com", Šaknis, "***jūsų slaptažodis***") Arba Mirti("Nepavyko prisijungti prie duomenų bazės."); 
  Mysql_select_db("jūsų duomenų bazės") Arba Mirti("Nepavyko pasirinkti duomenų bazės");
 
  // Stovai SQL ir atnaujina el. pašto ir skaitiklio peržiūros data duomenų bazėje
  $SQL = 'SELECT hash FROM maladireta WHERE hash="'.$hash.'"';
  $res = mysql_query($SQL);
  Jei (mysql_num_rows($res) > 0) {
    $SQL = 'UPDATE maladireta SET datahora_visualizado="'.date('Y-m-d H:i:s').'", contador=contador+1 WHERE hash="'.$hash.'"';
    mysql_query($SQL);
  }
 
  // Cria e exibe a imagem embutida ao email
  antraštės("Content-type: image/png");
  $img = imagecreatefrompng("imagem.png");
  imagepng($img);
  imagedestroy($img);
?>

Oi, se você quiser consultar os e-mails que foram visualizados a partir de uma data, poderia fazer um script com uma SQL tipo essa que, atveju, busca todos os registros recentes de e-mail vistos a partir de 27 Sausio 2013. Fica a dica

1
2
3
4
5
6
7
8
 
  PASIRINKITE * 
  FROM 
      `maladireta` 
  WHERE 
      contador > 0 AND 
      DATE(datahora_visualizado) >= DATE("2013-01-27")
;
Iš viso atitikimų: 34898

8 komentuoja “PHP: Scenarijus įkeliant įdėtąatį el. paštu

  1. Leandro Chaves sakė:

    Taylor,
    Não é uma boa prática colocar o email do usuário no link da imagem. O ideal é inserir os dados no banco na hora do envio e colocar um hash ou o id da tabela no link, para assim identificar quem abriu o e-mail.

    • Oi Leandro, obrigado pelo comentário. Isso é discutível. Pensando em Segurança da Informação você tem razão, mas na prática seria certo preciosismo, pois o link de e-mail (vaizdas) 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! Be to,, 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, naujas) tanto no envio do e-mail, quanto no link da imagem. Mas gostei da sua proposta, vou publicar uma solução assim, ačiū!

  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 sakė:

    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 sakė:

    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??

    • Oi, como disse no Post: “Tam, kad tai veiktų, gavėjas būtinai turi būti sukonfigūruotas, kad jų elektroninio pašto skaityti HTML formatu”. 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.

palik atsakymą

Į jūsų el. pašto adresas nebus skelbiamas. Būtini laukai yra pažymėti su *