SMTP para Laravel — correo de su aplicación que llega
Laravel lleva integrada una capa de correo completa, con colas, plantillas y avisos. Lo que no aporta es la entregabilidad: eso depende del servidor por el que envía, y la configuración por defecto de un servidor recién montado rara vez es un buen remitente.
Laravel lee sus ajustes de correo del archivo de entorno. Ahí cambia los datos SMTP y el resto de su aplicación se queda igual: no hace falta tocar los mailables, los avisos ni las colas.
Por qué falla sin relay
Una aplicación en desarrollo envía a una dirección de pruebas y todo parece correcto. Al publicarla cambia el público: direcciones reales de proveedores reales, que sí comprueban la autenticación y la reputación. Ese es el momento en que los correos de recuperación dejan de llegar, y solo a una parte de los usuarios, lo que hace difícil detectarlo.
Configurar el SMTP en Laravel
Obtener los datos
Acceda a su cuenta de 2mail y obtenga allí su servidor SMTP, su nombre de usuario y su contraseña.
Introducirlos en Laravel
Los ajustes de correo están en el archivo de entorno de su aplicación, no en el código. Pone el mailer en SMTP y rellena los cinco datos de abajo. No olvide la dirección y el nombre del remitente: son ajustes aparte, junto a los datos de conexión.
Autenticar el dominio
Asegúrese de que SPF, DKIM y DMARC de su dominio son correctos, para que los destinatarios puedan verificar que el correo viene de usted.
Probar
Envíe desde su plataforma un mensaje de prueba a una dirección de un gran proveedor y compruebe que llega a la bandeja de entrada y no a la carpeta de spam.
Los campos que pide Laravel
Cada plataforma los llama de una manera algo distinta, pero siempre son los mismos cinco. Los valores concretos dependen de su cuenta y los encuentra en su cuenta de 2mail: cópielos de ahí para asegurarse de usar los correctos.
| Campo | Qué introducir |
|---|---|
| Servidor SMTP (host) | El nombre del servidor de su cuenta de 2mail. |
| Puerto | El puerto que corresponde al cifrado elegido; su cuenta le indica cuál. |
| Cifrado | TLS. No envíe nunca sin cifrar: de lo contrario sus credenciales viajan en claro. |
| Nombre de usuario | El acceso SMTP de su cuenta de 2mail. |
| Contraseña | La contraseña correspondiente. No use nunca la contraseña del buzón de un empleado. |
Configuración SMTP para Laravel en código
Ejemplos que funcionan para el puerto 587 con STARTTLS, listos para copiar. Sustituya la dirección de remitente por una dirección de su propio dominio y compruebe el nombre del servidor y el acceso en su cuenta de 2mail. La contraseña va en una variable de entorno: nunca en el código y nunca en el control de versiones.
El archivo .env: las variables MAIL_*
Laravel lee todos los datos de conexión de .env. El puerto 587 funciona con STARTTLS: la conexión empieza sin cifrar y se eleva a TLS antes de que su acceso pase por la red. La contraseña está únicamente en el archivo .env del servidor, y ese archivo no debe estar en el control de versiones. Sustituya example.com por un dominio que haya autenticado en 2mail.
MAIL_MAILER=smtp
MAIL_HOST=relay.2mail.eu
MAIL_PORT=587
MAIL_USERNAME="<2mail-smtp-login>"
MAIL_PASSWORD="<2mail-smtp-password>"
MAIL_FROM_ADDRESS="noreply@example.com"
MAIL_FROM_NAME="${APP_NAME}"
# Only when config/mail.php still has an 'encryption' key (older projects):
MAIL_ENCRYPTION=tls
# When config/mail.php has a 'scheme' key instead: leave MAIL_SCHEME unset.
# "smtp" on port 587 upgrades to STARTTLS by itself; "tls" is not a valid scheme. config/mail.php: el mailer smtp
En un proyecto estándar no tiene que cambiar nada aquí: el archivo se limita a leer las variables de .env. Revíselo, eso sí, cuando un ajuste no tenga efecto: un host escrito directamente en este archivo prevalece siempre sobre su .env. Los proyectos recientes tienen una clave scheme y los más antiguos una clave encryption; el resto es idéntico.
// config/mail.php
'default' => env('MAIL_MAILER', 'smtp'),
'mailers' => [
'smtp' => [
'transport' => 'smtp',
'scheme' => env('MAIL_SCHEME'), // newer projects
// 'encryption' => env('MAIL_ENCRYPTION', 'tls'), // older projects use this key instead
'host' => env('MAIL_HOST', 'relay.2mail.eu'),
'port' => env('MAIL_PORT', 587),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'timeout' => null,
],
],
'from' => [
'address' => env('MAIL_FROM_ADDRESS', 'noreply@example.com'),
'name' => env('MAIL_FROM_NAME', 'Example'),
], Enviar un correo de prueba con Tinker
Refresque primero la caché de configuración; de lo contrario seguirá probando los ajustes antiguos. Mail::raw envía de forma síncrona: un error en el host, el puerto o el acceso lo ve de inmediato en el terminal, y no más tarde en el registro de la cola. Envíe a una dirección externa de un gran proveedor.
php artisan config:clear
php artisan tinker
# At the tinker prompt:
Mail::raw('Sent through the 2mail SMTP relay.', fn ($m) => $m->to('you@example.org')->subject('SMTP test')); Qué correos envía Laravel
Una vez configurado el relay, todos estos pasan por 2mail: no tiene que configurarlos uno a uno.
Errores frecuentes con Laravel
La cola tiene que estar en marcha
Si pone el correo en cola sin un procesador activo, no sale nada y no ve ningún error. Ante un problema de entrega, esta debería ser la primera comprobación, no la última.
La caché de configuración tras un cambio
Si su aplicación funciona con la configuración cacheada, los ajustes de correo modificados no tienen efecto hasta que se refresque esa caché. Un ajuste que "no funciona" a menudo es un ajuste que aún no se ha leído.
Entornos de prueba que envían de verdad
Un entorno de staging con una copia de la base de datos de producción puede enviar sin querer a clientes reales. Limite ahí los destinatarios de forma explícita, o use un acceso aparte.
Mensajes de error habituales con Laravel
Los mensajes que recibe cuando el host, el puerto, el cifrado o el acceso no son correctos: citados literalmente, para que los reconozca en su registro, con la causa y la solución al lado.
| Mensaje | Causa | Solución |
|---|---|---|
Connection could not be established with host "relay.2mail.eu:587": stream_socket_client(): Unable to connect to relay.2mail.eu:587 (Connection timed out) | Su servidor no llega al relay. Lo habitual es que el cortafuegos de su proveedor de alojamiento bloquee el tráfico saliente por el puerto 587, o que haya una errata en MAIL_HOST o MAIL_PORT. | Pruebe desde el mismo servidor con openssl s_client -starttls smtp -connect relay.2mail.eu:587. Si no hay respuesta, pida a su proveedor de alojamiento que abra el tráfico saliente por el puerto 587. |
Connection could not be established with host "ssl://relay.2mail.eu:587": stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:…:SSL routines::wrong version number | El scheme está en smtps (o, en un proyecto más antiguo, MAIL_ENCRYPTION=ssl). Laravel espera entonces TLS desde el primer byte, mientras que el puerto 587 empieza sin cifrar y solo después se eleva a TLS por STARTTLS. | Deje MAIL_SCHEME vacío o póngalo en smtp; en un proyecto más antiguo, ponga MAIL_ENCRYPTION=tls. El puerto sigue siendo el 587. |
Failed to authenticate on SMTP server with username "…" using the following authenticators: "LOGIN", "PLAIN". … Expected response code "235" but got code "535" | El relay rechaza el acceso: un usuario o una contraseña incorrectos, una contraseña con un espacio o una # que no va entre comillas en .env, o una configuración antigua en caché. | Ponga el valor entre comillas dobles, ejecute php artisan config:clear y use el acceso SMTP de su cuenta de 2mail, no la contraseña de un buzón. |
The "tls" scheme is not supported; supported schemes for mailer "smtp" are: "smtp", "smtps". | En MAIL_SCHEME pone tls. Esa variable no es la sucesora de MAIL_ENCRYPTION: solo conoce smtp y smtps. | Elimine MAIL_SCHEME o póngalo en smtp. En el puerto 587, el mailer pasa por sí solo a STARTTLS. |
Expected response code "250/251/252" but got code "554", with message "554 5.7.1 <noreply@example.com>: Sender address rejected" | El acceso es correcto, pero la dirección de remitente pertenece a un dominio que no está vinculado a su cuenta de 2mail. A menudo MAIL_FROM_ADDRESS conserva todavía el valor por defecto del archivo de ejemplo. | Ponga en MAIL_FROM_ADDRESS una dirección de un dominio que haya añadido en 2mail, y compruebe que ningún Mailable fija un from() propio en otro dominio. |
¿Otra plataforma?
SMTP es un protocolo estándar: cualquier sistema que hable SMTP —un CRM, un ERP, una aplicación propia o un servidor— puede enviar a través de 2mail con esos mismos cinco campos.