Отправка электронных писем в Laravel требует взаимодействия трех компонентов: почтовой программы Laravel, почтовых классов Laravel и фасада Mail. Каждый из трех касается разных аспектов жизненного цикла отправки электронного письма.
Почтовые программы — это драйверы для подключения служб отправки электронной почты (таких как AWS SES, Sendgrid, Mailgun и т. д.), которые приложение может использовать для пересылки электронных писем получателям.
Laravel Mailable — это специальные классы, которые представляют собой шаблон электронного письма для отправки. Он содержит всю типичную информацию сообщения электронной почты, такую как содержимое, поле «Кому», вложения и т. д.
Наконец, фасад Mail — это точка доступа для запроса фактической отправки почтового сообщения через драйвер почтовой программы.
У меня была возможность детально изучить эту систему, и теперь в часы пик Inspector отправляет более 6000 электронных писем в час.
Надеюсь, мой опыт поможет вам лучше понять этот компонент фреймворка, поскольку Laravel Mailable — один из ключевых компонентов любого современного приложения.
Чтобы увидеть больше технических статей, вы можете подписаться на меня в Linkedin или X.
Конфигурация драйверов почтовой программы в Laravel находится в файле config/mail.php. Можно определить несколько почтовых программ, каждый из которых характеризуется именем и драйвером транспорта.
'mailgun' => [ 'transport' => 'mailgun', // 'client' => [ // 'timeout' => 5, // ]
Laravel попытается использовать их в случае сбоя основной службы электронной почты.
Mailable — это класс PHP, который представляет электронное письмо, отправленное вашим приложением. Вы можете создать новый почтовый класс с помощью команды Artisan make.
php artisan make:mail OrderConfirmation
Настройка почтового сообщения осуществляется с помощью трех основных методов: конверта, содержимого и вложений, которые соответственно определяют заголовки, тело сообщения и любые вложения.
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"), ]; } }
Отрисовка содержимого электронного письма, очевидно, возлагается на соответствующий шаблон Blade. Внутри представления Blade можно получить данные, которые будут использоваться для рендеринга электронной почты, используя общедоступные свойства, определенные в классе mailable ($order в приведенном выше примере).
Code: {{ $order->code }} Address: {{ $order->address }} ...
Фактическая отправка электронного письма происходит через фасад Mail и его методы to и 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)); } }
Получатель электронной почты может быть передан в виде строки адреса электронной почты, через объект «Пользователь» или коллекцию объектов, которые имеют свойства имени и электронной почты.
Фактическое электронное письмо, которое должно быть отправлено, представлено объектом mailable, который получает необходимые свойства для отображения шаблона Blade, связанного с содержимым.
Фасад Mail предлагает различные цепочки методов, которые позволяют вам более подробно определить конфигурацию отправки, как в отношении получателей (с помощью методов cc и bcc), так и времени и методов отправки (очередь или позже).
Если вы хотите научиться создавать собственные фасады, вы можете прочитать статью ниже:
https://inspector.dev/how-to-extend-laravel-with-driver-based-services/
Поскольку для отправки электронного письма требуется использование внешних служб (драйверов Mailer), эта операция может выполняться медленно и отрицательно влиять на удобство работы пользователя.
Laravel позволяет ставить сообщения электронной почты в очередь для фоновой отправки. Если вас интересует руководство по использованию системы очередей Laravel в больших масштабах, вы можете прочитать статью ниже:
https://inspector.dev/what-worked-for-me-using-laravel-queues-from-the-basics-to-horizon/
Чтобы отложить отправку электронного письма в фоновом режиме, у вас есть два варианта: интерфейс MustQueue или метод очереди фасада Mail.
Как показано в предыдущем фрагменте, класс mailable генерируется с некоторыми свойствами, прикрепленными по умолчанию, например Queueable.
Это позволяет программно использовать методы очереди на фасаде Mail, не затрагивая вашу реализацию:
Mail::to($user)->queue(new OrderConfirmation($order));
В качестве альтернативы вы можете объявить реализацию интерфейса MustQueue в классе Mailable:
use Illuminate\Contracts\Queue\ShouldQueue; class OrderConfirmation extends Mailable implements ShouldQueue { ... }
Если вы используете этот интерфейс, отправка электронного письма всегда ставится в очередь, даже если вы вызываете стандартный метод отправки на фасаде 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));
Когда вы реализуете представление, связанное с сообщением электронной почты, очень полезно иметь визуальную информацию о том, какой конечный результат отобразит представление Blade. Вы можете сделать это, используя файл маршруты/mailable.php в своих проектах 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() ); });
Вы можете вернуть действительный экземпляр Mailable из маршрута, и Laravel отобразит представление в браузере. Это похоже на разработку обычной веб-страницы.
Наконец, не забудьте ограничить доступность этого маршрута в
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')); } }
Чтобы увидеть больше технических статей, вы можете подписаться на меня в Linkedin или X.
Инспектор — это инструмент мониторинга выполнения кода, специально разработанный для разработчиков программного обеспечения. Вам не нужно ничего устанавливать на уровне сервера, просто установите пакет Laravel и все готово.
Если вам нужен HTTP-мониторинг, анализ запросов к базе данных и возможность пересылать оповещения и уведомления в предпочитаемую вами среду обмена сообщениями, попробуйте Inspector бесплатно. Зарегистрируйте свой аккаунт.
Или узнайте больше на сайте: https://inspector.dev
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3