Mailbox для Laravel: просмотр и тестирование emails

Mailbox для Laravel перехватывает исходящие письма и показывает их прямо внутри приложения по адресу /mailbox. Пакет разработан Redberry и поддерживается Nika Jorjoliani. Он предоставляет локальный почтовый ящик без отдельного почтового сервиса или дополнительного процесса. Кроме того, тестовый API позволяет проверять сообщение уже после того, как Laravel отрендерил его.

Настройка локального почтового ящика

Пакет требует PHP 8.3 или новее и поддерживает Laravel с версий 10 по 13. Установите его как зависимость для разработки, выполните команду установки и выберите mailbox в качестве почтового драйвера:

composer require redberry/mailbox-for-laravel --dev
php artisan mailbox:install
MAIL_MAILER=mailbox

Если при развертывании staging-окружения используется composer install --no-dev, установите Mailbox как обычную зависимость, чтобы использовать его в этом окружении.

Команда установки публикует необходимые ресурсы и конфигурацию, а также выполняет миграции пакета. Транспорт перехватывает Mailables, уведомления, отправляемые по электронной почте, и сообщения, созданные через Mail::raw().

По умолчанию перехваченные сообщения сохраняются в отдельной базе SQLite:

storage/app/mailbox/mailbox.sqlite

Вместо нее можно использовать существующее подключение к базе данных или файловое хранилище самого пакета.

Откройте /mailbox, чтобы просмотреть почтовый ящик. Здесь можно переключаться между HTML, обычным текстом и исходным представлением сообщения, просматривать и скачивать вложения, а также искать письма и фильтровать их по получателю. Список сообщений обновляется автоматически, без необходимости вручную перезагружать страницу.

Проверка отрендеренных сообщений

После того как приложение отправит письмо через Mailbox, можно проверять его HTML-код, получателей и вложения. Например, тест подтверждения заказа может выглядеть так:

use Redberry\MailboxForLaravel\Facades\Mailbox;

Mailbox::assertSentCount(1);

Mailbox::firstSent()
    ->assertHasSubject('Order Confirmation')
    ->assertHasTo('buyer@example.com')
    ->assertSeeInHtml('Order #12345')
    ->assertHasAttachment('receipt.pdf', 'application/pdf');

Необязательный трейт InteractsWithMailbox очищает перехваченные сообщения перед каждым тестом и предоставляет $this->mailbox() как альтернативу фасаду.

Также можно проверять текстовую часть письма, отправителя, заголовки и количество вложений. Если тест перехватывает несколько сообщений, в firstSent() можно передать callback, чтобы выбрать нужное письмо.

Перехват и одновременная доставка почты

При использовании MAIL_MAILER=mailbox сообщения попадают в панель Mailbox и на этом останавливаются. Чтобы одновременно сохранять их в Mailbox и доставлять получателям, укажите один из настроенных почтовых драйверов в MAILBOX_DECORATE:

MAIL_MAILER=mailbox
MAILBOX_DECORATE=smtp

В production Mailbox по умолчанию отключен. Оставьте обычный production-почтовый драйвер в конфигурации. Если MAIL_MAILER=mailbox останется установленным при MAILBOX_ENABLED=false, письма отправляться не будут.

По умолчанию доступ к панели разрешен за пределами production. В staging-окружении /mailbox следует защитить аутентификацией и определить ограничивающий доступ gate viewMailbox. Перехваченные письма могут содержать токены для сброса пароля и персональные данные.

Автоматическое удаление старых сообщений по умолчанию отключено. Чтобы включить ежедневную очистку сообщений, срок хранения которых истек, установите:

MAILBOX_RETENTION_SCHEDULE=true

Полная документация, параметры конфигурации и API для тестирования доступны в репозитории проекта на GitHub.

Похожие статьи

Рекомендательные технологии Подробнее
Разработка и инструменты • 8 месяцев назад

Что такое Self-Signed SSL‑сертификат и когда он нужен

Подробная пошаговая инструкция по созданию самоподписанного SSL‑сертификата и его интеграции в Nginx на Ubuntu 24.04. Описаны установка, генерация ключей и настройка HTTPS.

Разработка и инструменты • 8 месяцев назад

Как правильно хранить деньги в коде: без потерь, округлений и боли

Как правильно хранить денежные значения в базе данных и коде. Сравниваем целые минорные единицы и Decimal, объясняем, почему float использовать нельзя.