Como ejecutar un script en PHP cuando alguien abre un email

La idea es poder ejecutar automáticamente un script en PHP cuando alguien abre un email. Explicaré como hacerlo.

Esto puede resultar muy útil ya que nos permite poder hacer infinidades de cosas al momento de querer saber que pasó con el email que hemos enviado. Por ejemplo podriamos saber si fue abierto o no, cuantas veces fue leido, a que hora, desde que dirección IP, etc.

Que necesitamos?

  1. Saber algo de HTML.
  2. PHP, obiamente.
  3. Un servidor donde alojar nuestro archivo .php.
  4. Un sevidor de correo.

Si alguíen pensó en embeber un javascript os adelanto que no se puede ya que estas etiquetas no son ejecutadas por ningún cliente de correo (por lo menos no conozco ninguno que las ejecute si alguien conoce que avise) por medidas de seguridad.

Tampoco queremos que la persona tenga que hacer clic en nigún link ni nada por el estilo.

Pasos:

  1. Crear el archivo php que contenga el script a ejecutar. Ejemplo: creamos el archivo script.php con el siguiente contenido.
  2. <?php

    $asunto = "El email fue leido";
    $mensaje = "El email que enviaste a tal persona fue mostrado en su pantalla";
    mail("mi_correo@dominio.com", $asunto, $mensaje);
    ?>

    Es decir, envío un correo electrónico a mi dirección cuando la persona vio el email. Una vez que tenemos el archivo lo subimos a nuestro servidor.

  3. Posteriormente hay que crear un email con formato HTML desde un cliente de correo que permita hacerlo así y no con texto plano.
  4. Ahora viene lo fundamental para que se pueda ejecutar el script automáticamente, y básicamente consiste en poner en algún lado del email una etiquera de imágen que en lugar de referenciar una imagen, referencie un archivo .php. Generalmente los clientes de correos interpretan el HTML y muestran las imágenes referenciadas automáticamente. Con lo cual si nosotros referenciamos a un archivo PHP éste se ejecutará automáticamente sin necesidad de ninguna intervención por parte del receptor.
  5. Ejemplo:

    <HTML>
    Hola Destinatario!
    <img src="http://mi_servidor.com/script.php"/> </HTML>

  6. Ahora solo resta enviar el email y que el destinatario lo abra. Cuando esto ocurra nuestro PHP se ejecutará. Obiamente que para que ésto funcione el destinatario debe leer el email con una pc que esté concectada a internet al momento de la apertura del correo.

Como última aclaración, cuando el el detinatario vea el correo, probablemente éste vea como una imagen que no se mostró(el cuadradito con la cruz roja).

Ésto lo solucionamos poniendo en nuestro script PHP que se ejecuta (primer ejemplo) en la última línea algo como esto:

<?php
header ("Location: http://www.mi_dominio.com/mi_imagen.jpg");
?>

Espero que les sirva el pequeño truquito.

Saludos, Geroman. 😉

Publicado en Informática
47 Comentarios en “Como ejecutar un script en PHP cuando alguien abre un email
  1. NOmbre dice:

    Exelente,
    pero tengo una duda.
    ¿puedes capturar la direccion del email en donde se ejecuto este codigo?
    creo q tambien seria muy util para dar seguimiento a los email q envias.

  2. jose dice:

    Excelente, haz hecho un buen aporte. Tengo una consulta, a ver si me das alguna idea, yo he usado para algunos clientes software que estan en intenet para hacer envios masivos de emails, son programas que pagas por la cantida de emails que envias, dime como podria hacer para que al enviar esos emails, me digan QUE EMAILS fueron vistos, la verdad no creo mucho en susestadisticas y deseo comprobar, habra algo mas que modificar en tu script para que sepa que email fue abierto y que email no?… gracias

  3. Gerónimo dice:

    Hola jose! Lo que tienes que hacer para lograr eso es incluir una imagen en los emails que envies, cuyo “src” sea un archivo php en el que realizas las cosas que necesitas. Es decir, saber cuantas veces fue abierto, obtener host, ip, etc.
    Saludos.

  4. FF dice:

    Que sucede si el cliente de email filtra las imagenes y no las abre automáticamente?

  5. Gerónimo dice:

    Si las imagenes son filtradas obiamente no se ejecutaría el código PHP.
    Saludos!

  6. Anibal dice:

    Hola Gerónimo:
    De que forma puedo capturar el mail de quien lo lee y su nombre. Suponiendo que yo envio un correo a varios destinatarios y necesito saber quien de todos lo abrió. La ip la estoy capturando asi $_SERVER[‘REMOTE_ADDR’], pero el correo no se como obtenerlo.

  7. Gerónimo dice:

    Hola Anibal! Está perfecto lo que estás haciendo para capturar la ip. Y lo que puedes hacer para capturar el email de quien abre el correo es lo siguiente:
    1 – Al momento de enviar un email puedes dejar un registro en tu base de datos con los siguientes campos de correos enviados: “mail_id” y “mail_direccion”.
    2 – Cuando generas el correo, a la imagen le podes pasar como parámetro el “id” de la dirección de email: Ej:
    <img src=”http://mi_servidor.com/script.php?id=XX”/>
    3 – Al momento de procesar el script lo que haces es tomar el parámetro “id” con la variable $_GET[‘id’] y de esta manera podes haber el macheo correspondiente con la dirección de correo.
    Espero que te sea de ayuda y cualquier cosa no dudes en consultarme.
    Saludos!

  8. Anibal dice:

    Hola Gerónimo:

    Gracias por tu respuesta, pero mi problema es que si yo envío un mail a varios destinatarios a la vez (ej: copia a unas 100 personas) como puedo obtener el correo de quien abra una de las copias???

    En el caso de enviar el correo uno por uno podría utilizar el tema de un ID que mencionas.
    Existe alguna forma de hacer esto?, de capturar el correo de quien abre mi email?

    Saludos y Gracias.

  9. Gerónimo dice:

    Hola Anibal!
    La única forma de poder hacer esto es identificando unívocamente los emails enviados con las direcciones de correo. Y la forma de hacerlo es como te lo indique más arriba. Lo que puedes hacer, si en el campo de destinatario le incluyes varias direcciones, es crear una función en php que te parsee las direcciones y las identifique en una base de datos, puesto que no existe ninguna función o variable en php que permita identificar la cuenta de correo desde la que se abre un email. Si llegas a encontrar alguna no dudes en publicarla.

    Saludos!

  10. Javier dice:

    Geronimo una consulta:
    Como puedo hacer que se abra automaticamente este codigo ya que sale marcado como X, y por lo tanto no se ejecuta mi script?
    Adjunto mi codigo:

    Saludos y gracias por tu ayuda

  11. Javier dice:

    NO SE GRABO HACE UN RATO, AHORA SI ADJUNTO MI CODIGO:
    <img src=’http.//midomicion.com/miescript.php?email=XXXX’>

  12. Gerónimo dice:

    Hola Javier!
    Para poder ayudarte necesitaria mas detalles, por ejemplo, como está conformado el archivo al que apuntas en el tag de la imagen?, como lo embebes dentro del email enviado, que parámetros pasas con ?email, etc.
    Entonces quedo a la espera de mas detalles, saludos!

  13. Marcos dice:

    Javier, si pusiste el codigo tal cual lo escribes aqui, luego de “http” van dos puntos “:”, debería quedar:
    [CODE][/CODE]

    Saludos a todos.

  14. Gerardo dice:

    La verdad sabia del truco pero me faltaba el ‘header’ para que no muestre la imagen rota.
    Muy bueno el ejemplo. Gracias Geroman !

  15. James dice:

    Exelente idea!! Gracias por el ejemplo!

  16. Majocaya dice:

    Hola !! xevre por el dato, ya sabia algo de esa idea pero no lo tenia muy claro… gracias por aclararlo, lo probare!! 🙂

  17. Leo dice:

    Hola vi eso de obtener la ip del que abre el correo con: $_SERVER[‘REMOTE_ADDR’],
    Pero podrias explicarme exactamente como se usa? donde tengo que agregar eso?
    yo cree el php asi:

  18. no me funciona el script soy nuevo en esto alguien me podria ayudar.

  19. Oscar dice:

    Esta raro, el script no me funciona, pero si me llega el correo de: “El email que enviaste a tal persona fue mostrado en su pantalla” cuando estoy cargando el html para enviarlo por outlook.

    Pero una vez que lo envio y lo abro, no me llega nada.

    ¿ Que podría estar haciendo mal ?

  20. Masami dice:

    Esto… tengo una duda. ¿Hacer esto no parece un poco ilegal? Quiero decir, si se envian mailings a empresas como newsletters o parecidos, si hacemos que se ejecute un PHP desde el correo que hemos enviado, ¿no viola esto las Leyes de Protección de Datos? ¿No podria interpretar el servidor de correo -y por ende la empresa- que se está intentando “ejecutar” algo que no sabe lo que es y mosquearse un poco?

    ¿Sabes si esto está contemplado en algún sitio? Quiero decir, ¿está prohibido? ¿Se requiere que se mande en el email una nota aclaratoria de que se envian datos para estadísticas? ¿Como está el aspecto legal al respecto?

    Gracias.

  21. Geronimo Manso geronimo dice:

    Hola Masami! Es buena tu consulta. Yo creo que si es por el hecho de “ejecutar” código que uno no sabe que se está ejecutanto, ocurre lo mismo cuando uno accede a cualquier página web programada que procesa un código que nadie conoce. Asi que creo que estamos en el mismo caso y es completamente válido. Es decir, lo que estamos haciendo es mostrar/acceder a una web, que como resultado tiene una imagen.
    Por otro lado, respecto a la recopilación de información, lo que se hace es obtener datos de uso, no de información personal de cada uno. Tambien es el caso de cuando accedes a una web, en la que se almacenan los datos de acceso por parte del usuario. O es similar a cuando un sitio lee información de una cookie. Esto es utilizado frecuentemente por la gran mayoria de los sitios y no hay problemas con su implementacion.
    No conozco ninguna ley que prohiba este tipo de prácticas ni tampoco ningún caso en el que se haya penado este tipo de actos. Por lo menos en Argentina.
    Asi que creo por lo menos que en estos días no es necesario aclarar con funciona tu sitio.

    Saludos!

  22. Esteban dice:

    Lo estoy probando y tengo algunos inconvenientes:
    – Siempre llega como spam el mail
    – No logro que se vea la imagen.
    – Cuando pongo lo del header en el script para que se vea la imagen, directamente me tira error, esto no se si es algo de mi php, pero nunca pude hacer un redireccionamiento asi, siempre tuve que poner algo asi: echo “”;
    – También me paso que dependiendo a que destinatarios se lo envío, me puede mandar la respuesta de apertura de mail sin que se lo haya visto, es decir, me lo confirma apenas sale; esto puede ser porque algunos servidores de mail los leen para que el correo no tenga cosas raras, no?

    Saludos y muy buen post

  23. Carlos dice:

    A mi me funciona todo de maravillas, mando el mail y cuando lo abren y cargan la imagen, me llega el correspondiente mail con el asunto que dice “El mail fue leido”. Pero ahora me gustaria ir por mas, quiero, como explican arriba que me llegue con el ID de la persona que lo abrio, ya que si mando muchos mails siempre me llega lo mismo pero no logro identificar quien lo abrio. Eso se puede? Como hago una base de datos?

  24. Geronimo Manso geronimo dice:

    Hola Carlos! Si eso se puede hacer facilmente registrando en un base de datos los emails enviados con un ID, y en link de la imagen le pones como argumento dicho ID, entoces cuando el script porcesa el link toma el argumento y lo compara con la base de datos de envios, para saber cual de todos los correos enviados mostró la imagen.
    Espero que te sea de ayuda. Saludos.

  25. Juan Valdes dice:

    Estoy intentando hacer que funcione el ejemplo en mi sitio pero cuando envió el correo NO me toma la ruta de imagen como tal si no coloca como si fuera texto escrito, intente colocando una tabla pero sucede lo mismo no aparece la tabla con la imagen si no la sintaxis de la tabla en el correo entonces por tal motivo no se ejecuta el script que me podes aconsejar que haga en este caso…

    Muchas Gracias.

  26. Alfredo Ramirez dice:

    Deseo que me ayudes con un ejemplo de un form que se conecte a la base de datos de un servido instalado en la red, no localhost,,, con su respectivo scripts php.. Gracias

  27. Maxi dice:

    Me pasa lo mismo que a carlos, ya hago un envio masivo con el script, hay que modificar algo en el codigo?
    Asi lo tengo embevido
    Hola Destinatario!

  28. Maxi dice:

    Ma pasa esto: Esta raro, el script no me funciona, pero si me llega el correo de: “El email que enviaste a tal persona fue mostrado en su pantalla” realizo envios masivos, hay que modificar el codigo al ser masivos?
    Muchas Gracias

  29. Geronimo Manso geronimo dice:

    Hola Maxi!
    Como le comenta a Carlos, cuando realizas un envio masivo debes modificar el script para que cuando se envie cada correo, en el link de la imagen le deberias asignar un argumento como un ID de identificación para poder identificar quien de todos los destinatarios ha visto el email.
    Ejemplo:

    http://mi_servidor.com/script.php?Id=4

    Y asi con Id diferente para cada destino.

    Espero que les sea de utilidad.
    Saludos.

  30. Maxi dice:

    A ver si entendi bien, mi scripts dispara automatico el envio, y por lo que vos me decis hay que modificar en cada envio el codigo.
    Muchas Gracias

  31. Maxi dice:

    Estimado, una consulta, en vez de llamar una imagen, como seria el codigo para llamar un html.
    Desde Ya Muchas Gracias

  32. Pam dice:

    Hola probé el script y funciona bien… EXCEPTO para gmail… es el único servidor que no ejecuta el script (ni muestra la imagen) alguien sabe como solucionar eso?’

  33. Patricia dice:

    Hola, necesito que alguien me ayude.
    No se nada de PHP ni de Script… Y necesito crear un mailing donde se vea una imagen jpg.

    Alguien seria tan amable de explicarme con que programa tengo que crearlo?

    Gracias
    Patricia

  34. Miguel dice:

    Hola, la idea de como captar la lectura del email es muy buena, ya la implemente y me funciona bien todo excepto el mostrar la imagen.

    La gran diferencia es que yo lo estoy haciendo con ASP y en lugar del header(); de PHP uso: Response.AddHeader “Location”, “URL de la img” pero no me funciona, alguien me podria ayudar ? cual es la equivalencia del header en ASP ?

    Gracias…

  35. aleonerr dice:

    Eres un crack!

  36. cristian caballero dice:

    Gacias Geronimo,para pasar la ip y el nombre maquina

    al enviar

    al abrir el correo electronico el correra el script email_leido.php y sus parametros, los capturas con $_GET[‘enviado’] y listo ya la tienes.
    ***************************************************
    😉

  37. diego Ramirez dice:

    Hola men una pregunta y como haria en el codigo para saber que correo abrio, y me indique el correo no solo el nobody si no tambien el correo que lo aperturo.

    Saludos

  38. Hugo dice:

    Hola, felicidades por el codigo, es muy buena la idea (el truco) yo ando queriendo hacer una tienda donde el usuario al pagar descarga un archivo al cual puede accesar desde un link enviado a su e-mail, lo que me interesa hacer es que solo el, desde su correo pueda entrar al link y descargar, evitar que envie ese correo a sus amigos y que muchos descarguen el contenido con un solo pago, mi pregunta es:

    ¿¿Se puede hacer que reconozca de que correo viene el visitante que lo compare con la base de datos y si es el mismo pues le de el archivo y si no lo mande a error??

    esto claro sin que en el link ponga un id para que get lo tome, pues al enviar un correo a sus amigos con el link tendria ese id…. usare las ideas mostradas aca, pero igual si tienes un consejo lo agradeceria mucho, saludos !!

  39. Aej dice:

    Excelente aporte!!! Funciona a la perfección!!! Gracias Jose.

  40. crawlervzla dice:

    Excelente ayuda, aqui les dejo un complemento por si les hace falta

  41. Julius dice:

    Me puedes facilitar a mi correo o publicar los pasos con los archivos php, y el codigo para poder realizarlo, gracias de antemano, era lo que andaba buscando.

  42. Gerardo dice:

    Hola Geronimo!
    Sencillamente y muy bien explicado!
    La verdad que es algo que sirve muchisimo. Felicitaciones y muchísimas gracias por compartir tu conocimiento.
    Por otro lado, también me interesa poder obtener el ip, la dirección de email de quienes lean el mensaje, pero la verdad es q no conozco de bases de datos asiq, eso no lo puedo implementar. Y la verdad es q me hace mucha falta.

    A modo de comentario, y si podes ayudarme con esto, seria genial:
    Se me ocurrió que desde mi sitio web, exista una posibilidad de enviar un email, solamente agregando la dirección del destinatario. Algo así como “recomendar a un amigo” Pero con el detalle de que sea un mail diseñado en html con la estética que que uno le de.
    Se podrá hacer eso? algo así como un newsletter.

  43. Ariel dice:

    Genial! Perfecto!
    Gracias por tu colaboración!
    Podrías hacer otro post explicando como capturar tmb el correo electrónico?
    Porq en los comentarios queda todo muy difícil d comprender.
    Has explicado muy bien lo de saber si el Mail fue leído,
    Espero que puedas hacerlo con lo de la dirección de emal.
    Gracias campeón!

  44. way dice:

    Hola, dejo el archivo corriendo en el siguiente link

    https://dl.dropboxusercontent.com/u/80776595/mailing.rar

    esta muy bueno, solo basta que cambien los correos en el index, para que lo prueben en su host, dejo el ejemplo en mi host

    http://decodiors.com/mailing/

    espero muchas visitas xD

  45. Diego dice:

    Hola que tal, lo implemente funciona de lujo.. solo un detalle,
    cada cierto tiempo que estoy viendo el correo con la imagen el navegador se refresca una y otra vez haciendo que me sigan llegando correos, alguna solución?

    Saludos!

  46. Daniel dice:

    Diego, solo realiza una comparación, por ejemplo si mandaste el id de correo o una token, esa información la tienes guardada en tu base de datos, cuando la persona lea el correo harás un update a un campo que ya ha sido leído, entonces cuando vualva abrirlo compararás la cadena que se está enviando la buscas en tu base de datos y si el campo ‘estatus’ ya está leído entonces ya no guardas ese nuevo registro y por ende tampoco recibes el correo de que lo ha leído nuevamente. Es lo que se me ocurre, pero podría haber otra forma. Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*