2013-08-11 5 views
6

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

[email protected] 
[email protected] 

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

[email protected] так же, как [email protected]

[email protected] такая же, как [email protected]


Проблема

Большинство сайтов используют базу данных с приводом аутентификация. Предположим, что я зарегистрирован по электронной почте (без точек) [email protected] то такой запрос MySQL не будет работать, как струны отличаются:

SELECT * FROM users WHERE email = "[email protected]" ;


Вопрос

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


UPDATE

Только представьте, какой сервис, где вы могли бы сделать тонны на счета, используя ту же адрес электронной почты. Оригинал электронной почты [email protected], псевдонимы:

[email protected] 
[email protected] 
[email protected] 

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

+1

Это зависит полностью от принимающего сервера, если 'foo.bar' обрабатывается как тот же адрес, что и' foobar', такой общей спецификации нет. – deceze

+2

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

+0

Хорошо, эта информация очень полезна – vikingmaster

ответ

8

Если вы действительно действительно хотите решить вашу проблему так, как вы предлагаете, вам нужно будет сохранить свой адрес электронной почты как своего рода каноническую форму. Скажите все нижние регистры и удалив «точки» или любой другой специальный символ, который вы хотите игнорировать.

Вы можете «автоматизируют» вещь с помощью триггера (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 ("[email protected]"), 
    ("[email protected]"), 
    ("[email protected]"); 

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


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

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

Это распространенное заблуждение: доменные имена (справа от @) не являются с учетом регистра. Но local parts (слева от @) являются с учетом регистра. За исключением специального случая postmaster.

Большинство MTA сконфигурированы так, чтобы игнорировать чувствительность к регистру «локальной части». Но это абсолютно не требуется. Фактически RFC5321 section 2.2 четко заявляет, что «Локальная часть почтового ящика ДОЛЖНА БЫТЬ считаться чувствительной к регистру».

+0

+1 уже хороший ответ, и я надеюсь, что вы заметили точку Gumbo –

+0

@ NullPoiиteя Я не знаком с * gmail *, и я был очень удивлен, прочитав, что что-либо после '+' игнорируется!?! По иронии судьбы, адрес электронной почты автора RFC5321 - это *[email protected]*: D –

+0

... В конце концов, всякая почтовая система доставки бесплатно доставляет/пересылает почту по своему усмотрению. * Реальная * проблема для нас на уровне приложения. Должны ли мы строго соблюдать RFC, или мы должны учитывать все тонкости различных почтовых провайдеров, насколько они популярны? Особенно здесь, поскольку адрес электронной почты иногда рассматривается как своего рода «уникальный идентификатор пользователя». –

 Смежные вопросы

  • Нет связанных вопросов^_^