O envio de emails no Laravel requer a colaboração entre três componentes: Laravel mailer, classes mailable do Laravel e a fachada Mail. Cada um dos três trata de um aspecto diferente do ciclo de vida do envio de um e-mail.
Mailers são os drivers para conectar serviços de envio de e-mail (como AWS SES, Sendgrid, Mailgun, etc.) que o aplicativo pode usar para encaminhar e-mails aos destinatários.
Laravel Mailable são classes especiais que representam um modelo de email para enviar. Ele contém todas as informações típicas de uma mensagem de e-mail, como conteúdo, campo “para”, anexos, etc.
Finalmente, a fachada Mail é o ponto de acesso para solicitar o envio real de uma correspondência através de um driver de mala direta.
Tive a oportunidade de explorar esse sistema detalhadamente e agora no pico o Inspector envia mais de 6.000 emails por hora.
Espero que minha experiência possa ser útil para você entender melhor este componente do framework, já que o Laravel Mailable é um dos componentes-chave de qualquer aplicação moderna.
Para mais artigos técnicos você pode me seguir no Linkedin ou X.
A configuração dos drivers mailer no Laravel está no arquivo config/mail.php. É possível definir vários mailers, cada um caracterizado por um nome e um condutor de transporte.
'mailgun' => [ 'transport' => 'mailgun', // 'client' => [ // 'timeout' => 5, // ]
O Laravel tentará usá-los caso o serviço de e-mail principal esteja inativo.
Um mailable é uma classe PHP que representa um email enviado pela sua aplicação. Você pode criar uma nova classe que pode ser enviada por correio usando o comando Artisan make.
php artisan make:mail OrderConfirmation
A configuração de um mailable ocorre através de três métodos principais: envelope, conteúdo e anexos, que respectivamente tratam da definição dos cabeçalhos, do corpo da mensagem e de eventuais anexos.
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"), ]; } }
A renderização do conteúdo do e-mail é, obviamente, confiada ao modelo Blade apropriado. Dentro da visualização Blade é possível recuperar os dados a serem usados para renderizar o email usando as propriedades públicas definidas na classe mailable ($order no exemplo acima).
Code: {{ $order->code }} Address: {{ $order->address }} ...
O envio real de um e-mail ocorre através da fachada Mail e seus métodos to e send.
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)); } }
O destinatário do e-mail pode ser passado como uma string de endereço de e-mail ou por meio de um objeto Usuário ou uma coleção de objetos que possuem o nome e as propriedades de e-mail.
O e-mail real a ser enviado é representado pelo objeto mailable, que recebe as propriedades necessárias para renderizar o template Blade associado ao conteúdo.
A fachada Mail oferece vários métodos encadeados que permitem definir com mais detalhes a configuração de envio, tanto no que diz respeito aos destinatários (com os métodos cc e bcc) quanto aos horários e métodos de envio (fila ou posterior).
Se você quiser aprender como criar suas próprias fachadas você pode ler o artigo abaixo:
https://inspector.dev/how-to-extend-laravel-with-driver-based-services/
Como o envio de um e-mail requer o uso de serviços externos (os drivers Mailer), pode ser uma operação lenta com impacto negativo na experiência do usuário.
O Laravel permite que você enfileire mensagens de e-mail para envio em segundo plano. Se você estiver interessado no tutorial sobre como usar o sistema de filas do Laravel em escala você pode ler o artigo abaixo:
https://inspector.dev/what-worked-for-me-using-laravel-queues-from-the-basics-to-horizon/
Para adiar o envio de um e-mail em segundo plano você tem duas opções: a interface ShouldQueue ou o método queue da fachada Mail.
Conforme mostrado em um trecho anterior, a classe mailable é gerada com algumas características anexadas por padrão, como Queueable.
Permite usar programaticamente os métodos de fila na fachada do Mail sem alterar sua implementação:
Mail::to($user)->queue(new OrderConfirmation($order));
Em alternativa você pode declarar a implementação da interface ShouldQueue na classe Mailable:
use Illuminate\Contracts\Queue\ShouldQueue; class OrderConfirmation extends Mailable implements ShouldQueue { ... }
Se você usar esta interface, o envio do e-mail estará sempre na fila também se você chamar o método de envio padrão na fachada Mail.
// 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));
Quando você implementa uma visualização relacionada a uma mensagem de e-mail, é realmente útil ter feedback visual de qual será o resultado final que a visualização Blade renderizará. Você pode fazer isso usando o arquivo Routes/mailable.php em seus projetos 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() ); });
Você pode retornar uma instância Mailable válida da rota e o Laravel renderizará a visualização no navegador. É como desenvolver uma página web normal.
Por fim, lembre-se de limitar a disponibilidade desta rota no
RouteServiceProvider:
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 mais artigos técnicos você pode me seguir no Linkedin ou X.
Inspector é uma ferramenta de monitoramento de execução de código projetada especificamente para desenvolvedores de software. Você não precisa instalar nada no nível do servidor, basta instalar o pacote Laravel e você está pronto para começar.
Se você está procurando monitoramento HTTP, insights de consulta de banco de dados e a capacidade de encaminhar alertas e notificações para seu ambiente de mensagens preferido, experimente o Inspector gratuitamente. Registre sua conta.
Ou saiba mais no site: https://inspector.dev
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3