Как я могу безопасно определить, есть ли адрес электронной почты в списке? - PullRequest
0 голосов
/ 18 января 2019

Мне было поручено написать систему, которая определяет, есть ли указанный адрес электронной почты в списке. Проверка наличия строки в списке обычно является простой задачей, но адреса электронной почты сложны. Например, если я отправлю электронное письмо на номера personname@gmail.com и person.name@gmail.com, оба письма попадут в один и тот же аккаунт. Из того, что я понимаю, есть несколько других способов, которыми у пользователя могут быть две разные строки адреса электронной почты, которые в конечном итоге достигнут полученной учетной записи (замените точку подчеркиванием, добавьте символ + после имени пользователя, измените регистр букв и т. Д.).

У пользователей этой системы есть стимул предоставить несколько адресов электронной почты, которые обманывают проверку списка, но ведут к одной и той же учетной записи (personname@gmail.com и person.name@gmail.com). Я хочу найти способ определить, приведут ли два адреса электронной почты к одной учетной записи поставщика электронной почты (предпочтительно в Python, хотя я могу портировать любое решение).

Мое первое решение состояло в том, чтобы попытаться перечислить вышеупомянутые уловки и обратить их вспять, чтобы получить адреса электронной почты в какой-либо распространенной форме. Например, удалите все подчеркивания и точки, удалите все, что находится между первым знаком + и знаком @, и преобразуйте письмо в строчные. Проблема в том, что я не уверен на 100%, что это исчерпывающий список всех возможных уловок, и при этом я не знаю, работают ли эти уловки для всех провайдеров. Существует ли библиотека или общий метод выполнения такой проверки, который является более надежным, чем этот метод? Неужели я застрял с необходимостью выполнить эти ограниченные проверки, а затем съесть стоимость более умных пользователей, которым удалось успешно обмануть мою систему?

1 Ответ

0 голосов
/ 18 января 2019

К сожалению, поведение, которое вы описываете, полностью зависит от поставщика электронной почты. Gmail может игнорировать определенные символы, но другие поставщики не будут делать это, что означает, что ваши правила могут генерировать ложные совпадения. Спецификация SMTP RFC 5321 2.3.11 прямо говорит, что вы не можете делать какие-либо предположения о том, как провайдеры электронной почты интерпретируют адреса электронной почты, потому что обработка полностью зависит от них (выделено жирным шрифтом):

Адрес обычно состоит из спецификаций пользователя и домена.
стандартное соглашение об именах почтовых ящиков определено как «Локальная часть @ домен»; современное использование позволяет гораздо более широкий набор приложения, чем простые "имена пользователей". Следовательно, и из-за длинная история проблем, когда промежуточные хосты пытались оптимизировать транспорт, изменив их, локальная часть ДОЛЖНА быть интерпретировать и назначать семантику только хостом, указанным в доменная часть адреса .

Так что нет универсальных правил для электронной почты. Лучшее, что вы можете сделать, - это использовать отдельный набор правил для каждого провайдера электронной почты, что может дать вам некоторый успех, но решение никогда не будет идеальным.

...