ارائه
Essa técnica é muito utilizada em e-mail marketing, de modo que o remetente envia centenas ou milhares de e-mails para destinatários de sua mala-direta visando atingir um público-alvo, e quer saber o feedback (retorno) da campanha, به عبارت دیگر, se o destinatário leu ou não a propaganda embutida no e-mail.
Como funciona?
O raciocínio é simples, basta você colocar no corpo do e-mail (conteúdo) uma Tag HTML de IMAGEM, com o atributo SRC apontando, não diretamente para uma imagem como normalmente é feito, mas para um script personalizado hospedado em um servidor remoto, onde você consegue executar alguma rotina e, aí sim, renderizar uma imagem (یا نه). Complicou? Que nada, veja o exemplo:
1 2 3 | <?پی اچ پی <SRC IMG="http://seuservidor.com/script.php?email=pessoa@gmail.com&destinatario=Taylor+Lopes" /> ?> |
Para que serve?
Note que quando o usuário abrir o e-mail, automaticamente será carregada a suposta imagem, que na verdade é um script. Isso é útil para fazer estatística de e-mail que foram visualizados, inclusive determinando QUEM abriu (destinatário) e QUANDO (data/hora). واضح, isso não é nenhuma “adivinhação”, sabemos quem abriu o e-mail, pois atrelamos esses dados na URL da imagem no momento de enviá-lo.
Inconveniente
Para isso funcionar, o destinatário necessariamente precisa ter configurado para que seu e-mail seja lido no formato HTML, embora isso já seja um padrão aceito pela maioria do usuários. Na pior das hipóteses, o provedor de e-mail vai exibir uma mensagem dizendo que bloqueou as imagens, mas perguntando se o usuário quer exibir, o que também normalmente é aceito, já que poucas pessoas veem malícia nessa prática. No caso do Google, aparece uma mensagem em forma de link, پس:
1 2 3 | ... Imagens não exibidas - Exibir imagens abaixo - Sempre exibir imagens de suport@ایمیل.microsoft.با ... |
Vou comentar duas formas de fazer isto; ambas funcionam igualmente, sendo que a segunda é mais discreta por não exibir dados na URL, embora exija mais recurso de armazenamento. دست بردار!
راه حل 1
Na prática
Você precisa de apenas dois códigos PHP:
(1) um para enviar o e-mail no formato HTML com a tag IMG embutida
(2) e outro para captar as informações no momento que o e-mail for aberto
گام 1 – Enviar e-mail
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 | <?پی اچ پی // *** Seu e-mail (e-mail de quem envia) $remetente_nome = 'Anônimo'; $remetente_email = 'anonimo@email.com'; // *** Seu alvo (e-mail para quem envia) $destinatario_nome = 'Mario Bross'; $destinatario_email = 'mariobross@email.com'; // *** Assunto e corpo da mensagem $assunto = 'Testando a execução de script ao carregar imagem.'; $mensagem = ، <html lang="pt-br"> <سر> <meta charset="iso-8859-1" /> <عنوان>،.$assunto.،</عنوان> </سر> <بدن> <img src="http://seuservidor.com/script.php?email='.urlencode($destinatario_email).،&destinatario='.urlencode($destinatario_nome).،&assunto='.urlencode($assunto).،" /> </بدن> </اچ تی ام ال>،; // Cabeçalho informando que o conteúdo é do tipo HTML (para poder ler a tag IMG e executar o script) $هدر = "MIME-Version: 1.0\N"; $هدر .= "Content-type: متن / HTML; charset=iso-8859-1\N"; $هدر .= "From: ".(empty($remetente_nome) ? $remetente_email : '"'.$remetente_nome.،" <،.$remetente_email.،>،)."\N"; // Envia o e-mail $ایمیل = empty($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.،" <،.$destinatario_email.،>،; mail($ایمیل, $assunto, $mensagem, $هدر); ?> |
گام 2 – Captar informações
خوب, você notou que ao ler a TAG IMG será feita uma chamada para o arquivo “script.php”, برخی? 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.
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 ) موتور = MYISAM ; |
Script para captar informações e exibir uma imagem
پایان, vamos pegar dados como e-mail do destinatário, nome do destinatário, assunto da mensagem e a data/hora de quem abriu o e-mail, armazenando tudo no banco de dados que criamos, para caso futuramente precisarmos fazer uma estatística. No final do script, vamos de fato criar e exibir uma imagem, só para não ficar uma TAG IMG com crise existencial :), mas se não quiser exibir nada, crie pelo menos uma imagem em branco (1×1 pixel) para não ficar com a Tag quebrada.
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 | <?پی اچ پی // Inicializa e trata os parâmetros de entrada $destinatario_email = trim(strip_tags(addslashes($_درخواست['email']))); $destinatario_nome = trim(strip_tags(addslashes($_درخواست['destinatario']))); $assunto = trim(strip_tags(addslashes($_درخواست['assunto']))); // Faz a conexão com o banco de dados (AJUSTE SUA CONEXÃO) $ارتباط دادن = mysql_connect('mysql.seuservidor.com', 'root', '***suasenha***') یا die('Falhou ao conectar ao banco de dados.'); mysql_select_db('seubancodedados') یا die('Falhou ao selecionar o banco de dados'); // 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); اگر (mysql_num_rows($res) > 0) { $SQL = 'UPDATE maladireta SET datahora_visualizado="'.date('Y-m-d H:من:s').'", contador=contador+1 WHERE email="'.$destinatario_email.'"'; } دیگر { $SQL = 'INSERT INTO maladireta VALUES (null, "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$assunto.'", "'.date('Y-m-d H:من:s').'", null, 0)،; } mysql_query($SQL); // Cria e exibe a imagem embutida ao email هدر("Content-type: image/png"); $IMG = imagecreatefrompng("imagem.png"); imagepng($IMG); imagedestroy($IMG); ?> |
اظهار: Não esqueça de colocar junto ao script uma imagem, هیچ موردی, chamei de “imagem.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!
راه حل 2
Outra possibilidade
Conforme sugerido pelo colega Leandro, uma opção mais discreta e “segura” این امر می تواند, ao invés de estampar na URL da imagem um monte de dados como email, assunto, و غیره, 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.
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 ) موتور = MYISAM |
Enviando o e-mail
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 | <?پی اچ پی // *** Seu e-mail (e-mail de quem envia) $remetente_nome = 'Anônimo'; $remetente_email = 'anonimo@email.com'; // *** Seu alvo (e-mail para quem envia) $destinatario_nome = 'Mario Bross'; $destinatario_email = 'mariobross@email.com'; // *** Outros dados a persistir e HASH (identificador) $hash = md5(rand()); $assunto = 'Testando a execução de script ao carregar imagem.'; $datahora_envio = date('Y-m-d H:من:s'); // Faz a conexão com o banco de dados $ارتباط دادن = mysql_connect('mysql.seuservidor.com', 'root', '***suasenha***') یا die('Falhou ao conectar ao banco de dados.'); mysql_select_db('seubancodedados') یا die('Falhou ao selecionar o banco de dados'); // Monta a SQL e insere no banco de dados $SQL = 'INSERT INTO maladireta VALUES (null, "'.$hash.'", "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$assunto.'", "'.$datahora_envio.'", null, 0)،; mysql_query($SQL); // *** Mensagem a ser enviada $mensagem = ، <html lang="pt-br"> <سر> <meta charset="iso-8859-1" /> <عنوان>،.$assunto.،</عنوان> </سر> <بدن> <img src="http://seuservidor.com/script.php?hash='.$hash.،" /> </بدن> </اچ تی ام ال>،; // Cabeçalho informando que o conteúdo é do tipo HTML (para poder ler a tag IMG e executar o script) $هدر = "MIME-Version: 1.0\N"; $هدر .= "Content-type: متن / HTML; charset=iso-8859-1\N"; $هدر .= "From: ".(empty($remetente_nome) ? $remetente_email : '"'.$remetente_nome.،" <،.$remetente_email.،>،)."\N"; // Envia o e-mail $ایمیل = empty($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.،" <،.$destinatario_email.،>،; mail($ایمیل, $assunto, $mensagem, $هدر); ?> |
Perceba que, در این مورد, a URL (SRC) da imagem fica apenas com o HASH.
Contabilizando e-mail visualizado
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?پی اچ پی // Captura o HASH do e-mail visualizado $hash = trim(strip_tags(addslashes($_درخواست['hash']))); // Faz a conexão com o banco de dados $ارتباط دادن = mysql_connect('mysql.seuservidor.com', 'root', '***suasenha***') یا die('Falhou ao conectar ao banco de dados.'); mysql_select_db('seubancodedados') یا die('Falhou ao selecionar o banco de dados'); // 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); اگر (mysql_num_rows($res) > 0) { $SQL = 'UPDATE maladireta SET datahora_visualizado="'.date('Y-m-d H:من:s').'", contador=contador+1 WHERE hash="'.$hash.'"'; mysql_query($SQL); } // Cria e exibe a imagem embutida ao email هدر("Content-type: image/png"); $IMG = imagecreatefrompng("imagem.png"); imagepng($IMG); imagedestroy($IMG); ?> |
اه, 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, هیچ موردی, busca todos os registros recentes de e-mail vistos a partir de 27 ژانویه 2013. Fica a dica…
1 2 3 4 5 6 7 8 | SELECT * FROM `maladireta` WHERE contador > 0 AND DATE(datahora_visualizado) >= DATE("2013-01-27") ; |
تیلور,
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 (imagem) 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! بعلاوه, 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ê quisesse “enchugar” seu 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, به دست آورده!
به 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 ?
Estranho As vezes funciona e as vezes não funciona usando o Chrome, Opera e Fire Fox no gmail e hotmail – limpo o cache e cookies, mas as vezes não faz a gravação no BD se o email foi aberto ou não !!
Galera..tenho um script de cadastro com nome..email…cpf…rg…queria que depois que usuario cadastrar tudo e enviasse pro meu banco de dados …retorna algo pro email dele automatico..tipo
EXEMPLO:”informações cadastrada com sucesso..” aguarde nosso contato
Teria como??
Você ainda vê isso Taylor??
Parece que o único servidor que abre essa imagem.php é o gmail. Você teria alguma dica para eu fazer isso funcionar??
اوپا, como disse no Post: “Para isso funcionar, o destinatário necessariamente precisa ter configurado para que seu e-mail seja lido no formato HTML”. 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.
با تشکر برای کمک.