PHP: 運行腳本由加载嵌入在電子郵件中嘅圖像

此提示對任何想知您發送的電子郵件是否已被閱讀嘅人都係有用嘅. 在這種情況下, 在電子郵件正文中插入圖像, 打開時, 就在遠程服務器上觸發腳本.

演示文稿

該技術廣泛應用於電子郵件營銷, 以便發件人向你嘅直郵收件人發送成百上韆封電子郵件, 以達到目標受眾, 你知道的反饋 (返回) 的運動, 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 – 發送電子郵件

sendmail 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
  // *** 您的電子郵件 (边个發送電子郵件)
  $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 ', 係指用戶查看電子郵件和域的最後日期和時間 計數器 ', 將登記嘅次數, 電子郵件被視為.

maladireta. sql
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 像素) 唔得到破碎的標籤.

腳本. 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
  // 初始化和處理輸入參數
  $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 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!

解決方案 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, 主題, 等, 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
創建表 "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

sendmail 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
  // *** 您的電子郵件 (边个發送電子郵件)
  $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

腳本. 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 = 修剪(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")
;
總點擊數: 34925

8 評論 “PHP: 運行腳本由加载嵌入在電子郵件中嘅圖像

  1. Leandro Chaves 說::

    泰勒,
    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ê 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, 多謝你!

  2. 法律事務廳 ,
    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 說::

    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 說::

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

    • 哎呀, 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.

留言

您的電子郵件地址就不會發佈. 與標記必填的字段 *