Cómo enviar emails con PHP

Inicio / Cómo hacer para... / Cómo enviar emails con PHP

Es muy común la necesidad de email desde PHP, tanto si se trata de un script de CLI (como puede ser un cronjob) o de una aplicación web.

Existen varias opciones a la hora de conseguirlo:

La más simple es el uso de la función mail. Es una función de bastante bajo nivel (es decir, algo tosca), pero está disponible en casi cualquier instalación de php.

Esta opción está bien para escenarios de envíos de mail simples, pero para usos más avanzados (como enviar adjuntos, HTML o similares), es conveniente utilizar alguna otra opción algo más robusta.

Algunas alternativas interesantes son:

Cualquiera de estas alternativas resultará más adecuada que el uso de la simple función mail en contextos en los que la performance es una preocupación (Por ejemplo, cuando hay alto tráfico en el sitio) o cuando se prefiere realizar el envío a través de un servidor SMTP externo.

Si decides usar una librería (Es decir, pasar de la función mail), algo muy interesante por hacer es apoyarte en algún servicio externo (Por ejemplo MailGun).

Si bien es posible utilizar un servicio como este (O algún otro SMTP externo) a través de la función mail, es bastante tortuoso lograrlo (Ya no depende directamente de código PHP si no que requiere de meterle mano a la configuración del sendmail y otras cuestiones así…).

Lo mejor es usar una librería que tenga esta posibilidad, como por ejemplo SwiftMailer (Aquí un poco más de detalle sobre cómo lograrlo).

Otro tema importante: enviar correos con HTML (Por ejemplo para que incluyan imágenes) no es nada divertido si usas la función mail “a secas”.

Por último, ten en cuenta que la función mail no realiza ninguna clase de optimización… si usas SMTP, cada envío realizará su propia conexión… imagínate la penalización de rendimiento que tendrán tus usuarios… Para evitar este problema deberías, al menos, intentar usar una librería que maneje un pool de conexiones SMTP (Casi cualquiera que no use mail :p).

Espero haberte convencido de que la función mail es sólo para casos de emergencia :). ¿Lo logré o tienes alguna experiencia que indique algo diferente? ¡Deja un comentario!

mchojrin

Director Académico y Docente at Leeway Academy
Hola! Soy Mauro Chojrin, estudié la Lic. en Ciencias de la Computación en la Universidad de Buenos Aires.

Me desempeño como docente de programación desde el año 1997.

Pasé por diferentes instituciones (Escuela Técnica ORT, Digital House, EducacionIT, ITMaster, Escuela DaVinci entre otros).

Actualmente coordino los cursos dictados en Leeway Academy y desarrollo sistemas usando PHP y framework Symfony

6 comentarios

  • Alejandro

    Hola Utilizo phpMailer y quisiera saber si es buena libreria para enviar mensajes a correos masivos? Actualmente tengo una aplicacion que envia mensaje a mas de cien cuentas de correos.

    • Hola Alejandro:

      ¿Cómo estás? Muchas gracias por dejar tu pregunta. En general, el tema de los correos masivos es complicado… cien cuentas no suena como mucho, claro que depende de cuántos mails se envíen y en cuánto tiempo.

      Un problema que tiene PHPMailer es que usa una conexión SMTP, con lo cual utiliza muchos recursos del servidor en cada request (Se puede configurar para que no sea así, en tu caso podrías usar algo como $phpMailer->SMTPKeepAlive = true; para hacer algo un poco más eficiente).

      Mi sugerencia es usar algún servicio como MailGun, SendGrid o Amazon SES.

      Cualquiera de estos funciona mediante una simple llamada a una API (En lo que a tu aplicación respecta) y la parte “pesada” del envío la maneja el servicio.

      De esta forma se aprovechan mejor los recursos de tu servidor, ya que estás efectivamente enviando los correos en paralelo (Es decir, el visitante no tiene que esperar a que el correo haya sido enviado para recibir la página de respuesta).

      Espero haber aclarado el punto, cualquier duda me consultas.

  • Alejandro

    Hola mchojrin:

    Pero debo escribir en mi codigo esta $phpMailer->SMTPKeepAlive = true; linea de codigo literalmente?

    o debo descargar alguna de estas MailGun, SendGrid o Amazon SES.?

    • Literalmente no. $phpMailer debés reemplazarlo por la instancia de PHPMailer que estés usando… Otro tema que tendrás que tener en cuenta es hacer $phpMailer->SmtpClose(); cuando hayas terminado de hacer los envíos (Salvo que eso sea lo último que hacés en tu script).

      Ni MailGun ni SendGrid ni SES son “descargables”. Se trata de servicios de envío de emails que ofrecen algunas empresas.

      Como mucho lo que descargarías sería un SDK (Como para hacer las llamadas algo más sencillas).

      Lo que ellos te dan es un usuario y access-token para que tu aplicación pueda realizar los envíos desde su plataforma. En definitiva, ellos tienen un webservice que sirve para enviar correos electrónicos (Además de otras cositas como trackear aperturas, ver los rebotes, etc…)

Deja un comentario

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.