Любой проект с регистрацией рано или поздно доходит до «надо юзеру кидать письмо после регистрации». В идеальном мире это выглядит так: юзер заполнил форму, 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.
0 комментариев