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
FacadedeMail, 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_MAILERpara 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.phpunfromglobal. De este modo, no hay que especificar nada en la funciónenvelopey se va a utilizar el from por defecto del env. - Se tuvo que configurar el archivo
config/app.phppara 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