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

时间:2013-08-11 10:39:21

标签: php mysql email authentication

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

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 个答案:

答案 0 :(得分: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");

这只会根据canonized表单在表格中插入一个行。 请仔细看看最后一个例子。该域名为“ex.ample.com”,我的简单触发器将其标榜为“examplecom”。这可能是可取的。这只是为了确定正确的标准化可能比REPLACE(LOWER( ...更复杂一些。此外,您可能需要创建此触发器的重复ON UPDATE。但...


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

  

“大写[...]未考虑”

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

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