> Manuales > Taller de PHP

Hacemos un análisis global de las posibilidades para enviar mensajes en localhost, de modo que puedas ver los email que envías, desde PHP y otros lenguajes, en tus aplicaciones cuando desarrollas en local.

Posibilidades del envío de email con PHP desde localhost

Enviar correo electrónico es algo básico en cualquier aplicación web, por pequeña que sea. Comunicar hacia tus usuarios enviando claves, actualizaciones, comentarios... consisten en una tarea imprescindible, para la que PHP ofrece multitud de opciones. En los servidores de hosting que podamos contratar ya suele estar perfectamente configurado PHP y el servidor SMTP para que los emails salgan, pero cuando estamos desarrollando una aplicación en local no. Sin embargo, necesitamos un medio de probar el envío de email y cerciorarnos que los mensajes salen y que llegan con el formato deseado.

Este es un análisis de todas las posibilidades de configuración de nuestro servidor de desarrollo, en localhost, que te pueden facilitar la prueba de tus aplicaciones en local, enviando correo o usando servidores de email falsos. Sirve para resolver una de las dudas típicas de todo desarrollador cuando configura su entorno para el trabajo en local con PHP y trabaja con la funcionalidad de envío de email. Si lo que deseas es conocer la función de PHP para enviar email ya en código, debes leer el artículo de enviar mail desde PHP.

Configuración del servidor SMTP en php.ini

Si estamos trabajando en local, tenemos a nuestra disposición el archivo php.ini que nos sirve para configurar aspectos de PHP. Allí vamos a tener que tocar varias cosas.

Nota: Si estamos trabajando en remoto, contra un servidor web que podamos haber contratado, también contamos con el php.ini, pero generalmente no tenemos acceso a este archivo, por medidas de seguridad. Si contamos con un VPS (servidor privado virtual) o un servidor dedicado podremos perfectamente acceder y modificar nuestro php.ini, pero si es un alojamiento compartido (los servicios de hosting más comunes) generalmente no te dejan tocar esas cosas, aunque eso realmente no es un problema, porque la empresa de hosting debería entregarte el servidor perfectamente configurado en ese sentido. Así que si quieres enviar email desde PHP en un alojamiento compartido no tendrías que preocuparte por editar nada de la configuración del servidor para que tu email salga efectivamente.

En nuestro php.ini tenemos que modificar el servidor SMTP que vamos a usar para el envío del correo. Generalmente diremos que nuestro servidor de SMTP es "localhost" osea, nuestro propio ordenador local. Pero en ese caso nos vemos obligados a configurar nuestro equipo de desarrollo para que realmente desde localhost los emails puedan salir. En este artículo te explicamos más adelante varias opciones.

También podrías usar un servidor de SMTP externo, que te ofrezca un servidor remoto en Internet, entonces en vez de "localhost" pondrías la IP de ese ordenador o bien el nombre del dominio que tenga tu servidor de envío de correo. No obstante, esta opción muchas veces no es viable, porque los servidores de SMTP están muchas veces bloqueados para el uso desde host locales, como medidas de seguridad, o bien te requieren una clave que no hay modo de indicar en el php.ini. No obstante eso también tiene solución y te lo contamos también más adelante.

En el php.ini tendrás que configurar un par de líneas.

Nota: Para saber qué archivo php.ini tienes que editar puedes crear un archivo .php con una llamada a la función phpinfo() y en la página que consigues tendrás que buscar el epígrafe "Loaded Configuration File", donde encontrarás la ruta completa al archivo de configuración de PHP. Como medida de precaución siempre está bien hacerse una copia de seguridad de ese archivo antes de editarlo.

1) SMTP: Busca la configuración SMTP en tu php.ini y ponle el valor adecuado. Lo más normal será usar localhost
2) smtp_port: en esta otra directiva colocarás el puerto del servidor SMTP. Generalmente será el 25, que es la configuración predeterminada en este tipo de servidores.

En el archivo php.ini te quedará más o menos así:

SMTP = localhost
smtp_port = 25

Si estás en Windows de 32bit podrías además modificar el correo del remitente predeterminado para los mensajes. Esa configuración probablemente la encuentres comentada (aparece en ese caso comenzando la línea por un caracter punto y coma ";"). Sería solo quitarle el punto y coma para descomentar la línea y cambiar la directiva por el valor deseado.

sendmail_from = tu_correo@example.com

Conseguir que los mensajes salgan realmente desde localhost

Configurar el php.ini es bien sencillo, la parte más complicada es que los mensajes te salgan desde tu ordenador local hacia el mundo. Aquí hay una serie de posibilidades que trataré de explicar de una forma ordenada.

No hay una única opción válida y varía mucho en función de tu sistema operativo local, así como el paquete de software que estés usando. Pero básicamente comenzamos por dos opciones distintas:

