PHP: Ejecutar secuencia de comandos para cargar imagen en correo electrónico

Este Consejo es útil para cualquier persona que quiere saber si el email enviado ha sido leído. En este caso, Insertar una imagen en el cuerpo del mensaje de correo electrónico, Cuando se abre, se activará una secuencia de comandos en servidor remoto.

Presentación

Esta técnica es ampliamente utilizada en e-mail marketing, para que el remitente envía cientos o miles de correos a sus destinatarios de correo directo para llegar a un público objetivo, y sabes la respuesta (volver) la campaña de, IE, Si el destinatario ha leído o no la propaganda incrustado en el correo electrónico.

Cómo funciona?
El razonamiento es simple, usted acaba de poner en el cuerpo del correo electrónico (contenido) una imagen HTML etiqueta, con el atributo SRC apuntando, no directamente a una imagen de como se hace normalmente, pero para una secuencia de comandos personalizada alojada en un servidor remoto, Dónde puede realizar alguna rutina y, entonces sí, renderizar una imagen (o no). Complicado? Que nada, ver ejemplo:

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

Para que sirve?
Tenga en cuenta que cuando el usuario abre el correo electrónico, automáticamente se cargará la imagen alegada, que es en realidad un script. Esto es útil para hacer estadísticas de correo electrónico que han sido vistas, como determinar quien abrió (destinatario) y cuando (fecha y hora). Claro, que no “adivinación”, Sabemos que abrieron el correo electrónico, ya tenemos los datos en la URL de la imagen cuando lo subes.

Inconvenientes
Para que funcione, el destinatario debe necesariamente configurarse para que leer tu correo electrónico en formato HTML, Aunque esto ya es un estándar aceptado por la mayoría de los usuarios. En el peor de los casos, el proveedor de correo electrónico mostrará un mensaje diciendo que las imágenes, pero, si el usuario desea mostrar, Qué es también comúnmente aceptado, Ya que pocas personas ven maldad en esta práctica. En el caso de Google, aparece un mensaje en la forma de un enlace, Así:

1
2
3
...
  Imágenes que no aparecen - Mostrar las imágenes a continuación - Mostrar siempre imágenes de suport@correo electrónico.Microsoft.con
...

Comentaré dos maneras de hacer esto; ambos trabajos también, el segundo es más discreto no para Mostrar datos en la URL, Aunque requiere más recursos de almacenamiento. Vamos!

Solución 1

En la práctica
Usted necesita sólo dos códigos PHP:
(1) una para enviar el correo electrónico en formato HTML con la etiqueta IMG incrustado
(2) y otro para capturar la información en el momento se abre el correo electrónico

