Однажды у нас в CRM появились 3 загадочных клиента. С каждым вёл переговоры отдельный продавец. А потом выяснилось, что эти клиенты — один и тот же человек с одним и тем же имейлом.
Меня зовут Антон Григорьев, я работаю продуктовым дизайнером в финтех-компании и веду телеграм-канал UX Notes. В этой небольшой статье я расскажу, как такое случилось, может ли произойти у вас и о чём стоит дополнительно подумать при проектировании форм регистрации и входа.
Спойлер: это не связано с европейским регламентом по защите данных (GDPR) и правом клиента быть забытым (потребовать от компании удаления всей информации о себе).
Имя пользователя
Адрес электронной почты состоит из локальной части, @ и домена почтовика. Их сочетание позволяет однозначно идентифицировать конкретного получателя почты. В локальную часть попадает имя пользователя почтового сервиса. Например, в адресе anton@gmail.com это имя пользователя «anton».
Стандарт RFC 5322, описывающий формат электронных писем, в локальной части разрешает использовать:
строчные и заглавные латинские буквы,
цифры,
точки (но не в начале или конце и не 2 подряд),
дефисы,
подчёркивания… и, вы удивитесь, много других символов.
Я написал «вы удивитесь», потому что обычно в имени пользователя почтовые сервисы позволяют использовать только перечисленные выше символы (а иногда и того меньше). Поэтому редко можно встретить «+» в адресе электронной почты. Но всё же можно.
Субадресация
Стандарт RFC 5233 описывает практику субадресации (subaddressing). Суть в том, что почтовый сервис при доставке письма может игнорировать то, что в локальной части идёт после определённого символа. Обычно это «+», но могут быть и другие. Субадресацию поддерживают все основные почтовики.
Например, у меня может быть адрес электронной почты anton@gmail.com, но при регистрации на Хабре я укажу anton+habr@gmail.com и всё равно смогу получать письма. Зачем это надо?
1. Борьба со спамом. Оставляя свой имейл в сомнительном месте, можно написать anton+shadyplace@gmail.com и, если на этот адрес начнут приходить письма от нигерийских принцев, можно:
Понять, кто слил данные;
Настроить моментальное удаление писем, приходящих на этот адрес.
2. Сортировка писем. Можно регистрироваться в финансовых продуктах с имейлом anton+finance@gmail.com и настроить фильтр так, чтобы все письма на этот адрес сразу попадали в папку «Финансы».
3. Тестирование продукта QA-инженерами при разработке. Часто для тестирования мало одного пользователя: в продукте взаимодействует несколько ролей, клиенты могут находиться на разных стадиях оказания услуги и так далее. Зачем заводить по ящику для каждого тестового пользователя, постоянно перелогиниваться между ними ради одноразовых кодов, когда ящик может быть один?
Точки, доменные алиасы и регистр
Gmail — единственный из крупных почтовых сервисов игнорирует точки в имени пользователя. То есть письма, отправляемые на anton@gmail.com и an.ton@gmail.com, попадают в один и тот же ящик.
Конечно, этим можно воспользоваться для сортировки почты с определёнными неудобствами и ограничениями: в имя «anton» влезет 16 комбинаций точек, учитывая ограничения RFC 5322. Но в первую очередь фича снижает количество писем, отправляемых не туда из-за опечаток и невнимательности. Знаю человека, которому это спасло однажды много нервов.
У некоторых почтовиков есть несколько доменных имён. Например, Гугл Почта — это и gmail.com, и менее известный googlemail.com. То же самое с yandex.ru и ya.ru, yandex.com, yandex.kz, yandex.by. И так далее. Письма, отправленные на anton@yandex.ru и anton@ya.ru получит один и тот же человек.
И все основные почтовики игнорируют регистр букв в локальной части имейла: что anton@ya.ru, что Anton@ya.ru — всё равно.
Тайна третьей планеты оказалась не такой уж тайной
Выяснилось, что наша форма регистрации ничего этого не учитывает.
Но возник вопрос: надо ли? Если пользователь уже зарегистрирован с адресом anton@gmail.com, надо ли мешать ему зарегистрироваться ещё раз с адресами:
anton+something@gmail.com,
an.ton@gmail.com,
anton@googlemail.com,
Anton@gmail.com.
Понятно, что, если ему потребуется 3 учётных записи в нашем продукте, это не станет непроходимым препятствием. Он просто использует 3 разных ящика.
Но если он просто ошибётся и из-за этого создаст новый аккаунт или не сможет войти в старый? Он может решить, что продукт работает нестабильно (что очень плохо для финтеха). Он может расстроиться, особенно, если в старом аккаунте был какой-то прогресс и контент. Согласно 10 эвристикам Нильсена, хороший интерфейс должен предотвращать ошибки.
И чисто логически: если мы знаем, что 3 разных электронных адреса указывают на один ящик, как-то неправильно создавать с ними разные аккаунты. Например, проблему с дублированием аккаунтов при регистрации через соцсети — решают (см. схему идеальной регистрации Павла Шерера).
Как учесть эти нюансы с имейлами
При регистрации:
Нормализовать имейл: привести буквы к нижнему регистру, взять основной домен почтового сервиса, убрать плюс и всё после него, убрать точки из локальной части для Gmail.
Сравнить с уже существующими в базе нормализованными имейлами.
Если совпадений нет — сохранить и исходный, и нормализованный имейл. Исходный будет отображаться в пользовательском профиле и использоваться для отправки писем. Вдруг человек действительно размечает так почту.
В противном случае — сообщить, что пользователь с таким имейлом уже есть, и предложить войти. Или — что с таким имейлом зарегистрироваться нельзя (если есть требование от безопасников или комплаенса).
При входе:
Не обязательно указывать исходный имейл, поиск всё равно пройдёт по нормализованным.
Если совпадений нет — сообщить, что логин или пароль неверны.
Если совпадение есть и указан корректный пароль — пропустить. Без пароля никто кроме владельца ящика войти не сможет.
При восстановлении пароля:
Не обязательно указывать именно исходный имейл.
Но письмо с инструкцией отправится на исходный. Левый человек этого письма не получит, даже если это странный почтовый сервис, который позволяет разным людям получить адреса anton@domain.com и Anton@domain.com.
Минусы такого подхода:
Пользователи упомянутого выше странного почтового сервиса с имейлами anton@domain.com и Anton@domain.com смогут зарегистрироваться в нашем продукте только один раз. Кто первый — того и тапки. Но это маловероятно, так как такие почтовые сервисы — скорее исключение.
Тестировщикам придётся использовать разные ящики для тестовых аккаунтов, что неудобно. Но можно сделать исключение для имейлов с доменом нашей компании.
Как делают другие
Да почти никак. Вот как популярные продукты воспринимают имейл, который в нормализованном виде совпадает с уже зарегистрированным:
Имейлы |
ChatGPT |
Notion |
Amazon |
+something |
❌ Как новый |
❌ Как новый (отправляет код для подтверждения регистрации) |
❌ Как новый |
Точки и домен gmail.com |
❌ Как новый |
❌ Как новый |
❌ Как новый |
Домен googlemail.com |
❌ Как новый |
❌ Как новый |
❌ Как новый |
Заглавные буквы |
✅ Как уже зарегистрированный (предлагает ввести пароль, чтобы войти) |
✅ Как уже зарегистрированный (отправляет код для входа) |
✅ Как уже зарегистрированный (предлагает ввести пароль, чтобы войти) |
Складывается впечатление, что это не база, а скорее nice to have фича.
Вывод
Такую проверку неплохо иметь, но её внедрение — отдельная задача, требующая ресурсов и разработчиков, и проектировщиков. Популярные продукты, у которых другие периодически подсматривают те или иные решения, с этим не заморачиваются. Так что надо в каждом конкретном случае решать, заниматься этим или нет. Мы, например, посмотрели на эти 3 имейла нашего клиента, исследовали вопрос и добавили задачу в беклог.
В большинстве других продуктов эта статья, вероятно, не вызовет никаких изменений, но проектировщики как минимум смогут этот вопрос поднять и тем самым продемонстрировать команде свой уровень технической эрудиции.
Полезные материалы:
Комментарии (29)
askv
05.08.2025 20:06Понять, кто слил данные;
убрать плюс и всё после него
X-P0rt3r
05.08.2025 20:06Да, тоже сразу подумал.
Спасет только от недогадливых спамеров, которые не знают этих фич.
То есть легче сразу завести "мусорный" ящик.
askv
05.08.2025 20:06Так по легенде ящик нужен для регистрации на ресурсе. Спасёт только свой почтовый сервер, на котором можно создать миллион алиасов к одному ящику.
muxa_ru
05.08.2025 20:06catchall достаточно распространённая опция, но потом задолбаешься это всё менеджировать.
Со временем может получиться так, что время уходящее на менеджирование зоопарка индивидуальных емейлов превышает время уходящее на чистку инбокса от спама.
askv
05.08.2025 20:06Так вместе с логином нужно запоминать ресурс, на который этот email отдал. Можно в менеджере паролей? Я вот неосторожно дал email какой-то левой конторе, и теперь валятся тонны спама.
Geologist5330
05.08.2025 20:06Вы и правда так часто спам встречаете? Я чёт уже начинаю забывать как он выглядит, встречая его последнее время ну крайне редко...
Мусорный же ящик (ессно уникальный) юзаю только для мусорных ресурсов или для того чтобы добавить уровень анонимности.
winorun
05.08.2025 20:06Фильтрация почты настроить по субдомену, все остальное в спам. В случае слива субдомена, отправляем его в спам. Всё.
Есть правда проблема, при регистрации нужно добавлять фильтр.
eisaev
05.08.2025 20:06У меня есть тёска, который гораздо позже меня завёл абсолютно такую же почту на gmail.com, но без точки между именем и фамилией. В итоге мне уже несколько лет сыпятся его письма о регистрации во всяких забавных местах, чеки покупок билетов в каких-то онлайн сервисах и т.п. Гуглу в поддержку писал - бесполезно, они (ну или очередной тупой бот) в полной уверенности, что такой ящик даже завести было невозможно при уже созданном моём.
old_bear
05.08.2025 20:06О, собрат по несчастью. :D
Я свой аккаунт уже больше 20 лет назад завёл, с точкой в адресе. И долгое время забот не знал. А где-то лет 5 назад начали сыпаться письма от на имя какого-то, судя по языку, турецкого перца который каким-то образом смог на себя зарегать ту же почту но без точки.
И такой ведь активный перец попался, то в Твиттер, то в Мордокнигу, то ещё куда-нить повеселее норовит зарегаться. Так что приходится регулярно тыкать в ссылки "это не я", потому как перец не только активный но и упорный.
Меня это в первую очередь беспокоит на предмет безопасности моего собственного аккаунта - не приходят ли мои письма с кодами подтверждения и прочими критичными вещами какому-то левому человеку? Да и вероятность стать виноватым за чужие подвиги тоже ненулевая.
А почитав в интернетах отзывы других пострадавших, понял что Гугл считает эту проблему несуществующей и особой надежды на исправление нет. Так что на создал новый аккаунт, но переезд много времени и сил требует, ибо много чего за 20 лет накопилось.
MEGA_Nexus
05.08.2025 20:06anton@gmail.com, anton+habr@gmail.com, an.ton@gmail.com — почему всё это один и тот же имейл
Возможно, это Антон Назаров (осознанная меркантильность) так шифруется, чтобы его снова не забанила администрация Хабра. :)
MEGA_Nexus
05.08.2025 20:06Касательно самой темы. Где-то на Хабре недавно была статья, где говорилось, что использовать + (плюс) в e-mail адресе - это плохая идея. Так что лучше так не делать.
muxa_ru
05.08.2025 20:06Это старая и забавная фича Гмейла, но делать что-то кроме "привести к нижнему регистру" и "убедиться что хитрые символы нормально попадают в базу и извлекаются из неё" это закладывать базу под будущую проблему.
Grav Автор
05.08.2025 20:06Я бы здесь уточнил, что, несмотря на gmail.com в примерах, Гмейлу свойственно именно игнорирование точек. А остальные штуки с регистром, доменными алиасами и субадресацией свойственны всем основным почтовикам
CBET_TbMbI
05.08.2025 20:06За что я люблю хорошие и понятные статьи даже на простые темы, это за то, что в них можно что-то новое узнать. Я вот даже не знал, что гугл точки игнорирует.
Что касается пользы плюсов, как защиты от слива, то в целом сомнительно. Ничто не мешает условным спамерам нормализовать адрес.
Proscrito
05.08.2025 20:06Сперва даже удивился, разве может кто-то не знать про плюс в имейле. Но сразу же понял что это профдеформация.
Кто бы ни придумал эту фичу - большой молодец. Удобно для тестирования чего-нибудь, где требуется рабочее мыло. Можно сколько угодно аккаунтов завести добавляя +1, +2, +admin и т.д. к имейлу и иметь сколько надо рабочих аккаунтов с одним реальным имейлом.
dyadyaSerezha
05.08.2025 20:06игнорируют регистр букв в локальной части имейла
Что за локальная часть такая?
gluck59
05.08.2025 20:06Попробовал отправить емейл на свой ящик с добавлением плюса, получил 550 User Unknown. Ящик обслуживается МТС, зачем им какие-то RFC?
Зато чтобы получать почту с зарубежных доменов, нужно писать заявление в МТС.
forthgate
Хорошо что валидация email в таком формате отсутствует на большинстве сервисов. Стараюсь по необходимости оставлять на разных площадках в качестве контакта свой ящик + имя сервиса. По крайней мере потом по полученному спаму можно узнать кто из контор сливает адреса
Grav Автор
Я не предлагаю отрезать «+» и всё после него. Наоборот, в базу должен сохраняться такой имейл, который пользователь указал при первичной регистрации, чтобы работала борьба со спамом. Но вот уже дальнейшие регистрации с этим же ящиком — не позволять
YegorP
Почему не позволять-то? Во-первых, вы и правда всего лишь заставляете пользователя регаться с другим имейлом. Во-вторых, вы городите довольно сложную логику (если учитывать не только плюс, но также домены и точки) ради маловероятной опечатки (ведь речь идёт не о любой опечатке, а об опечатке по правилам субадресацим). В-третьих, фича суперполезная для тестировщиков.
askv
А если ещё просить подтверждение создания эккаунта на email, то и вовсе непонятно, зачем это делать.
Grav Автор
Я в выводе об этом и написал. Вся эта дополнительная логика — это дополнительная работа. И надо думать в каждом конкретном случае, стоит ли она того, чтобы снизить вероятность определённой ошибки. Приведённые в пример сервисы вроде ChatGPT, Notion, Amazon отслеживают только регистр. А для тестировщиков не сложно сделать исключение по корпоративному домену
gluck59
Что это дает практически?