如何处理Gmail地址?

时间:2010-07-01 21:21:11

标签: sql tsql gmail

背景

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 +过滤器功能

在我们在db上搜索过于昂贵时,是否标准化了每条记录上的电子邮件地址?


另一个建议的解决方案是向表中添加一个GmailEmail字段,并在第一次注册用户时将其gmail电子邮件地址的标准化版本的副本保存到第二个字段,可用于在他们登录时进行比较回来了。

如果可能的话,我不必去达到这个程度。

任何人都有任何想法?我欢迎任何和所有的意见。

4 个答案:

答案 0 :(得分:2)

  

正在标准化电子邮件地址   我们搜索的每条记录   db上贵吗?

是。即使这个表占用的页面少于8页,是的,也太贵了。

您是否需要跟踪用户输入的所有无数表格中的电子邮件地址?如果是这样,拥有第二个“干净”专栏也许是丑陋的,但可能是必要的。 (根据您的函数创建计算列的效果与原始解决方案一样差。)

如果您不需要按用户输入(每次)精确维护地址,为什么不:

  • 使用您的功能清理现有数据,例如更新...设置EmailCol = dbo.STANDARDIZE_EMAIL(EmailCol)
  • 将规则应用于清除电子邮件地址(无论何时将其添加到数据库中)

答案 1 :(得分:1)

我的建议是使用您提供的功能创建一个“标准化”电子邮件字段(以空白开头)。用户登录后,系统可以:

  • 标准化用于登录的电子邮件
  • 查看“标准化”字段中是否存在电子邮件
    • 如果是,请让他们进入
    • 如果没有,请检查是否存在“未标准化”的电子邮件
      • 如果是:
        • 将该样式标记为首选电子邮件样式
        • 创建“标准化”字段
        • 让他们进入
      • 如果不是:
        • 拒绝登录

这样做的好处是可以将用户慢慢迁移到新系统,并(透明地)将首选电子邮件用作登录。当然,请注意,在其GMail地址变体下使用多个帐户的用户将无法访问其他帐户;因为你似乎想要阻止它,我将把它称为一个功能。

您可能希望在开头添加一个检查,因此如果标准化字段存在,则存在非标准化字段(并且它们不匹配),您可以告知用户发生了什么和交易适当的。

答案 2 :(得分:1)

我想指出这些字符! # $ % & ' * + - / = ? ^ _ { | } ``~在电子邮件地址中都有效。您将为任何实际上没有将“+后缀”和句点映射到同一邮箱的邮箱的系统引入问题。

我认为用户期望将user+spam@example.com和user@example.com视为唯一地址是合理的。

答案 3 :(得分:0)

您可以创建一个computed列来标准化电子邮件。

我知道你说这不是一个选项,但你可能需要再看看标准化列 - 直到你这样做,你的数据库中的数据会有不一致。