В email-адресе действуют два разных правила для регистра букв. В домене после @ он не имеет значения. В локальной части до @ регистр может быть важен: это определяет принимающая почтовая система. Если вы не управляете этой системой, сохраняйте локальную часть без изменений и нормализуйте только домен.
Например, Alex.Smith+orders@EXAMPLE.COM можно записать как Alex.Smith+orders@example.com, не меняя значение домена. В варианте alex.smith+orders@example.com изменена и локальная часть. Считать, что это по-прежнему тот же получатель, без дополнительных оснований нельзя.
У домена и локальной части разные правила
RFC 5321, раздел 2.4 требует, чтобы реализации SMTP сохраняли регистр локальной части. В доменах почтовых адресов регистр не учитывается. При этом стандарт не рекомендует принимающим системам различать ящики только по регистру букв, поскольку это затрудняет совместную работу разных систем.
Одна принимающая система может доставлять письма для Alex@example.com и alex@example.com в один ящик. Другая может считать их разными адресами. Стандарт не дает приложению универсального правила, по которому эти локальные части равнозначны.
Заглавные буквы сами по себе не означают ошибку формата. Если форма отклоняет адрес со смешанным регистром, сначала проверьте валидатор, прежде чем просить человека изменить адрес. Другие ограничения разобраны в правилах синтаксиса email-адреса.
Все примеры ниже вымышлены: в них используются ASCII-адреса с DNS-доменами. Они показывают правила обработки, а не работающие ящики. Для интернационализированных адресов и локальных частей в кавычках нужен парсер с явной поддержкой этих форматов. Примеры не заменяют полноценный разбор email-адреса.
Сохраняйте контактный адрес при записи
После проверки ввода сохраняйте локальную часть для отправки писем, запросов на проверку адреса и отображения. Если вы записываете нормализованный адрес, используйте парсер, который обрабатывает домен отдельно. Перевод всей строки в нижний регистр уничтожает исходное написание локальной части.
| Введенный адрес | Адрес после нормализации домена | Что сохраняется |
|---|---|---|
Alex@EXAMPLE.COM |
Alex@example.com |
Регистр локальной части |
Alex.Smith@example.com |
Alex.Smith@example.com |
Регистр и точка |
Alex.Smith+orders@EXAMPLE.COM |
Alex.Smith+orders@example.com |
Регистр, точка и метка после плюса |
Значение точек и меток после плюса тоже определяет принимающая система. Сохраняйте и их. В статье об адресах со знаком плюс разобраны проверка формата и передача таких адресов.
Текущий парсер Emvero сохраняет локальную часть и нормализует домен. Само это преобразование ничего не говорит о существовании ящика.
Храните контактный адрес отдельно от значения для сравнения
Приложение может искать учетные записи без учета регистра в их идентификаторах. Это правило приложения, которое влияет на регистрацию, вход и восстановление доступа. Оно не определяет, как внешний почтовый сервер понимает адрес.
Для такого поиска храните отдельное значение для сравнения рядом с контактным адресом. По значению в нижнем регистре можно искать совпадения, а в контактном поле останется Alex.Smith+orders@example.com. Проверьте, как адреса сравниваются в базе данных и коде приложения. Правило должно быть одинаковым.
Совпадение этих значений не должно автоматически объединять две существующие учетные записи или давать доступ к любой из них. Разрешайте конфликт через штатное восстановление доступа или связывание учетных записей с предусмотренной в продукте аутентификацией. Письмо для восстановления доступа отправляйте на сохраненный контактный адрес найденной учетной записи. Не заменяйте его вариантом, который ввели при поиске.
Используйте одинаковые правила при регистрации и входе. Иначе форма может принять адрес, который не удастся найти на следующем шаге. Опишите, что произойдет с адресами, различающимися только регистром локальной части. Если приложение допускает лишь одну учетную запись для этих вариантов, объясните ограничение при попытке зарегистрировать вторую.
Если адреса уже записаны строчными буквами
Перевод в нижний регистр необратим: по значению alex@example.com нельзя узнать, вводил ли человек Alex@example.com. Не пытайтесь угадать регистр по имени и не перезаписывайте контактные адреса массово.
Сохраняйте текущее значение, пока не появится причина его исправить. Если человек сообщил о проблеме, предложите указать нужный адрес через обычный процесс изменения контактных данных. При необходимости подтвердите контроль над ящиком. Успешная доставка по адресу в нижнем регистре тоже не восстанавливает утраченное написание.
Прежде чем вводить новое правило сравнения, найдите записи, которые по этому правилу начнут совпадать. Заранее определите, как разрешить каждый конфликт, чтобы не смешать историю контактов и не открыть доступ к чужой учетной записи.
Проверьте все сценарии, в которых используется адрес
На вымышленных записях проверьте следующие случаи:
- При замене
EXAMPLE.COMнаexample.comлокальная часть сохраняется без изменений при записи и чтении. - Для
Alex@example.comиalex@example.comдействуют заданные правила поиска учетных записей. Заранее определено, что делать при совпадении. - В
Alex.Smith+orders@example.comрегистр, точка и метка сохраняются в контактном поле и запросе на проверку адреса. - Регистрация, вход и восстановление доступа используют одно правило сравнения. Письмо для восстановления уходит на сохраненный контактный адрес найденной учетной записи.
- Миграция обнаруживает конфликтующие значения для сравнения до изменения записей.
Это сценарии для регрессионных тестов вашей интеграции. Они не проверяют доставку и не доказывают, что два варианта адреса ведут в один ящик.
Проверяйте адрес, на который собираетесь писать
Передавайте на проверку адрес с неизмененной локальной частью. Если сначала изменить регистр, проверяться будут уже другие входные данные. Результат unknown означает, что свидетельств недостаточно для вывода. Перевод в нижний регистр с повторной проверкой не устраняет такую неопределенность в общем случае.
Проверка адреса также не устанавливает, кто контролирует ящик. Если это важно, отправьте собственное письмо для подтверждения. Emvero такое письмо не отправляет. Разница объясняется в сравнении проверки адреса и подтверждения почты.
Используйте API проверки email-адресов со своего сервера после того, как адрес поступил на него с неизмененной локальной частью.