如您所知,电子邮件地址中可以使用很多字符。 现在人们在他们的电子邮件地址中拆分一些关键字以提高可读性,例如:
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
您仍然会在同一地址收到电子邮件确认。听起来很奇怪,是吧?
最佳答案
如果您真的想按照您提议的方式解决您的问题,您将不得不将您的电子邮件地址存储为某种规范形式。说出所有小写字母并删除“点”或您想要忽略的任何其他特殊字符。
您可以通过使用触发器 (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
这个触发器。但是...
...我不会朝那个方向走得更远,因为:
"capitalization [..] is not taken in account"
这是一个常见的误解:域名(@ 的右边)不区分大小写。但是local parts (@ 的左侧) 区分大小写。除了特殊情况 postmaster
。
大多数 MTA 配置为忽略“本地部分”的大小写敏感性。但这绝对不是必需的。事实上RFC5321 section 2.2明确指出“邮箱的本地部分必须区分大小写。”
关于php - 电子邮件地址验证(点和大写),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18171062/