Cómo configurar un servidor de correo externo en Laravel

Daniel López

Full stack developer

Oct 2020
Oct 2, 2020

Configurar nuestra aplicación en Laravel para que pueda enviar emails es tarea sencilla, sin embargo, si va a ser usada simultáneamente por varios clientes y estos tienen un servidor de correo propio, es muy probable que quieran usar el suyo en vez del que nosotros les proporcionaremos por defecto.

Para poder tener más de un servidor de correo, además del que nosotros configuremos por defecto tendremos que tener en cuenta varias cosas:

  • Almacenar los datos del servidor de correo propio en nuestra base de datos.
  • Rellenar de forma automática la configuración para enviar emails desde el servidor de correo externo.
  • Mantener la configuración por defecto por si se necesitara enviar un email con ella, siempre dándole la posibilidad de elegir al usuario.

Configuración del mail.php

En el archivo config/mail.php, podemos observar que por defecto la estructura de la configuración por smtp es la siguiente:


'smtp' => [
   'transport' => env('MAIL_TRANSPORT', 'smtp'),
   'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
   'port' => env('MAIL_PORT', 587),
   'from' => [
     'address' => env('MAIL_FROM_ADDRESS', '[email protected]'),
     'name' => env('MAIL_FROM_NAME', 'Example'),
   ],
   'encryption' => env('MAIL_ENCRYPTION', 'tls'),
   'username' => env('MAIL_USERNAME'),
   'password' => env('MAIL_PASSWORD'),
]

Lo que haremos será añadir una configuración más justo debajo de esta y con todos los valores sin asignar de momento. La llamaremos custom_smtp:


'custom_smtp' => [
'transport' => env('MAIL_TRANSPORT', 'smtp'),
'host' => '',
'port' => '',
'from' => [
   'address' => '',
   'name' => '',
],
'encryption' => '',
'username' => '',
'password' => '',
],

Creación del modelo

Crearemos un modelo para la tabla en la que el usuario guarde los datos del servidor de correo además de dos funciones que se encargarán de rellenar los datos del customer_smtp:


class EmailServer extends Model
{
protected $connection = "mysql";
protected $table = "email_server";
 
public static function setCustomerSMTP($server)
{    Config::set("mail.mailers.custom_smtp", array(      'transport' => 'smtp',      'host' => $server->host,      'port' => $server->port,      'from' => [        'address' => $server->address,        'name' => $server->name,        ],      'encryption' => $server->connection_type,      'username' => $server->username,      'password' => $server->password,    ));   }
 
public static function setSMTP()
{      Config::set("mail.mailers.custom_smtp", Config::get('mail.mailers.smtp'));   }
 
}

La función setCustomerSMTP se encargará de rellenar el customer_smtp con los datos del servidor de correo que el usuario haya introducido, mientras que la función setSMTP rellenará los datos del customer_smtp con los del smtp por defecto.

Comprobación en el middleware

En el middleware que englobe las rutas de envío de correos, realizaremos la siguiente comprobación:


$server = EmailServer::first();
 
if(isset($server) && $server->in_use == 1)
{ EmailServer::setCustomerSMTP($server); }
else
{ EmailServer::setSMTP(); }

Comprobaremos si el smtp del usuario es el que está marcado como en uso o no y usamos la función previamente creada para asignar los valores específicos a la configuración de custom_smtp.

Enviar el email

Finalmente solo tendremos que hacer uso del custom_smtp a la hora de enviar un email:


Mail::mailer(‘custom_smtp’)->to(email)->send(maileable);

Con esto ya podremos mandar emails de la forma tradicional en Laravel, pero usando un servidor de correos externo a nuestra aplicación.

También te puede interesar

Desafíos y Tendencias para los Diseñadores Gráficos en 2024

Desafíos y Tendencias para los Diseñadores Gráficos en 2024

El mundo del diseño gráfico está en constante evolución, impulsado por innovaciones tecnológicas y cambios en las preferencias de los consumidores. Este año, los diseñadores gráficos enfrentarán tanto nuevos desafíos como oportunidades. En Iberpixel, estamos en el...

En busca del flechazo web

En busca del flechazo web

En un mundo donde la primera impresión es a menudo digital, un sitio web actúa como la carta de presentación de una marca, empresa o individuo. Un sitio obsoleto o mal funcionamiento no solo puede disuadir a los visitantes sino también afectar negativamente la...

¿Qué hace falta para ser Developer? Soft & Hard Skills

¿Qué hace falta para ser Developer? Soft & Hard Skills

Para convertirse en un desarrollador exitoso, es esencial una combinación de habilidades técnicas y personales. Este campo desafiante y en constante evolución no solo requiere un entendimiento profundo de las herramientas y tecnologías, sino también la capacidad de...