Какие правила по email
Что проверяют
Формулировка размытая, и первым делом стоит уточнить: речь о валидации адресов, об отправке писем из приложения или о деловой переписке. Для Python-разработчика обычно имеют в виду первое и второе, а следом спрашивают, как проверить, что адрес настоящий.
Как отвечать
Правила для адреса:
- формат:
local@domain, локальная часть до 64 символов, весь адрес на практике до 254. Допустимы+, точки, дефисы, кириллические домены и даже Unicode в локальной части (SMTPUTF8); - регистр: домен регистронезависим, локальную часть формально различают, но почти все почтовые серверы нет. Храните нормализованное значение с уникальным индексом по
lower(email)или колонкуcitextв PostgreSQL; - свой regex не нужен: он либо пропустит мусор, либо отсечёт реальные адреса. Берите
email-validator(его используетEmailStrв Pydantic) илиEmailValidatorв Django; - настоящая проверка: письмо со ссылкой подтверждения и одноразовым токеном с ограниченным сроком жизни.
Правила для отправки:
- асинхронно: не в обработчике запроса, а в задаче Celery или другой очереди, с повторами при временных ошибках SMTP;
- сборка:
email.message.EmailMessageилиsend_mailв Django, отправка черезsmtplibили API провайдера; - доставляемость: SPF, DKIM и DMARC для домена отправителя; для массовых рассылок заголовок
List-Unsubscribeи отписка в один клик, крупные почтовые сервисы требуют это с 2024 года; - безопасность: перенос строки в заголовке открывает header injection (Django в этом случае бросает
BadHeaderError), а форма сброса пароля не должна выдавать, зарегистрирован ли адрес.
Для тестов в Django есть locmem-бэкенд и mail.outbox, для ручной проверки удобен локальный перехватчик SMTP вроде Mailpit.
Где спотыкаются
Пересказывают этикет деловой переписки, не уточнив вопрос. На техническом собеседовании это мимо.
Приводят «правильный» regex как решение. Интервьюер тут же даст адрес с + или длинным доменом верхнего уровня, который этот regex отсечёт.
Отправляют письмо синхронно в запросе регистрации. Медленный SMTP превращается в медленную регистрацию, а его сбой в ошибку 500 у пользователя.