Отправка почты и уведомления

Рейтинг: 59.6% · 10 голосов
Курс по Laravel: маршруты, Eloquent, Blade, миграции, очереди и API. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
oleg_php
Сообщения: 25
Зарегистрирован: 14 май 2026, 08:06

Отправка почты и уведомления

Сообщение oleg_php »

АкадемияLaravel с нуляГлава 11 из 18
Оглавление курса (18)
  1. Знакомство с Laravel и установка окружения
  2. Маршруты и контроллеры
  3. Blade: шаблоны и вёрстка страниц
  4. Миграции и структура базы данных
  5. Eloquent ORM: модели и CRUD
  6. Связи в Eloquent: hasMany, belongsTo и другие
  7. Формы и валидация данных
  8. Аутентификация пользователей
  9. Middleware и защита маршрутов
  10. Очереди и фоновые задачи
  11. Отправка почты и уведомления (вы здесь)
  12. Строим REST API на Laravel
  13. Авторизация: Gates и Policies
  14. Работа с файлами: загрузка, Storage, диски local и S3
  15. Тестирование: Pest и PHPUnit, фабрики, сидеры, RefreshDatabase
  16. Сервис-контейнер, провайдеры, свои artisan-команды и планировщик
  17. Деплой в продакшен и обзор современного фронтенда (Vite, Livewire, Inertia)
  18. События и слушатели, кеширование, логирование
Регистрация, сброс пароля, ответ на комментарий: почти любому приложению рано или поздно нужно писать пользователю на почту. В Laravel для этого есть два инструмента, Mailable для писем и Notification для доставки события сразу в несколько каналов. Разберём оба и настроим всё так, чтобы письма не терялись и не падали в спам.

Настройка и локальное тестирование:

Вся конфигурация живёт в config/mail.php и подтягивается из .env. Для разработки удобнее всего Mailpit: он прикидывается SMTP-сервером, перехватывает все письма и показывает их в браузере на localhost:8025. В Sail он идёт из коробки, в Herd Pro есть свой встроенный перехватчик почты.

Код: Выделить всё

MAIL_MAILER=smtp
MAIL_HOST=127.0.0.1
MAIL_PORT=1025
MAIL_FROM_ADDRESS="noreply@myblog.ru"
MAIL_FROM_NAME="${APP_NAME}"
Если Mailpit поднимать лень, поставьте MAIL_MAILER=log, и письма целиком будут писаться в storage/logs/laravel.log. На проде указываете SMTP реального провайдера. В наших условиях это чаще всего SMTP Яндекс 360, VK WorkSpace или Unisender, на старте хватает бесплатных тарифов.

Письма через Mailable:

Каждое письмо в Laravel оформляется отдельным классом. Создадим письмо автору статьи о новом комментарии, сразу с markdown-шаблоном:

Код: Выделить всё

php artisan make:mail CommentPosted --markdown=mail.comment-posted
Команда создаст класс в app/Mail и шаблон в resources/views/mail. Класс описывает тему и содержимое:

Код: Выделить всё

class CommentPosted extends Mailable
{
    use Queueable, SerializesModels;

    public function __construct(public Comment $comment) {}

    public function envelope(): Envelope
    {
        return new Envelope(subject: 'Новый комментарий к вашей статье');
    }

    public function content(): Content
    {
        return new Content(markdown: 'mail.comment-posted');
    }
}
Публичные свойства автоматически доступны в шаблоне, переменную $comment можно использовать прямо в Blade. Markdown-шаблон собирается из готовых компонентов вроде <x-mail::button>, поэтому письмо сразу выглядит прилично без ручной вёрстки таблицами.

Отправка из контроллера или слушателя события выглядит так: Mail::to($comment->post->author)->send(new CommentPosted($comment)).

Уведомления:

Notification решает другую задачу: одно событие нужно доставить в несколько каналов. Письмо, запись в базе для колокольчика в шапке сайта, Telegram через сторонний пакет. Генерируем класс командой php artisan make:notification и описываем каналы:

Код: Выделить всё

class NewCommentNotification extends Notification implements ShouldQueue
{
    use Queueable;

    public function __construct(private Comment $comment) {}

    public function via(object $notifiable): array
    {
        return ['mail', 'database'];
    }

    public function toMail(object $notifiable): MailMessage
    {
        return (new MailMessage)
            ->subject('Новый комментарий')
            ->line('К вашей статье оставили комментарий.')
            ->action('Читать', url('/posts/'.$this->comment->post_id));
    }

