7

如您所知,电子邮件地址中可以使用很多字符。现在人们在他们的电子邮件地址中拆分一些关键字以提高可读性,例如:

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

您仍然会在同一地址收到电子邮件确认。听起来很奇怪吧?

4

1 回答 1

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 ("Sylvain.Leroux@example.com"),
   ("sylvainleroux@example.com"),
   ("SYLVAINLEROUX@ex.ample.com");

这只会根据规范化形式在表中插入一行请仔细看最后一个例子。域是“ex.ample.com”,我的简单触发器将其规范为“examplecom”。这可能是不可取的。这只是为了指出正确的规范化可能比REPLACE(LOWER( .... 此外,您可能需要创建ON UPDATE此触发器的副本。但...


...我不会朝那个方向走得更远,因为:

“不考虑大写[..]”

这是一个常见的误解:域名(@ 右侧)区分大小写。但本地部分(@ 左侧)区分大小写。特殊情况除外postmaster

大多数 MTA 配置为忽略“本地部分”的区分大小写。但这绝对不是必需的。事实上, RFC5321 第 2.2 节明确指出“邮箱的本地部分必须被视为区分大小写”。

于 2013-08-11T11:25:51.850 回答