我读到电子邮件的标准第一部分是大小写敏感的,但我尝试发送电子邮件到name@example.com
、Name@example.com
和NAME@example.com
,每种情况下都能收到。
邮件服务器如何处理用户名?是否可能出现大小写不匹配导致消息无法传递的情况?在注册时提供电子邮件地址时,使用完全相同的字母大小写真的很重要吗?
引用自RFC 5321第2.3.11节:
标准的邮箱命名约定被定义为“local-part@domain”;当代使用允许比简单的“用户名”更广泛的应用程序。因此,由于中间主机在尝试通过修改它们来优化传输时出现问题的悠久历史,本地部分必须仅由指定在地址的域部分中的主机解释和分配语义。
因此,“@”之前的部分可能是大小写敏感的,因为它完全在主机系统的控制下。然而,在实践中,没有广泛使用的邮件系统会基于大小写区分不同的地址。
然而,“@”符号后面的部分是域名,根据RFC 1035第3.1节规定:
"名称服务器和解析器必须以不区分大小写的方式比较[域名]"
简而言之,您可以将电子邮件地址视为不区分大小写。
我知道这是一个老问题,但我想在这里发表评论:在某种程度上,电子邮件地址是区分大小写的,但大多数用户要“非常不明智”地使用需要大写字母的电子邮件地址。他们很快就会停止使用该地址,因为他们会错过很多邮件。(除非他们有特定的理由使事情变得困难,并且他们只从他们认识的特定发送者那里期望邮件。)
这是因为存在不完美的人类和不完美的软件(惊喜!),这些人和软件将假定所有电子邮件都是小写字母,因此这些人和软件将使用“小写版本”地址发送消息,而不管如何提供给他们。如果收件人无法收到此类信息,它不久就会注意到自己错过了很多东西,并切换到仅小写字母的电子邮件地址,或者设置其服务器为不区分大小写。
我来晚了,但是我有些不同的想法要说...
>> "Are email addresses case sensitive?"
嗯,“这要看情况…”(TM)
有些组织认为这是一个好主意,他们的电子邮件服务器强制区分大小写。
因此,对于那些疯狂的地方,“是的,电子邮件区分大小写。”
注意:仅仅因为规范允许你做一些事情,并不意味着这样做是个好主意。
KISS原则建议我们的系统使用不区分大小写的电子邮件。
而健壮性原则则建议我们接受区分大小写的电子邮件。
解决方案:
这意味着如果已经存在以下电子邮件:user@x.com
...然后另一个用户想使用此电子邮件:USER@x.com
...我们的不区分大小写的搜索逻辑会返回一个“该电子邮件已经存在”的错误消息。
现在,你需要做出决定:在你的情况下,这个解决方案是否足够?
如果不是,你可以向那些需要支持区分大小写的客户收取方便费,并实现自定义逻辑,即使user@x.com已存在,也允许USER@x.com进入你的系统。
在这种情况下,你的电子邮件搜索/验证逻辑可能类似于以下伪代码:
if (user.paidEmailFee) {
// case sensitive email
query = "select * from users where email LIKE ?"
} else {
// case insensitive email
query = "select * from users where email ILIKE ?"
}
这种方式基本上是强制不区分大小写,但如果客户使用支持此类无意义选项的电子邮件系统,则允许他们支付此服务费用。
p.s. ILIKE 是 PostgreSQL 的一个关键词:http://www.postgresql.org/docs/9.2/static/functions-matching.html
query = ...
行替换为简单的query = // 插入区分大小写/不区分大小写搜索
注释来解决以上所有评论,这样可以将讨论从SQL注入主题转移到你想要展示的内容上。换句话说,保持逻辑性,而非实现性。这将使批评者安静下来。 - Mark A. Donohoeemail_address
列的类型设置为citext
即可。 - jbgIETF开放标准RFC 53212.4. 通用语法原则和事务模型
SMTP实现必须注意保留邮箱本地部分(即用户名)的大小写。特别地,在某些主机上,“smith”用户与“Smith”用户是不同的。
邮箱域名遵循普通DNS规则,因此不区分大小写。
可能同一个电子邮件收件人会以不同的大小写添加到列表中,尽管地址在技术上是不同的,但可能会导致收件人收到重复的电子邮件。在这种情况下,你可以像情况a)一样处理,很可能可以将它们视为重复项并删除重复的条目。然而,最好将其视为特殊情况,通过向两个地址发送“提醒”邮件来询问他们的电子邮件地址是否准确。
从法律角度来看,如果您未经两个地址的确认/许可而删除重复项,您可能会因为泄露私人信息/身份验证给一个未经授权的地址而被追究责任,仅仅是因为两个实际上是不同收件人的地址却具有相同但大小写不同的地址。
RFC5321 2.4 中的摘录:
邮箱的本地部分必须被视为区分大小写。因此,SMTP 实现必须小心保留邮箱本地部分的大小写。特别地,对于某些主机,用户 "smith" 不同于用户 "Smith"。然而,利用邮箱本地部分的大小写敏感性会妨碍互操作性,因此不鼓励这样做。