Аутентификация адреса электронной почты (точки и капитализация)

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

name.surname@gmail.com
x-com.shop.support@stuff.net

однако, символ точки . при использовании Gmail (а также капитализации) только улучшает читаемость, он не учитывается как часть адреса электронной почты. Таким образом, мы можем сказать, что:

name.surname@gmail.com это то же самое, что namesurname@gmail.com

x-com.shop.support@stuff.net это то же самое, что x-comshopsupport@stuff.net


проблема

большинство веб-сайтов используют аутентификацию на основе базы данных. Предположим, что я зарегистрировал электронное письмо (без точек) namesurname@gmail.com тогда такой запрос MySQL не будет работать, поскольку строки отличаются:

SELECT * FROM users WHERE email = "name.surname@gmail.com" ;


вопрос

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


обновление

просто представьте себе какой-то сервис, где вы могли бы сделать тонны учетных записей, используя ту же электронную почту. Оригинальная электронная почта namesurname@gmail.com псевдонимы:

name.surname@gmail.com
n.amesur.name@gmail.com
nam.esurname@gmail.com

и все же вы будете получать подтверждения по электронной почте на тот же адрес. Звучит странно, да?

1 ответов


если вы действительно хотите решить проблему так, как вы предлагаете, вам нужно будет сохранить свой адрес электронной почты в какой-то канонической форме. Говорят все меньше и, сняв "точки" или любой другой специальный символ, который вы хотите игнорировать.

вы можете "автоматизировать" вещь, используя триггер (http://sqlfiddle.com/#!2/81689/1):

create table email(addr char(80), canon char(80) UNIQUE);
CREATE TRIGGER ins_email BEFORE INSERT ON email
FOR EACH ROW
    SET NEW.canon = REPLACE(LOWER(NEW.addr), ".","");

INSERT IGNORE INTO email(addr) VALUES ("Sylvain.Leroux@example.com"),
   ("sylvainleroux@example.com"),
   ("SYLVAINLEROUX@ex.ample.com");

это будет только вставить один строки в таблице на основе канонизированных форма. Пожалуйста, внимательно посмотрите на последний пример. Домен - это "ex.ample.com" который канонизирован моим простым триггером как "examplecom". Что, вероятно,не желательно. Это просто, чтобы указать, что правильная канонизация, вероятно, может быть немного сложнее, чем REPLACE(LOWER( ... . Кроме того, вам, вероятно, потребуется создать дубликат ON UPDATE этого триггера. Но...


... Я не буду идти дальше в этом направлении:

"капитализации [..] не принимается во внимание"

это распространенное заблуждение: доменные имена (справа от @) не регистр. Но!--32-->локальные части (слева от @) are регистр. За исключением особого случая postmaster.

большинство MTA настроены на игнорирование чувствительности к регистру "локальной части". Но это абсолютно не требуется. На самом деле RFC5321 2.2 четко укажите ,что " локальная часть почтового ящика должна рассматриваться как чувствительная к регистру."