PASO 1 – Enviar correo electrónico

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
  // *** Su correo electrónico (que envía correo electrónico)
  $remetente_nome     = 'Anonymous';
  $remetente_email    = 'anonimo@email.com';
 
  // *** Tu objetivo (correo electrónico de quien envía) 
  $destinatario_nome  = 'Mario Bross';
  $destinatario_email = 'mariobross@email.com';
 
  // *** Tema y mensaje del cuerpo
  $Asunto      = 'Prueba de la ejecución del script al cargar imagen'.;
  $Mensaje     = '
    <html lang="pt-br">
      <cabeza>
        <meta charset="iso-8859-1" />    
        <Título>'.$Asunto.'</Título>
      </cabeza>
      <cuerpo>
        <img src="http://seuservidor.com/script.php?correo electrónico = '.UrlEncode($destinatario_email).'&destinatario = '.UrlEncode($destinatario_nome).'&tema = '.UrlEncode($Asunto).'" />
      </cuerpo>
    </HTML>';
 
  // Encabezado que indica que el contenido es de tipo HTML (para poder leer la etiqueta IMG y ejecutar el script)
  $cabecera       = "MIME-Version: 1.0\n"; 
  $cabecera      .= "Content-type: texto/html; charset = iso-8859-1\n"; 
  $cabecera      .= "From: ".(vacío($remetente_nome) ? $remetente_email : '"'.$remetente_nome.'" <'.$remetente_email.'>')."\n";
 
  // Envía el correo electrónico
  $correo electrónico = vacío($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.'" <'.$destinatario_email.'>';
  correo($correo electrónico, $Asunto, $Mensaje, $cabecera);
?>

PASO 2 – Capturar la información

Bien, se dieron cuenta al leer que la etiqueta IMG se hará una llamada al archivo “script.php”, algunos? Así que ahora tenemos que crear para obtener la información y almacenarla, preferiblemente en una base de datos.

Creación de tabla
Ya que tenemos que conservar los datos del destinatario que abrió el correo electrónico, Podemos crear una tabla como esta abajo. Ver el campo 'datahora_visualizado', se refiere a la última fecha y hora que el usuario considera el correo electrónico y el campo 'contador', registrará la cantidad de veces que fue visto el correo electrónico.

maladireta.SQL
1
2
3
4
5
6
7
8
9
CREATE TABLE 'maladireta' (
  'id' INT no NULL AUTO_INCREMENT PRIMARIA CLAVE ,
  'email' VARCHAR( 100 ),
  'destinatario' VARCHAR( 100 ),
  'asunto' VARCHAR( 200 ),
  datahora_envio DATETIME no NULL,
  'datahora_visualizado' DATETIME,
  'contador' INT POR DEFECTO 0
) MOTOR = MYISAM ;

Script para capturar información y mostrar una imagen
Acabado, Vamos a entrar datos como correo electrónico del destinatario, nombre del destinatario, tema del mensaje y la fecha y hora quien abrió el correo electrónico, todo lo almacena en la base de datos que creamos, pues si en el futuro que tenemos que hacer una estadística. Al final de la secuencia de comandos, Vamos a realmente crear y mostrar una imagen, al no ser una etiqueta IMG con crisis existencial :), Pero si no quieres mostrar nada, crear al menos una imagen en blanco (1×1 pixel) no para obtener la etiqueta rota.

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
  // Inicializa y trata los parámetros de entrada
  $destinatario_email = recortar(strip_tags(addslashes($_ SOLICITUD['email'])));
  $destinatario_nome  = recortar(strip_tags(addslashes($_ SOLICITUD['destinatario'])));
  $Asunto            = recortar(strip_tags(addslashes($_ SOLICITUD['asunto'])));       
 
  // Se conecta a la base de datos (AJUSTE SU CONEXIÓN)
  $enlace = mysql_connect('mysql.seuservidor.com', 'root', ' *** *** micontraseña ') o Die('No se pudo conectar a la base de datos.'); 
  mysql_select_db('seubancodedados') o Die('No se pudo seleccionar la base de datos');
 
  // Montar el SQL e insertos para la base de datos, Si no existe correo electrónico, o actualizaciones contraria si hay
  $SQL = 'SELECT email FROM maladireta WHERE email="'.$destinatario_email.'"';
  $RES = mysql_query($SQL);
  si (mysql_num_rows($RES) > 0) {
    $SQL = 'UPDATE maladireta SET datahora_visualizado="'.fecha(' Y-m-d H:(I):s ').'", contador=contador+1 WHERE email="'.$destinatario_email.'"';    
  }
  otra cosa {
    $SQL = ' INSERT INTO maladireta valores (null, "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$Asunto.'", "'.fecha(' Y-m-d H:(I):s ').'", null, 0)';
  }
  mysql_query($SQL);
 
  // Crea y muestra la imagen integrada al correo electrónico
  cabecera("Content-type: imagen/png");
  $IMG = imagecreatefrompng("imagem.png");
  imagepng($IMG);
  imagedestroy($IMG);
?>

Nota: No te olvides de poner juntos la escritura de una imagen, en el caso, Llamé a “imagem.png”. Esta imagen aparecerá en el cuerpo del correo electrónico del destinatario, y es donde la gente de marketing publicidad, pero puede ser un logotipo o lo que usted desea. El Script ha sido probado y funciona!

Solución 2

