Нормализация email в Validator.js позволяет привести адреса электронной почты к единому каноническому виду, устраняя различия, которые не влияют на фактическую доставку писем, но критичны для сравнения, хранения и дедупликации.
Основной инструмент — функция normalizeEmail, входящая в
состав библиотеки Validator.js.
Адрес электронной почты может быть записан разными способами, хотя фактически указывать на один и тот же почтовый ящик. Наиболее распространённые вариации:
User@Example.com и
user@example.com)u.ser@gmail.com и
user@gmail.com)+
(user+test@gmail.com)Нормализация устраняет такие различия, приводя email к унифицированному виду.
normalizeEmail(email, options)
email — строка с адресом электронной почтыoptions — объект конфигурации нормализацииФункция возвращает нормализованный email или false, если
входные данные некорректны.
Без дополнительных настроек выполняется базовая нормализация:
Пример:
const validator = require('validator');
validator.normalizeEmail('User@Example.COM');
// 'user@example.com'
Gmail имеет специфические правила обработки адресов, которые Validator.js учитывает отдельно.
В Gmail точки в локальной части игнорируются:
validator.normalizeEmail('u.ser.name@gmail.com', {
gmail_remove_dots: true
});
// 'username@gmail.com'
Символ + и всё, что после него, игнорируется Gmail:
validator.normalizeEmail('username+test@gmail.com', {
gmail_remove_subaddress: true
});
// 'username@gmail.com'
Обе опции часто используются вместе:
validator.normalizeEmail('U.ser+spam@gmail.com', {
gmail_remove_dots: true,
gmail_remove_subaddress: true
});
// 'user@gmail.com'
Хотя доменная часть email всегда регистронезависима, локальная часть технически может быть чувствительной, но на практике почти всегда нормализуется.
validator.normalizeEmail('USER@EXAMPLE.COM', {
all_lowercase: true
});
// 'user@example.com'
Validator.js учитывает различия между почтовыми сервисами, поскольку правила нормализации не универсальны.
Поддерживается удаление подадресации:
validator.normalizeEmail('user+tag@outlook.com', {
outlookdotcom_remove_subaddress: true
});
// 'user@outlook.com'
Yahoo также допускает подадресацию:
validator.normalizeEmail('user+tag@yahoo.com', {
yahoo_remove_subaddress: true
});
// 'user@yahoo.com'
Расширенная конфигурация позволяет управлять поведением нормализации:
all_lowercasegmail_remove_dotsgmail_remove_subaddressgmail_convert_googlemaildotcomoutlookdotcom_remove_subaddressyahoo_remove_subaddressvalidator.normalizeEmail('User.Name+promo@GoogleMail.com', {
all_lowercase: true,
gmail_remove_dots: true,
gmail_remove_subaddress: true,
gmail_convert_googlemaildotcom: true
});
Результат:
'username@googlemail.com'
Google исторически использует два домена, которые являются взаимозаменяемыми. Опция позволяет унифицировать их:
validator.normalizeEmail('user@googlemail.com', {
gmail_convert_googlemaildotcom: true
});
// 'user@gmail.com'
При регистрации пользователей:
const emails = new Set();
emails.add(validator.normalizeEmail('user.name@gmail.com', {
gmail_remove_dots: true
}));
emails.add(validator.normalizeEmail('username@gmail.com', {
gmail_remove_dots: true
}));
// Set содержит только один email
Без нормализации сравнение может давать ложные различия:
const a = 'user.name@gmail.com';
const b = 'username@gmail.com';
validator.normalizeEmail(a, { gmail_remove_dots: true }) ===
validator.normalizeEmail(b, { gmail_remove_dots: true });
Нормализованные email позволяют:
Нормализация не является универсальной операцией и зависит от домена:
+Validator.js решает эту проблему через раздельные стратегии для разных доменов, но полная универсальность невозможна.
validator.normalizeEmail('user.name@gmail.com');
В этом случае точки не удаляются, что может привести к дубликатам.
Неправильное предположение, что все почтовые сервисы ведут себя как Gmail:
validator.normalizeEmail('user.name@domain.com', {
gmail_remove_dots: true
});
Такое поведение может исказить данные.
Удаление подадресации без учёта контекста может привести к потере информации о назначении email (например, фильтрации рассылок).
Validator.js выполняет нормализацию поэтапно:
Такая структура позволяет гибко расширять поддержку новых провайдеров без изменения базовой логики.
Часто normalizeEmail используется вместе с
isEmail:
if (validator.isEmail(email)) {
const normalized = validator.normalizeEmail(email);
}
Это обеспечивает предварительную проверку и последующую унификацию данных.