演示文稿
該技術廣泛應用於電子郵件營銷, 以便發件人向你嘅直郵收件人發送成百上韆封電子郵件, 以達到目標受眾, 你知道的反饋 (返回) 的運動, IE, 如果收件人已閱讀或沒有在電子郵件中嵌入的宣傳.
它是如何工作的?
推理好簡單, 你只係將電子郵件的身體 (內容) html 圖像標記, src 屬性指向, 唔直接同通常完成嘅圖像, 但對於駐留在遠程服務器上的自定義腳本, 喺邊度可以執行一些例行同, 咁係吖, 渲染圖像 (或唔). 複雜? 冇, 請參見示例:
1 2 3 | <?PHP <img src="http://seuservidor.com/script.php?電子郵件 = pessoa@gmail&收件人 = 泰勒 + 李" /> ?> |
為服務?
請注意, 當用戶打開電子郵件時, 將自動收取所稱的圖像, 實際上係一個腳本. 有助於令已查看的電子郵件統計信息, 包括肯定誰打開了 (收件人) , 當 (日期/時間). 答案係肯定嘅, 呢 D 唔係 “占卜”, 我哋知道誰打開了電子郵件, 因為我哋喺貼圖既時候將數據保存在圖像嘅 url 中.
不便
為此工作, 收件人必須進行配置, 以便以 html 格式閱讀電子郵件, 雖然已經係大多數用戶所接受的標準. 在最壞的情況下, 電子郵件提供商將顯示一條消息說, 阻止圖像, 但詢問用戶是否要顯示, 都被普遍接受, 因為好少有人喺呢種做法中看到惡意. 喺穀謌嘅情況下, 消息由連結嘅形式出現, 鍾意呢個:
1 2 3 | ... 未顯示圖像 - 顯示下面嘅圖 - 始終顯示支持嘅圖像@電子郵件.microsoft.同 ... |
我就系兩種方法進行評論; 兩個工作也, 第二个系更謹慎唔顯示喺 url 中嘅數據, 雖然需要更多的存儲資源. 加油!
解決方案 1
在實踐中
你只需要兩個 php 代碼:
(1) A 以 html 格式發送電子郵件與嵌入的 img 標記
(2) 另一個係在電子郵件打開時捕獲信息
步 1 – 發送電子郵件
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 // *** 您的電子郵件 (边个發送電子郵件) $remetente_nome = 匿名 '; $remetente_email = "anonimo@email.com anonimo@email"; // *** 你既目標 (電子郵件發送畀邊個) $destinatario_nome = ' 马里奥布罗斯 '; $destinatario_email = "mariobross@email.com mariobross@email"; // *** 主題同消息正文 $主題 = "在加载映像時測試腳本執行"。; $消息 = ' <html lang="pt-br"> <頭> <meta charset="iso-8859-1" /> <title>'.$主題.'</title> </頭> <身體> <img src="http://seuservidor.com/script.php?電子郵件 = ".UrlEncode($destinatario_email).'&收件人 = ".UrlEncode($destinatario_nome).'&主題 = ".UrlEncode($主題).'" /> </身體> </HTML>'; // title, 說明內容為 html 類型 (能夠讀取 img 標籤並運行腳本) $title = "MIME-Version: 1.0\n"; $title .= "Content-type: 文本/html; 字符集 = iso-8859-1\n"; $title .= "From: ".(空($remetente_nome) ? $remetente_email : '"'.$remetente_nome.'" <'.$remetente_email.'>')."\n"; // 發送電子郵件 $電子郵件 = 空($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.'" <'.$destinatario_email.'>'; 郵件($電子郵件, $主題, $消息, $title); ?> |
步 2 – 捕獲信息
好好, 你有冇留意, 當閱讀 img 標籤將成為一個調用的文件 “腳本. php”, 權利? 所以而家我哋必須創建它來獲取信息并儲埋佢, 最好係在數據庫中.
創建表
因為我哋需要保存打開電子郵件的收件人的數據, 我哋可以喺下面創建一個咁樣嘅表. 查看字段 ' datahora_visualizado ', 係指用戶查看電子郵件和域的最後日期和時間 計數器 ', 將登記嘅次數, 電子郵件被視為.
1 2 3 4 5 6 7 8 9 | 創建表 "maladireta" ( "id" INT 唔 空 auto_increment 小學 關鍵 , "電子郵件" varchar( 100 ), "收件人" VARCHAR( 100 ), "主題" varchar( 200 ), "datahora_envio" 日期時間唔 空, "datahora_visualizado" 日期時間, "計數器" int 默認 0 ) 引擎 = myisam ; |
用於捕獲信息和顯示圖像的腳本
整理, 等我哋獲取數據 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, 至少創建一個空白圖像 (1×1 像素) 唔得到破碎的標籤.
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 // 初始化和處理輸入參數 $destinatario_email = 修剪(strip_tags(添加睫毛($_REQUEST["電子郵件"]))); $destinatario_nome = 修剪(strip_tags(添加睫毛($_REQUEST["Destinatario"]))); $主題 = 修剪(strip_tags(添加睫毛($_REQUEST["主題"]))); // 連接到數據庫 (調整連接) $連結 = Mysql_connect("mysql.seuservidor.com", 根, "您的密碼 *) 或 死(' ' 無法連接到數據庫。); Mysql_select_db("你個數據庫") 或 死("無法選擇數據庫"); // 裝載 sql 並將其插入數據庫, 案例電子郵件尚不存在, 或計數器更新, 如有 $SQL = 'SELECT email FROM maladireta WHERE email="'.$destinatario_email.'"'; $雷斯 = Mysql_query($SQL); 如果 (Mysql_num_rows($雷斯) > 0) { $SQL = 'UPDATE maladireta SET datahora_visualizado="'.日期('Y-m-d H:Ⅰ:s').'", contador=contador+1 WHERE email="'.$destinatario_email.'"'; } 其他 { $SQL = ' 插入到郵件抵 (空, "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$主題.'", "'.日期('Y-m-d H:Ⅰ:s').'", 空, 0)'; } Mysql_query($SQL); // 創建內聯圖像並將其顯示同電子郵件 title("Content-type: 圖像/png"); $Img = 圖像創建由 png("imagem.png"); 圖像($Img); 圖像銷毀($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” seria, ao invés de estampar na URL da imagem um monte de dados como email, 主題, 等, 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 | 創建表 "maladireta" ( "id" INT 唔 空 auto_increment 小學 關鍵 , `hash` VARCHAR( 50 ) NOT 空, "電子郵件" varchar( 100 ), "收件人" VARCHAR( 100 ), "主題" varchar( 200 ), "datahora_envio" 日期時間唔 空, "datahora_visualizado" 日期時間, "計數器" int 默認 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 | <?PHP // *** 您的電子郵件 (边个發送電子郵件) $remetente_nome = 匿名 '; $remetente_email = "anonimo@email.com anonimo@email"; // *** 你既目標 (電子郵件發送畀邊個) $destinatario_nome = ' 马里奥布罗斯 '; $destinatario_email = "mariobross@email.com mariobross@email"; // *** Outros dados a persistir e HASH (identificador) $hash = md5(rand()); $主題 = "在加载映像時測試腳本執行"。; $datahora_envio = 日期('Y-m-d H:Ⅰ:s'); // 連接到數據庫 $連結 = Mysql_connect("mysql.seuservidor.com", 根, "您的密碼 *) 或 死(' ' 無法連接到數據庫。); Mysql_select_db("你個數據庫") 或 死("無法選擇數據庫"); // 裝載 sql 並將其插入數據庫 $SQL = ' 插入到郵件抵 (空, "'.$hash.'", "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$主題.'", "'.$datahora_envio.'", 空, 0)'; Mysql_query($SQL); // *** Mensagem a ser enviada $消息 = ' <html lang="pt-br"> <頭> <meta charset="iso-8859-1" /> <title>'.$主題.'</title> </頭> <身體> <img src="http://seuservidor.com/script.php?hash='.$hash.'" /> </身體> </HTML>'; // title, 說明內容為 html 類型 (能夠讀取 img 標籤並運行腳本) $title = "MIME-Version: 1.0\n"; $title .= "Content-type: 文本/html; 字符集 = iso-8859-1\n"; $title .= "From: ".(空($remetente_nome) ? $remetente_email : '"'.$remetente_nome.'" <'.$remetente_email.'>')."\n"; // 發送電子郵件 $電子郵件 = 空($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.'" <'.$destinatario_email.'>'; 郵件($電子郵件, $主題, $消息, $title); ?> |
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 | <?PHP // Captura o HASH do e-mail visualizado $hash = 修剪(strip_tags(添加睫毛($_REQUEST['hash']))); // 連接到數據庫 $連結 = Mysql_connect("mysql.seuservidor.com", 根, "您的密碼 *) 或 死(' ' 無法連接到數據庫。); Mysql_select_db("你個數據庫") 或 死("無法選擇數據庫"); // 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.'"'; $雷斯 = Mysql_query($SQL); 如果 (Mysql_num_rows($雷斯) > 0) { $SQL = 'UPDATE maladireta SET datahora_visualizado="'.日期('Y-m-d H:Ⅰ:s').'", contador=contador+1 WHERE hash="'.$hash.'"'; Mysql_query($SQL); } // 創建內聯圖像並將其顯示同電子郵件 title("Content-type: 圖像/png"); $Img = 圖像創建由 png("imagem.png"); 圖像($Img); 圖像銷毀($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 1月 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, 多謝你!
法律事務廳 ,
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: “為此工作, 收件人必須進行配置, 以便以 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.
Obrigado pela ajuda.