Питання на співбесіді: Mail
Найпопулярніші питання з реальних Laravel/PHP співбесід для всіх рівнів
3 питання
Лист описується класом Mailable, шаблон - Blade або Markdown.
php artisan make:mail WelcomeEmail --markdown=emails.welcome
Mail::to($user)->send(new WelcomeEmail($user));
Налаштування транспорту (SMTP, Mailgun, SES, log) - у config/mail.php та .env. Реалізувавши ShouldQueue на Mailable, відправку можна винести в чергу, щоб не блокувати запит.
Тест не повинен слати справжні листи - це повільно, ненадійно й іноді доходить до реальних людей.
Mail::fake() підміняє транспорт і запамʼятовує, що мало піти:
it('sends a welcome letter on registration', function () {
Mail::fake();
$this->post('/register', [
'email' => 'dev@example.com',
'password' => 'password',
]);
Mail::assertSent(WelcomeMail::class, function (WelcomeMail $mail) {
return $mail->hasTo('dev@example.com');
});
});
Є ще assertNotSent(), assertNothingSent() і assertSentCount().
Важлива пастка: якщо лист відправляється через сповіщення ($user->notify(...)), Mail::fake() його не побачить - потрібен Notification::fake() і assertSentTo(). Плутанина між цими двома - найчастіша причина «тест не бачить листа, хоча він точно йде».
Друга пастка: якщо mailable реалізує ShouldQueue, а в тесті стоїть Queue::fake(), лист не дійде до пошти взагалі - перевіряти треба постановку завдання.
Поза тестами для перегляду верстки зручні два інструменти. Драйвер log пише лист у storage/logs, а Mailpit чи Mailtrap ловлять пошту в локальний ящик - листи виглядають як справжні, але нікуди не йдуть.
Ще одна дрібниця: mailable можна відкрити прямо в браузері, повернувши його з маршруту - зручно для правки шаблону без повторних відправлень.
Більшість причин лежить поза кодом - у DNS і репутації домену, - але частина залежить від застосунку.
Що налаштовується в DNS:
- SPF - перелік серверів, яким дозволено слати від імені домену.
- DKIM - криптопідпис листа; без нього провайдер не може підтвердити, що лист не підроблено.
- DMARC - політика на випадок, коли SPF чи DKIM не зійшлися.
Без цих трьох записів лист від нового домену з високою ймовірністю не дійде до вхідних.
Що залежить від застосунку:
- Адреса відправника з власного домену.
fromвидуnoreply@gmail.comне пройде перевірку - домен уfromмає збігатися з тим, для якого налаштовані SPF і DKIM. - Транзакційне окремо від масового. Розсилка з поганим показником відкриттів псує репутацію домену, і за нею перестають доходити листи про відновлення пароля. Часто для розсилок беруть окремий піддомен.
- Відписка. Для масових листів заголовок
List-Unsubscribeобовʼязковий: без нього люди тиснуть «спам» замість відписки, і це найгірший сигнал. - Текстова версія. Лист без
text/plainчастина фільтрів вважає підозрілим. - Обробка bounce. Слати на адресу, що повертає помилку, місяцями - прямий шлях до блокування; провайдери дають вебхуки, які варто слухати.
Практично: транзакційну пошту віддають спеціалізованому сервісу (Mailgun, Postmark, SES), а не SMTP власного сервера, - вони тримають репутацію IP і дають статистику доставки. У Laravel це лише зміна MAIL_MAILER.