    public function toArray(object $notifiable): array
    {
        return ['comment_id' => $this->comment->id];
    }
}
Для канала database нужна таблица: php artisan make:notifications-table и затем migrate. Отправляется уведомление методом notify() на модели пользователя (трейт Notifiable в User уже есть из коробки), а непрочитанные достаются через $user->unreadNotifications. Этого достаточно, чтобы собрать тот самый колокольчик.

Заметьте, уведомление реализует ShouldQueue. Отправка по SMTP занимает одну-две секунды, и держать пользователя на этом запросе незачем. Механика та же, что в главе про очереди: задача падает в очередь, воркер разгребает. Mailable тоже умеет ShouldQueue, тогда обычный send() сам поставит письмо в очередь.

Типичные грабли:

Самые частые проблемы здесь не в коде. Если письма с ShouldQueue не уходят, первым делом проверьте, запущен ли воркер: без него задания копятся в таблице jobs и молча лежат там вечно. Дальше хостинг: на большинстве российских VPS (Timeweb, REG.RU и другие) исходящий порт 25 закрыт от спамеров, поэтому подключайтесь к SMTP через 465 или 587. Для 465 в свежих версиях Laravel ставится MAIL_SCHEME=smtps, в старых MAIL_ENCRYPTION=ssl.

Про спам: настройте на домене записи SPF и DKIM, иначе даже честные письма поедут в спам-папку. Провайдеры SMTP обычно дают готовые значения для DNS. И не забудьте поменять MAIL_FROM_ADDRESS, дефолтный hello@example.com многие серверы режут на входе.

Последняя ловушка тоньше. SerializesModels кладёт в очередь не модель, а её id, и достаёт запись заново в момент отправки. Если комментарий успели удалить, воркер упадёт с ModelNotFoundException. Для таких писем либо передавайте простые значения вместо модели, либо обрабатывайте ситуацию в методе failed().

Итог:

Mailable для писем, Notification для нескольких каналов сразу, Mailpit для локальной проверки, очереди для скорости, SPF и DKIM для доставляемости. В следующей главе соберём из всего пройденного REST API: отдадим данные не в Blade, а в JSON, и прикрутим аутентификацию по токенам.
👍4 ❤️4 🔥3 😄 🤔
✔ Лучший ответ сформирован автоматически — luke19
oleg_php писал(а):копятся в таблице jobs и молча лежат там вечно поймал ровно это на тестовом сервере. полчаса грешил на smtp, а оказалось после деплоя забыл перезапустить воркер. поставил supervisor как в 10 главе и добавил queue:restart в деплой-скрипт, теперь живет
Перейти к ответу →
Аватара пользователя
luke19
Сообщения: 1
Зарегистрирован: 12 май 2026, 00:31

Re: Отправка почты и уведомления

Сообщение luke19 »

✔ Лучший ответ — сформирован автоматически
oleg_php писал(а):копятся в таблице jobs и молча лежат там вечно
поймал ровно это на тестовом сервере. полчаса грешил на smtp, а оказалось после деплоя забыл перезапустить воркер. поставил supervisor как в 10 главе и добавил queue:restart в деплой-скрипт, теперь живет
👍1 ❤️1 🔥1 😄 🤔1
Аватара пользователя
steven07
Сообщения: 2
Зарегистрирован: 12 май 2026, 09:18

Re: Отправка почты и уведомления

Сообщение steven07 »

а в чем тогда смысл Mailable, если Notification умеет то же самое плюс другие каналы? можно же всегда брать Notification и не плодить классы. или для писем со сложной версткой возможностей toMail уже не хватает?
👍1 ❤️ 🔥 😄 🤔1
Аватара пользователя
nixosuser
Сообщения: 1
Зарегистрирован: 16 май 2026, 13:51

Re: Отправка почты и уведомления

Сообщение nixosuser »

вопрос: а если получатель не пользователь? форма обратной связи, человек оставил email и все. notify() же висит на модели User, на что его вызывать в таком случае?
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
envoyops
Сообщения: 1
Зарегистрирован: 20 май 2026, 16:34

Re: Отправка почты и уведомления

Сообщение envoyops »

спасибо за Mailpit, раньше сидел на log драйвере и выковыривал письма из laravel.log глазами. с веб-мордой на 8025 порту небо и земля, плюс сразу видно как письмо реально рендерится
👍1 ❤️ 🔥 😄 🤔2
Ответить
← Предыдущая глава
Очереди и фоновые задачи
Следующая глава →
Строим REST API на Laravel

Все главы курса «Laravel с нуля»

Поделиться темой: ✈ Telegram VK

Вернуться в «Laravel с нуля»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость