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.