【问题标题】:Email Address Authentication (dots and capitalization)电子邮件地址身份验证(点和大小写)
【发布时间】:2013-08-12 19:47:04
【问题描述】:

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

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

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

【问题讨论】:

  • foo.barfoobar是否被视为同一个地址完全取决于接收服务器,没有这样的通用规范。
  • 大写字母没有问题 - 您可以插入小写形式并检查它。至于点,它是 Gmail 的功能,但其他邮件提供商可能会将它们视为两封独立的电子邮件。
  • 好吧,这个信息很有用
  • "未考虑大写 [..]" 这是一个常见的误解:域名(@右侧)不考虑区分大小写。但 local parts(@ 左侧) 区分大小写。除了特殊情况postmaster。大多数 MTA 配置为忽略“本地部分”的区分大小写。但这绝对不是必需的。事实上,RFC5321 明确指出“邮箱的本地部分必须区分大小写。”
  • @SylvainLeroux 很棒的信息,它可能是答案

标签: php mysql email authentication


【解决方案1】:

如果您真的想按照您建议的方式解决您的问题,您必须将您的电子邮件地址存储为某种规范形式。说出所有小写字母并删除“点”或您想忽略的任何其他特殊字符。

您可以通过使用触发器 (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。但是……


...我不会朝着这个方向走得更远:

“不考虑大写 [..]”

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

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

【讨论】:

  • @NullPoiиteя 我对 gmail 不熟悉,最令我惊讶的是,+ 之后的任何内容都被忽略了!?!具有讽刺意味的是,RFC5321 的作者的电子邮件地址是 john+smtp@jck.com :D
  • ...毕竟,每个邮件递送系统都可以随心所欲地免费递送/转发邮件。 真正的问题是在应用程序级别的。我们是否必须严格遵守 RFC,或者我们是否必须考虑到各种邮件提供商的每一个细节?尤其是在这里,因为电子邮件地址有时被视为某种“唯一用户 ID”。
  • 感谢您的精彩回答,我会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
相关资源
最近更新 更多