Любой проект с регистрацией рано или поздно доходит до «надо юзеру кидать письмо после регистрации». В идеальном мире это выглядит так: юзер заполнил форму, Laravel создал запись, и письмо с кнопочкой «Добро пожаловать» упало в инбокс.

В реальности же ты сидишь и материшься: локально всё работает через Mailtrap, а на продакшене письма теряются между SMTP и чёрной дырой Gmail. И самое весёлое — бизнесу похрен, что проблема в чужом почтовом сервере. Для них виноват ты.

Настройка: сказка и правда

В доках пишут: пропиши в .env пару строчек — и будет тебе счастье.

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=someuser
MAIL_PASSWORD=secret
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=hello@app.com
MAIL_FROM_NAME="App Name"

Да, оно взлетит. Но только пока ты тестишь на Mailtrap. Как только включишь реальный SMTP (типа Gmail, Яндекс, Amazon SES или, не дай бог, какой-нибудь «корпоративный Exchange»), начнётся цирк с конями:

  • TLS/SSL не совпадает — письма не шлются.
  • Пароль верный, но SMTP говорит «authentication failed» (спасибо за костыльные политики безопасности).
  • Письмо улетает в спам, потому что у тебя нет SPF/DKIM/DMARC.

Laravel тут ни при чём — это боль email-инфраструктуры. Но именно тебе придётся объяснять, почему «пользователи не получают письма».

Логика в коде

Laravel даёт два варианта: Mailable и Notification.

Вариант 1: Mailable

Создаёшь командой:

php artisan make:mail WelcomeMail

Внутри у тебя класс:

class WelcomeMail extends Mailable
{
    public function build()
    {
        return $this->subject('Добро пожаловать')
                    ->view('emails.welcome');
    }
}

И всё вроде красиво, пока не начинаешь отправлять:

Mail::to($user->email)->send(new WelcomeMail());

На мелких проектах норм. Но на больших начнутся таймауты, когда SMTP тупит. И тут внезапно понимаешь, что send() блокирует поток. Пользователь жмёт «Регистрация», а твой код ждёт, пока сервер из Африки соизволит ответить.

Вариант 2: Notification

Тут Laravel предлагает: «Делай красиво, как в доках».

$user->notify(new WelcomeUserNotification());

Выглядит норм. Но под капотом там та же магия: оно всё равно дёргает мейлер. Просто обёртка.

Где всё ломается

Очереди.
Любой норм проект выносит отправку писем в очередь. Laravel орёт: «просто добавь implements ShouldQueue». Только забудь на секунду запустить воркер — и письма зависнут в очереди. Бизнес снова орёт.

Логирование.
Когда письмо «не дошло», попробуй докажи, что проблема не у тебя. Laravel честно пишет в лог, что «мы отправили». SMTP сказал «250 OK», а дальше оно утонуло в спаме. Иди объясни это маркетологу, который уверен, что у тебя руки из жопы.

Шаблоны.
Blade-шаблоны для писем норм, пока тебе не нужно сделать HTML + текстовую версию. А как только появляется дизайн от фронта с кучей стилей, Blade начинает душить. Превратить «письмо с версткой» в адекватный шаблон — отдельная боль.

Как делают выжившие

  • Всегда кидай письма через очередь. Пусть регистрация не ждёт SMTP.
  • Используй нормальные сервисы: Amazon SES, Mailgun, Postmark. Забудь про «SMTP от хостинга за 2$».
  • Логируй всё. Кто получил, когда, с каким статусом. Иначе потом будешь крайним.
  • Готовься к боли с версткой писем. Даже в 2025 году письма — это HTML 2005-го.

Итог

Отправить письмо после регистрации в Laravel — звучит просто. Но если хочешь, чтобы оно реально дошло, а не растворилось в спаме, придётся попотеть: очереди, DNS-записи, нормальный сервис рассылки. Laravel тут не виноват. Он дал тебе Mail и Notifications. А дальше ты сам — или танцуешь с SMTP, или платишь за Mailgun.