Cómo enviar emails desde PHP

Es muy común la necesidad de enviar emails 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 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 resultará más adecuada que el uso de la simple función mail en contextos en los que la performance sea 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 (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).

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

Por mchojrin

Ayudo a desarrolladores PHP a afinar sus habilidades técnicas y avanzar en sus carreras

10 comentarios

  1. Hola buenas, necesito enviar correos con php, estaba ocupando phpmailer pero me pide dejar sin firewall el servidor, mi pregunta es que libreria hay para poder enviar correos desde php(este php se ejecutara solo con cpanel), de antemano muchas gracias.

    1. Hola Benja:

      Lo mejor siempre es realizar el envío de los correos desde algún servidor dedicado especialmente a esos efectos. Personalmente tuve buenas experiencias usando MailGun. También SendGrid puede servirte.

      Algo interesante de ambos es que todo el manejo de SMTP lo hacen de su lado. A tí sólo te toca hacer una llamada a una API.

      Lo que podría complicarte un poco es si tienes bloqueadas las llamadas HTTP salientes… eso deberías verlo con tu hosting (Asumo que estás en un ambienter de hosting compartido, ¿o no?).

      Saludos,

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

    1. 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…)

  3. 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.

    1. 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.

¿Te quedó alguna duda? Publica aca tu pregunta

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