1) Configurar un servicio de SMTP en tu ordenador, ya sea un SMTP real o un "Fake SMTP"
2) Usar un servidor SMTP alternativo de otro proveedor

Comenzaremos estudiando la opción 1) Si configuraste "localhost" como servidor de correo en el php.ini ahora te toca usar tu ordenador como servidor de SMTP. Tendrías que hacer algo como:

a) configurar un servidor de smtp real en tu máquina
b) configurar un "fake smtp" osea, un servidor falso

Yo en local recomiendo la opción b) que te permite mayor facilidad de configuración. Con un servidor falso puedes apreciar que tu correo se ha creado y puedes ver el contenido de lo que le llegaría al email de destino. Aunque el email nunca se llega a enviar realmente. Existe un artículo en DesarrolloWeb.com que ya nos habla de la alternativa de configurar un "Fake SMTP".

Nota: En Xampp existe en el php.ini una línea que hace referencia a un servidor falso que ya está previamente configurado. Es muy cómodo, así que resulta perfectamente recomendable si es que usas Xampp (al menos está en la versión de Windows). En este caso el email se guarda en tu disco duro, en un archivo de texto, en vez de enviarse.

Si lo quieres usar, simplemente tienes que asegurarte que está descomentada (quita el punto y coma inicial) la ínea que pone

; XAMPP: Comment out this if you want to work with mailToDisk...
sendmail_path="C:xamppmailtodiskmailtodisk.exe"

Ese servidor de SMTP falso simplemente te deja los emails en la carpeta de xampp/mailoutput. Dentro de ese directorio encontrarás un archivo de texto para cada email enviado, con nombres como "mail-20150217-1351-189000.txt" (fíjate que el nombre del archivo contiene ya la fecha y hora en la que se generó). Simplemente es abrirlo para ver el email que generaste desde PHP y comprobar si era lo que esperabas.

En el caso de la opción b), osea, quieres que se pueda enviar realmente (que insisto que no es necesario porque en local poco importa que el email salga de verdad, solo interesa saber que el código está bien hecho y así sabes que cuando subas la web a un servidor real, el correo se enviará bien). Pues bien, en este caso tienes que configurarte un SMTP real. Aquí vuelvo a las opciones de antes:

1) Configurar un servicio de SMTP en tu ordenador
2) Usar un servidor SMTP alternativo de otro proveedor
3) Usar un software como MailHog
4) Usar un servicio como "Mailtrap", que tiene una cuota gratuita para enviar hasta 500 email de test desde tus aplicaciones.

La opción 1) es un poco complicada, porque necesita instalar algún programa que te haga de servidor SMTP. Te valdría un software como mercurymail (viene con Xampp si lo deseas ver en vídeo), que es difícil de configurar. También en Windows hay productos como Post Cast Server que es mucho más sencillos de configurar. Seguro que hay decenas de alternativas.

La opción 2) es quizás más interesante, requiere el uso de la librería phpmailer, bastante famosa y habitual. Gracias a esta librería y desde el propio código PHP puedes definir que vas a usar los servidores de Gmail para el envío del correo desde tu PHP en local. No esdifícill de configurar y tampoco de usar la librería. Si te resulta atractiva esta posibilidad como referencia adicional consulta el artículo del envío de email en PHP usando SMTP de Gmail.

La opción 3) sería usar un software específico que permita atrapar el correo saliente en local. Una popular alternativa es Mailhog, que se puede ejecutar en múltiples sistemas operativos. Puedes encontrar más información sobre MailHog en este artículo.

Conclusión

Como ves, no hay una receta única y tampoco una ganadora o adecuada en todos los casos, aunque con las explicaciones ofrecidas espero que encuentres una alternativa que funcione bien para ti.

Yo recomiendo el fake mail en local. Te ahorras problemas y la configuración de programas complejos para hacer SMTP y poder enviar email desde tu ordenador local.

En definitiva da un poco igual, porque donde te tiene que funcionar el sistema de envío de email es en el servidor de producción (el servidor definitivo donde pondrás la web para el acceso de todos los usuarios reales en Internet). Como el servidor de producción suele ya estar configurado, no tienes que hacer nada. (Si no lo está, sería hablar con tu empresa de hosting o el administrador del servidor). En local solo te interesa verificar que el email ha sido correctamente generado y para eso un servidor falso es perfectamente suficiente.

La otra opción es que subas el archivo a un servidor real, un dominio en internet y verás como el correo sí que sale porque el servidor remoto suele estar bien configurado y tiene un SMTP real asociado.

Pero si necesitas realmente que tu correo salga desde tu ordenador local, para estar tranquilo, prueba a instalarte uno de los servidores SMTP sencillos que hemos comentado. O si eres más valiente, métete con la librería phpmailer que es muy buena y prueba a usar Gmail para enviar los mensajes desde tu servidor local.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual