电子邮件地址认证(点和大写)

7

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

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

然而,在使用 Gmail 时,点号( . )和大写字母只是为了更易读,并不被视为电子邮件地址的一部分。因此,我们可以说: name.surname@gmail.comnamesurname@gmail.com 是相同的。 x-com.shop.support@stuff.netx-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
完全取决于接收服务器,foo.bar 是否被视为与 foobar 相同的地址,没有这样的通用规定。 - deceze
2
有大写字母时没有问题 - 您可以插入小写形式并进行检查。至于点,这是Gmail的功能,但其他邮件提供商可能会将其视为两个单独的电子邮件。 - dev-null-dweller
6
“capitalization [..] is not taken in account” 这是一个常见的误解:电子邮件地址中的域名部分(@右侧)不区分大小写,但是本地部分(@左侧)区分大小写。除了特殊情况postmaster外,大多数MTA都配置为忽略"local part"的大小写敏感性,但这绝对不是必需的。实际上,RFC5321明确规定:"邮箱的本地部分必须被视为大小写敏感。" - Sylvain Leroux
@SylvainLeroux 很棒的信息,这可能是一个可行的答案。 - NullPoiиteя
@NullPoiиteя 在下面发布了一个答案 - Sylvain Leroux
显示剩余2条评论
1个回答

9
如果您真的想按照您提出的方式解决问题,您需要将您的电子邮件地址存储为某种规范形式。例如,全部小写并通过删除“点”或任何其他您想忽略的特殊字符来实现。
您可以使用触发器(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节明确规定:“邮箱的本地部分必须视为区分大小写。”


@NullPoiиteя 我不熟悉 gmail,读到 + 后面的任何内容都被忽略了,我感到非常惊讶!?!具有讽刺意味的是,RFC5321的作者的电子邮件地址是 john+smtp@jck.com :D - Sylvain Leroux
毕竟,每个邮件传递系统都可以自由地发送/转发邮件。 真正的问题在于我们在应用程序级别上。 我们必须严格遵守RFC吗?还是必须考虑各种流行的电子邮件提供商的每一个微妙之处?特别是在这里,因为电子邮件地址有时被视为某种“唯一的用户ID”。 - Sylvain Leroux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接