El envío de correos electrónicos en Laravel requiere la colaboración entre tres componentes: el correo de Laravel, las clases que se pueden enviar por correo de Laravel y la fachada de correo. Cada uno de los tres aborda un aspecto diferente del ciclo de vida del envío de un correo electrónico.
Los remitentes de correo son los controladores para conectar los servicios de envío de correo electrónico (como AWS SES, Sendgrid, Mailgun, etc.) que la aplicación puede utilizar para reenviar correos electrónicos a los destinatarios.
Laravel Mailable son clases especiales que representan una plantilla de correo electrónico para enviar. Contiene toda la información típica de un mensaje de correo electrónico como el contenido, el campo "para", archivos adjuntos, etc.
Finalmente, la fachada de Mail es el punto de acceso para solicitar el envío real de un correo a través de un controlador de correo.
Tuve la oportunidad de explorar este sistema en detalle y ahora, en su punto máximo, Inspector envía más de 6000 correos electrónicos por hora.
Espero que mi experiencia pueda ser útil para que comprendas mejor este componente del marco, ya que Laravel Mailable es uno de los componentes clave de cualquier aplicación moderna.
Para más artículos técnicos puedes seguirme en Linkedin o X.
La configuración de los controladores de correo en Laravel se encuentra en el archivo config/mail.php. Es posible definir varios remitentes, cada uno caracterizado por un nombre y un conductor de transporte.
'mailgun' => [ 'transport' => 'mailgun', // 'client' => [ // 'timeout' => 5, // ]
Laravel intentará usarlos en caso de que el servicio de correo electrónico principal no funcione.
Un mailable es una clase PHP que representa un correo electrónico enviado por su aplicación. Puedes crear una nueva clase que se pueda enviar por correo usando el comando Artisan make.
php artisan make:mail OrderConfirmation
La configuración de un mailable se produce a través de tres métodos principales: sobre, contenido y archivos adjuntos, que se ocupan respectivamente de definir los encabezados, el cuerpo del mensaje y los posibles archivos adjuntos.
use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailables\Address; use Illuminate\Mail\Mailables\Attachment; use Illuminate\Mail\Mailables\Content; use Illuminate\Mail\Mailables\Envelope; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class OrderConfirmation extends Mailable { use Queueable; use SerializesModels; public function __construct(public Order $order) {} /** * Configure the email message */ public function envelope() { return new Envelope( from: new Address('[email protected]', 'E-commerce'), subject: 'Order Confirmation', ); } /** * Generate the body */ public function content() { return new Content( markdown: 'emails.orders.confirm', ); } /** * Configure the email attachements */ public function attachments() { $code = $this->order->code; return [ Attachment::fromPath("/path/to/order-{$code}.pdf"), ]; } }
La representación del contenido del correo electrónico, obviamente, se confía a la plantilla Blade adecuada. Dentro de la vista Blade es posible recuperar los datos que se utilizarán para representar el correo electrónico utilizando las propiedades públicas definidas en la clase mailable ($order en el ejemplo anterior).
Code: {{ $order->code }} Address: {{ $order->address }} ...
El envío real de un correo electrónico se produce a través de la fachada de correo y sus métodos de envío y destino.
class OrderController extends Controller { public function ship(Order $order) { // do stuff with the order // Send the confirmation email Mail::to($order->user)->send(new OrderConfirmation($order)); } }
El destinatario del correo electrónico se puede pasar como una cadena de dirección de correo electrónico o mediante un objeto Usuario o una colección de objetos que tienen el nombre y las propiedades de correo electrónico.
El correo electrónico real que se enviará está representado por el objeto que se puede enviar por correo, que recibe las propiedades necesarias para representar la plantilla Blade asociada con el contenido.
La fachada de Mail ofrece varios métodos encadenables que permiten definir con más detalle la configuración de envío, tanto en lo que respecta a los destinatarios (con los métodos cc y bcc) como a los tiempos y métodos de envío (en cola o posterior).
Si quieres aprender a crear tus propias fachadas puedes leer el siguiente artículo:
https://inspector.dev/how-to-extend-laravel-with-driver-based-services/
Dado que el envío de un correo electrónico requiere el uso de servicios externos (los controladores de Mailer), puede ser una operación lenta con un impacto negativo en la experiencia del usuario.
Laravel le permite poner en cola mensajes de correo electrónico para enviarlos en segundo plano. Si está interesado en un tutorial sobre cómo utilizar el sistema de colas de Laravel a escala, puede leer el artículo a continuación:
https://inspector.dev/what-worked-for-me-using-laravel-queues-from-the-basics-to-horizon/
Para posponer el envío de un correo electrónico en segundo plano, tienes dos opciones: la interfaz ShouldQueue o el método de cola de la fachada de Mail.
Como se muestra en un fragmento anterior, la clase que se puede enviar por correo se genera con algunas características adjuntas de forma predeterminada, como Queueable.
Permite utilizar mediante programación los métodos de cola en la fachada de correo sin tocar su implementación:
Mail::to($user)->queue(new OrderConfirmation($order));
Como alternativa, puede declarar la implementación de la interfaz ShouldQueue en la clase Mailable:
use Illuminate\Contracts\Queue\ShouldQueue; class OrderConfirmation extends Mailable implements ShouldQueue { ... }
Si utiliza esta interfaz, el envío del correo electrónico siempre se pone en cola también si llama al método de envío estándar en la fachada de correo.
// If the mailable class implements ShouldQueue these methods has the same behaviour. Mail::to($user)->send(new OrderConfirmation($order)); Mail::to($user)->queue(new OrderConfirmation($order));
Cuando implementas una vista relacionada con un mensaje de correo electrónico, es realmente útil tener información visual sobre cuál será el resultado final que mostrará la vista Blade. Puedes hacerlo usando el archivo route/mailable.php en tus proyectos de Laravel.
/* * Render email in the browser. * * Visit https://homestead.test/mailable */ Route::get('/', function () { return new \App\Domains\Organization\Mails\IngestionLimitMail( \App\Domains\Organization\Models\Organization::firstOrFail() ); });
Puedes devolver una instancia de Mailable válida desde la ruta y Laravel representará la vista en el navegador. Es como desarrollar una página web normal.
Por último recuerda limitar la disponibilidad de esta ruta en el
Proveedor de servicios de ruta:
class RouteServiceProvider extends ServiceProvider { /** * Define your route model bindings, pattern filters, etc. * * @return void */ public function boot() { if (app()->environment('local')) { $this->mapMailableRoutes(); } } /** * Render mailables in the browser. * * @return void */ protected function mapMailableRoutes() { Route::prefix('mailable') ->group(base_path('routes/mailable.php')); } }
Para más artículos técnicos puedes seguirme en Linkedin o X.
Inspector es una herramienta de monitoreo de ejecución de código diseñada específicamente para desarrolladores de software. No necesita instalar nada a nivel de servidor, simplemente instale el paquete Laravel y estará listo para comenzar.
Si busca monitoreo HTTP, información sobre consultas de bases de datos y la capacidad de reenviar alertas y notificaciones a su entorno de mensajería preferido, pruebe Inspector de forma gratuita. Registre su cuenta.
O obtenga más información en el sitio web: https://inspector.dev
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3