Sistema de envío de correos - Alejoso/Flujo-de-compras GitHub Wiki

Flujo general

App/Controllers/Tecnico/CotizacionController.php → App/Services/SendQuoteService → App/Mail/SendQuote → Template Blade → Proveedor Mail (Resend)

Flujo específico

1. Controller

Punto de entrada. En los metodos de store y update se instancia el servicio y se recibe la información que es necesaria para instanciar un correo. El correo se envía a todos los usuarios que tengan el campo recibeNotificaciones con true.

2. SendQuoteService

Ubicado en la carpeta de services, para que pueda ser llamado desde cualquier parte de la aplicación de manera sencilla, únicamente instanciando SendQuoteService y pasando los parámetros que son los siguientes:

string $state -> Estado en el que se encuentra la cotización
string $emailSubject -> Lo que va a ir en el asunto del correo
string $description -> Descripción de la acción realizada
string $projectName -> Nombre del proyecto
string $employeeName -> Nombre del responsable de la actualización, ya sea admin o técnico (en esta parte del flujo solo tenemos técnicos)
string $version -> Versión de la cotización
string $pathToQuote -> El path del archivo pdf que contiene la cotización
  • Al recibir los parámetros, se sacan todos los usuarios en la base de datos con recibeNotificaciones en true.
  • Se instancia un objeto SendQuote (este es un mailable) con los parámetros recibidos. Es el que contiene toda la información del correo.
  • Llamando al Facade de Mail, se envía el correo, pasando como parámetros las variables anteriormente construidas.

3. SendQuote

Clase que encapsula toda la lógica del correo. Aquí se definen tres métodos claves:

  • construct -> Se crea la instancia con los parámetros enviados por el servicio.
  • envelope -> Define el asunto del correo
  • content -> Aquí se organizan las variables del constructor en un arreglo asociativo. El arreglo se envía a una vista blade que será la plantilla del correo. Esto con el fin de usar la información previamente construida en el construct
  • attachments -> Se define el archivo que va a ir adjunto en el correo.

4. Template Blade

Aquí está el template que el correo va a utilizar. Se encuentra en la carpeta views/components/mail Este templete maneja el modo oscuro y el modo claro, para que en ambas condiciones se vea bien.

Componente Responsabilidad
layout.blade.php Estructura HTML base y todo el CSS
header.blade.php Título y label superior
card.blade.php Contenedor de sección reutilizable
dataRow.blade.php Fila de label + valor con variantes de estilo
footer.blade.php Pie de página con nombre de la app
notification.blade.php Es donde se unifican todas las vistas anteriores. Es aquí donde se usa $viewData y se modifican los textos del correo

5: ¿Dónde se configuran las personas a enviar la notificación?

  • notification.index es el lugar donde se pueden agregar o eliminar las personas a las que se les envían las notificaciones
  • Cuando se quiere agregar un usuario, aparecerá un select con todos los que tengan recibeNotificaciones como false.
  • El método save y destroy del NotificationController cumplen como función de poner el campo recibeNotificaciones como true o false, respectivamente, del usuario seleccionado.

Configuración realizada

  • Se hace el siguiente comando para instalar los drives de Resend composer require resend/resend-php
  • Se añadió la API key de Resend al env RESEND_API_KEY (variable de entorno)
  • Se configuró MAIL_MAILER para que el servicio por defecto fuera Resend. (Variable de entorno)
  • Se utilizó este comando para crear clases de correos php artisan make:mail SendQuote
  • Definimos en config/mail.php un from global. De este modo, no hay que especificar nada en la función envelope y se va a utilizar el from por defecto del env.
  • Se tuvo que configurar el archivo config/app.php para ajustar la zona horaria 'timezone' => 'America/Bogota',
  • Para configurar de dónde se mandan los correos, se cambia esta variable de entorno MAIL_FROM_ADDRESS
  • Para configurar el nombre que aparece en los correos, se cambia esta variable de entorno MAIL_FROM_NAME

Documentación de Laravel

Consultar disponibilidad de Resend