Как обращаться с адресами Gmail? - PullRequest
2 голосов
/ 02 июля 2010

Фон

Gmail разрешает фильтры '. И +, позволяющие бесконечному количеству адресов электронной почты указывать на одну и ту же учетную запись Gmail.

, т. Е. Все перечисленные ниже указывают ната же учетная запись gmail:

  • user@gmail.com
  • u.ser@gmail.com
  • user+spam@gmail.com
  • u.ser+spam@gmail.com

Проблема

В нашей производственной среде есть таблица, в которой хранятся все данные зарегистрированных пользователей, включая их адреса электронной почты.

В настоящее время адреса электронной почты gmail в этой таблице содержат сочетание указанных выше вариантов.

  • Проблема 1 - Если пользователь пытается войти в систему после того, как онсоздали свою учетную запись, используя другой вариант своего адреса электронной почты, чем у нас на записи, этот пользователь не будет найден.
  • Задача 2 - Пользователь может создавать различные учетные записи на нашем сайте, используя различные варианты адресов электронной почты Gmail.

Возможные решения:


Одним из предложенных решений было бы создание функции ...

CREATE FUNCTION STANDARDIZE_EMAIL (
    @Email varchar(255)
)
RETURNS varchar(255)
AS
BEGIN
    -- we make the email lowercase since email addresses are
    -- case independent 

    SET @Email = LOWER(@Email)

    -- if it is a gmail email address then we remove periods and filters from the username
    IF RIGHT(RTRIM(@Email), 10) = '@gmail.com'
    BEGIN
        -- remove domain
        SET @Email = REPLACE(@Email, '@gmail.com', '')

        --remove periods from username
        SET @Email = REPLACE(@Email, '.', '')

        -- remove '+' and filter
        IF CHARINDEX('+', @Email) > 0 
            SET @Email = SUBSTRING(@Email, 0, CHARINDEX('+', @Email))

        -- add back the domain
        SET @Email = @Email + '@gmail.com'
    END  

    RETURN (@Email)
END

Пример использования:

SELECT * FROM table
WHERE STANDARDIZE_EMAIL(Email) = STANDARDIZE_EMAIL(@Email)

inb4: Запуск процесса для стандартизации всех электронных писем, находящихся в настоящее время на столе, не является вариантом, так как могут быть дубликаты, и пользователи потеряют функциональность фильтра gmail +

Стандартизирует электронную почтуадрес в каждой записи, когда мы ищем слишком дорогой в БД?


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

Я бы не стал заходить в такой степени, если это возможно.

У кого-нибудь естьесть идеи?Я приветствую любой вклад.

Ответы [ 4 ]

2 голосов
/ 02 июля 2010

Стандартизирует адрес электронной почты на каждая запись, как мы ищем тоже дорого на дб?

Да. Даже если эта таблица занимает менее 8 страниц, да, это слишком дорого.

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

Если вам не нужно точно поддерживать адреса, введенные (каждый раз) пользователями, почему бы и нет:

  • Очистите существующие данные, используя вашу функцию, например, ОБНОВЛЕНИЕ ... set EmailCol = dbo.STANDARDIZE_EMAIL (EmailCol)
  • Применение правила для очистки адресов электронной почты при каждом добавлении их в базу данных
1 голос
/ 02 июля 2010

Я хотел бы отметить, что все эти символы ! # $ % & ' * + - / = ? ^ _ { | } ``~ действительны в адресе электронной почты. Вы представляете проблему для любых систем, в которых на самом деле есть почтовые ящики, которые не отображают "+ суффиксы" и точки на один и тот же почтовый ящик.

Я думаю, что для пользователя разумно ожидать, что user+spam@example.com и user@example.com будут рассматриваться как уникальные адреса.

1 голос
/ 02 июля 2010

Я бы порекомендовал создать «стандартизированное» поле электронной почты (которое начинается как пустое), используя предоставленную вами функцию.После входа пользователя система может:

  • Стандартизировать адрес электронной почты, который он использовал для входа в систему
  • Проверьте, существует ли адрес электронной почты в поле "стандартизированный"
    • Еслида, введите их
    • Если нет, проверьте, существует ли "нестандартное" электронное письмо
      • Если оно есть:
        • Отметьте этот стиль в качестве предпочитаемого стиля электронной почты
        • Создайте «стандартизированное» поле
        • Впустите их
      • Если нет:
        • Отклоните регистрацию

Преимуществом этого является медленный перенос пользователей в новую систему и (прозрачно) получение предпочитаемой им электронной почты в качестве имени для входа.Обратите внимание, конечно, что пользователи, использующие несколько учетных записей по вариантам своего адреса GMail, не смогут получить доступ к своим другим учетным записям;так как вы, кажется, хотите предотвратить это, я назову это функцией.

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

0 голосов
/ 02 июля 2010

Вы можете создать вычисляемый столбец , который бы стандартизировал электронную почту.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...