#199

Как правильно валидировать email

Это нетривиальный вопрос. Кроме всем известного юзер@домен.ком существует больше десятка валидных нотаций электронной почты, всякие там юзер!хост!хост%хост и подобные. Другой вопрос, что по современному инету такие письма уже не ходят.

Валидировать емейл надо на фронтенде, чтобы юзеры не вводили всякую ерунду. Валидировать емейл надо на беке, чтобы ты понимал, где даже не стоит пытаться отправить подтверждающее письмо и не портить себе почтовую репутацию. Ну и наконец, валидировать емейл надо в эксплуатации, чтобы убедиться, что он настоящий и принадлежит человеку. Кстати, эту последнюю валидацию нужно проводить постоянно, забирая отлупы с почтового сервиса и сопоставляя со своей базой. Не самая тривиальная задача, кстати.

Как я валидирую емейл на фронтенде: есть @, есть точка, длина не менее 5 символов. Почему 5? Потому что это единственное число, которое я могу обосновать. Емейл a@a.a — валидный, и никто не говорил, что любой из компонентов должен быть длиннее одного символа. Это всё! Как только ты начинаешь сюда добавлять другие правила, ты попадаешь в трясину, из которой тебя уже никто не вытащит. Хочешь по-настоящему заглянуть в бездну и валидировать емейл — открывай RFC 822 и прощай, милый друг.

Как я валидирую емейл на беке: беру самый мейнстримный пакет и доверяю ему. Пусть весь мир парится над этой задачей, а кто-то другой за нее отвечает.

Как я связываю эти два метода:

const email = document.querySelector('#email').value.trim().toLowerCase();
// локальная валидация: есть точка, есть @, длина
if (!isValid(email)) {
  showMessageEmailInvalid();
  return;
}

// пробуем регистрировать юзера
const result = await httpPostRegisterUser({ email });
if (result.success == false && result.error == 'email') {
  // не прошла расширенная валидация на беке
  showMessageEmailInvalid();
  return;
}