Otra posibilidad
Como sugiere Señor Leandro, una opción más discreta y “seguro” Sería, en lugar de sellado en la dirección URL de la imagen de un montón de datos como el correo electrónico, Asunto, etcetera, crear un HASH en el momento de enviar el correo electrónico con estos datos, y enviar la URL sólo el HASH. Cuando el destinatario abre el correo electrónico y cargar la imagen, viajará solamente el HASH que luego será capturado por nuestro script y enlazado a los datos que queremos saber.

Crear el enlace de datos y la tabla de hash
Vamos a crear la tabla que se rellena cada vez que enviamos un correo electrónico. Nota el campo 'hash', que servirá como un enlace en el correo que se envía y el destinatarios datos que fueron almacenados en la.

maladireta.SQL
1
2
3
4
5
6
7
8
9
10
CREATE TABLE 'maladireta' (
  'id' INT no NULL AUTO_INCREMENT PRIMARIA CLAVE ,
  `Hash' VARCHAR( 50 ) NO NULL,
  'email' VARCHAR( 100 ),
  'destinatario' VARCHAR( 100 ),
  'asunto' VARCHAR( 200 ),
  datahora_envio DATETIME no NULL,
  'datahora_visualizado' DATETIME,
  'contador' INT POR DEFECTO 0
) MOTOR = MYISAM

El correo electrónico

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
  // *** Su correo electrónico (que envía correo electrónico)
  $remetente_nome     = 'Anonymous';
  $remetente_email    = 'anonimo@email.com';
 
  // *** Tu objetivo (correo electrónico de quien envía) 
  $destinatario_nome  = 'Mario Bross';
  $destinatario_email = 'mariobross@email.com';
 
  // *** Otros datos a persistir y hashing (mango)
  $Hash               = MD5(RAND());
  $Asunto            = 'Prueba de la ejecución del script al cargar imagen'.;
  $datahora_envio     = fecha(' Y-m-d H:(I):s ');
 
  // Se conecta a la base de datos
  $enlace = mysql_connect('mysql.seuservidor.com', 'root', ' *** *** micontraseña ') o Die('No se pudo conectar a la base de datos.'); 
  mysql_select_db('seubancodedados') o Die('No se pudo seleccionar la base de datos');  
 
  // Montar el SQL e insertos para la base de datos
  $SQL = ' INSERT INTO maladireta valores (null, "'.$Hash.'", "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$Asunto.'", "'.$datahora_envio.'", null, 0)';
  mysql_query($SQL);
 
  // *** Mensaje para ser enviado
  $Mensaje     = '
    <html lang="pt-br">
      <cabeza>
        <meta charset="iso-8859-1" />    
        <Título>'.$Asunto.'</Título>
      </cabeza>
      <cuerpo>
        <img src="http://seuservidor.com/script.php?Hash = '.$Hash.'" />
      </cuerpo>
    </HTML>';
 
  // Encabezado que indica que el contenido es de tipo HTML (para poder leer la etiqueta IMG y ejecutar el script)
  $cabecera       = "MIME-Version: 1.0\n"; 
  $cabecera      .= "Content-type: texto/html; charset = iso-8859-1\n"; 
  $cabecera      .= "From: ".(vacío($remetente_nome) ? $remetente_email : '"'.$remetente_nome.'" <'.$remetente_email.'>')."\n";
 
  // Envía el correo electrónico
  $correo electrónico = vacío($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.'" <'.$destinatario_email.'>';
  correo($correo electrónico, $Asunto, $Mensaje, $cabecera);
?>

Tenga en cuenta que, en este caso, la URL (FUENTE) la imagen es sólo con el HASH.

Cuentas de correo electrónico que aparece

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
  // Capturar el correo electrónico aparecido HASH
  $Hash = recortar(strip_tags(addslashes($_ SOLICITUD['hash'])));
 
  // Se conecta a la base de datos
  $enlace = mysql_connect('mysql.seuservidor.com', 'root', ' *** *** micontraseña ') o Die('No se pudo conectar a la base de datos.'); 
  mysql_select_db('seubancodedados') o Die('No se pudo seleccionar la base de datos');
 
  // Montar el SQL y mostrar las actualizaciones de correo electrónico de fecha y contador en la base de datos
  $SQL = 'SELECT hash FROM maladireta WHERE hash="'.$Hash.'"';
  $RES = mysql_query($SQL);
  si (mysql_num_rows($RES) > 0) {
    $SQL = 'UPDATE maladireta SET datahora_visualizado="'.fecha(' Y-m-d H:(I):s ').'", contador=contador+1 WHERE hash="'.$Hash.'"';
    mysql_query($SQL);
  }
 
  // Crea y muestra la imagen integrada al correo electrónico
  cabecera("Content-type: imagen/png");
  $IMG = imagecreatefrompng("imagem.png");
  imagepng($IMG);
  imagedestroy($IMG);
?>

Oh, Si desea revisar los correos que fueron vistos desde una fecha, podría hacer un guión con una SQL tipo, en el caso, Buscar todos los registros recientes de correo electrónico de 27 Enero 2013. La sugerencia de…

1
2
3
4
5
6
7
8
 
  SELECCIONE * 
  De 'maladireta' donde contador > 0 Y 
      FECHA(datahora_visualizado) >= FECHA("2013-01-27")
;
Total hits: 34906

8 Comentarios sobre “PHP: Ejecutar secuencia de comandos para cargar imagen en correo electrónico

  1. Leandro Chaves dijo:

    Taylor,
    No es una buena práctica poner el email del usuario en el enlace de la imagen. Lo ideal es introducir los datos en el Banco en el momento del envío y un hash o el id de la tabla en el enlace, identificar quien abrió el correo electrónico.

    • Hola Leandro, Gracias por el comentario. Es discutible. Pensando en la información que usted tiene razón, pero en la práctica sería bien preciosidad, porque el correo de enlace (imagen) que usted considera importante proteger sólo está disponible en la bandeja de entrada del receptor se. Es lo mismo que ocultar algo de mí que conozco! Por otra parte, tienes que mantener en el Banco otra tabla con miles de registros de su correo directo, incluso sin saber si son válidos los correos electrónicos de contenido se. Entonces si quisieras “enchugar” su banco, no podría, como por el bien de la integridad referencial entre tablas, estarían obligados a mantener registros, so pena de nunca saber que abrieron el correo electrónico. Pero ya que estamos hablando de seguridad, para evitar que el correo electrónico bloqueado por un Wireshark de la vida, Lo que podría hacerse es utilizar SSL (HTTPS) tanto en el correo, como en el link de la imagen. Pero me gusta tu propuesta, Voy a publicar una solución, Gracias!

  2. OLA ,
    Estoy tratando de conseguir la IP de la persona que lea el mensaje , Sin embargo si una cuenta de hotmail por ejemplo agarra una IP con el rango de dominio en los Estados Unidos. No me ayuda mucho . Cómo puedo obtener el IP real de la máquina se ?

  3. Régis dijo:

    Extraño a veces funciona y a veces no funciona con Chrome, Ópera y Fire Fox en gmail y hotmail – borrar la caché y las cookies, pero los tiempos no hace la grabación en la BD si el correo electrónico fue abierto o no !!

  4. Diego dijo:

    Chicos... Tengo un script de registro con nombre Correo electrónico…CPF…rg…querido después de usuario registrar todo y enviar a mi base de datos …Devoluciones a su correo electrónico automático... tipo
    EJEMPLO:”información registrada con éxito...” Espere nuestro contacto

    Sería??

    • Abuelo, como dije en el Post: “Para que funcione, el destinatario debe necesariamente configurarse para que leer tu correo electrónico en formato HTML”. Por defecto el código HTML que se representa, Pero incluso el cambio de Gmail el renderizado de texto, Por lo tanto no funcionará, porque simplemente mostrará las etiquetas HTML como texto en lugar de hacerlas.

Contesta

Su dirección de correo electrónico no será publicado. Campos requeridos están marcados con *