电子邮件地址区分大小写吗?

419

我读到电子邮件的标准第一部分是大小写敏感的,但我尝试发送电子邮件到name@example.comName@example.comNAME@example.com,每种情况下都能收到。

邮件服务器如何处理用户名?是否可能出现大小写不匹配导致消息无法传递的情况?在注册时提供电子邮件地址时,使用完全相同的字母大小写真的很重要吗?


相关问题 - https://dev59.com/oGox5IYBdhLWcg3wtmnh - Luke Girvin
5个回答

479

引用自RFC 5321第2.3.11节:

标准的邮箱命名约定被定义为“local-part@domain”;当代使用允许比简单的“用户名”更广泛的应用程序。因此,由于中间主机在尝试通过修改它们来优化传输时出现问题的悠久历史,本地部分必须仅由指定在地址的域部分中的主机解释和分配语义。

因此,“@”之前的部分可能是大小写敏感的,因为它完全在主机系统的控制下。然而,在实践中,没有广泛使用的邮件系统会基于大小写区分不同的地址。

然而,“@”符号后面的部分是域名,根据RFC 1035第3.1节规定:

"名称服务器和解析器必须以不区分大小写的方式比较[域名]"

简而言之,您可以将电子邮件地址视为不区分大小写。


112
简而言之,您可以将电子邮件地址视为不区分大小写。我会更强烈地表达:“如果要检查用户数据库中的重复项等情况,您不能将电子邮件地址视为区分大小写的方式”。 - Geert-Jan
89
我不同意这个结论。如果你在数据库中寻找重复数据,大小写不敏感的匹配可能是最好的方法,但我曾见过一些代码,在发送邮件前将电子邮件地址转换为小写。这不是一个好主意,因为有一小部分机会它可能无法被送达。所以如何处理取决于错误的后果以及当时处理电子邮件地址的目的(收集唯一地址列表、发送电子邮件等)。 - Peter Bagnall
18
有人知道邮件产品列表,可以(a)在用户john.doe@company.com有效时拒绝John.Doe@company.com,或者(b)允许创建两个不同的邮箱:John.Doe@company.comjohn.doe@company.com吗? - MSC
89
我在一家大公司工作,发现有另一个人的名字与我完全相同。今天我发现他的邮件地址只是大小写不同。这一直有效,所以我很惊讶看到“没有广泛使用的邮件系统根据大小写区分不同的地址”。我们使用的是我会称之为“广泛使用”的 MS Exchange 邮件系统。 - Matthew James Briggs
22
RFC 5321 2.4. 常规语法原则与事务模型 - SMTP 实现必须注意保留邮箱本地部分的大小写。特别地,在某些主机中,用户“smith”与用户“Smith”是不同的。 邮箱域遵循常规 DNS 规则,因此不区分大小写。 - Adam111p
显示剩余7条评论

61

我知道这是一个老问题,但我想在这里发表评论:在某种程度上,电子邮件地址是区分大小写的,但大多数用户要“非常不明智”地使用需要大写字母的电子邮件地址。他们很快就会停止使用该地址,因为他们会错过很多邮件。(除非他们有特定的理由使事情变得困难,并且他们只从他们认识的特定发送者那里期望邮件。)

这是因为存在不完美的人类和不完美的软件(惊喜!),这些人和软件将假定所有电子邮件都是小写字母,因此这些人和软件将使用“小写版本”地址发送消息,而不管如何提供给他们。如果收件人无法收到此类信息,它不久就会注意到自己错过了很多东西,并切换到仅小写字母的电子邮件地址,或者设置其服务器为不区分大小写。


20
这是对Postel's法则http://en.wikipedia.org/wiki/Robustness_principle的深刻应用。编写假定电子邮件地址的本地部分不区分大小写的软件仍然是错误的,但考虑到有很多错误的软件存在,如果您是接收邮件的人,则要求大小写敏感性也不够强健。 - zigg
3
我最沮丧的事情之一就是网站强制要求我用全小写字母编写电子邮件。我刚在Twitch.tv的支持网站上提出了一条愤怒的评论,就是关于这个问题。他们甚至阻止用户在他们的网站上输入大写字母。虽然我知道我的电子邮件服务器将它们视为大小写不敏感的,而且我也知道RFC规定它是区分大小写的,但是网站永远不应该对任何一种情况做出任何假设,并且应该简单地通过用户输入的内容。啊!真的好烦人!!! - Mark A. Donohoe
2
个人而言,当我在某处输入我的电子邮件时,我更喜欢使用混合大小写,这样更易读。例如:JamesTKirk@domain.com(不是我的真实地址)。即使我收到的电子邮件没有大写字母,我也会这样做。 - PaulOTron2000
3
作为一名软件开发者,您希望您的服务能够正确处理大小写敏感的电子邮件,成为那些做对了这个问题的少数服务之一。 - Klesun
在Thunderbird中,当我输入电子邮件地址时,它会自动转换为小写字母。 - sound wave
雷鸟是一只古老的庞然大物。如果它在处理非拉丁文字的电子邮件时出现问题,我不会感到惊讶。 - undefined

50

我来晚了,但是我有些不同的想法要说...

>> "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


11
对于精确匹配而言,使用LIKE/ILIKE是一个糟糕的想法。试想一封包含“%”或更可能包含“_”的电子邮件。 - ThiefMaster
27
你的观点很好!但是你的例子中SQL注入有点破坏了它 :( - epelc
9
@epelc:完全同意。这种查询构建方式不应该被写在任何地方,即使只是作为一个例子。 - xDaizu
2
@l3x,虽然我不像其他人那样强烈反对上面的示例代码,特别是因为你已经将其标注为伪代码,并且仅用于说明目的,但也许可以通过将query = ...行替换为简单的query = // 插入区分大小写/不区分大小写搜索注释来解决以上所有评论,这样可以将讨论从SQL注入主题转移到你想要展示的内容上。换句话说,保持逻辑性,而非实现性。这将使批评者安静下来。 - Mark A. Donohoe
1
我反对使用“电子邮件”一词来表示电子邮件地址。 - AmigoJack
1
如果您已经在使用PostgreSQL,那么只需将email_address列的类型设置为citext即可。 - jbg

21

IETF开放标准RFC 53212.4. 通用语法原则和事务模型

SMTP实现必须注意保留邮箱本地部分(即用户名)的大小写。特别地,在某些主机上,“smith”用户与“Smith”用户是不同的。

邮箱域名遵循普通DNS规则,因此不区分大小写。


12
依据 @l3x 的说法,这取决于情况。
明显有两组常见情况,其中正确答案可能不同,并且还有一种较不常见的情况:
a) 作为用户发送私人电子邮件:
很少有现代电子邮件系统实现对大小写的敏感性,因此您可以忽略大小写并选择任何您喜欢的大小写。不能保证所有邮件都会被送达,但是会受到影响的邮件数量如此之少,以至于您不应该担心。
b) 开发邮件软件:
请参阅RFC5321底部的2.4节摘录。
在开发邮件软件时,您希望符合RFC。如果愿意(而且可能应该) ,您可以使自己的用户电子邮件地址不区分大小写。但为了符合RFC的规定,您必须将外部地址视为区分大小写。
c) 作为员工管理商业拥有的电子邮件地址列表:

可能同一个电子邮件收件人会以不同的大小写添加到列表中,尽管地址在技术上是不同的,但可能会导致收件人收到重复的电子邮件。在这种情况下,你可以像情况a)一样处理,很可能可以将它们视为重复项并删除重复的条目。然而,最好将其视为特殊情况,通过向两个地址发送“提醒”邮件来询问他们的电子邮件地址是否准确。

从法律角度来看,如果您未经两个地址的确认/许可而删除重复项,您可能会因为泄露私人信息/身份验证给一个未经授权的地址而被追究责任,仅仅是因为两个实际上是不同收件人的地址却具有相同但大小写不同的地址

RFC5321 2.4 中的摘录:

邮箱的本地部分必须被视为区分大小写。因此,SMTP 实现必须小心保留邮箱本地部分的大小写。特别地,对于某些主机,用户 "smith" 不同于用户 "Smith"。然而,利用邮箱本地部分的大小写敏感性会妨碍互操作性,因此不鼓励这样做。


3
为了完整性,RFC5321中的4.1.2节也提到:“虽然对于Local-part的上述定义相对宽松,但为了最大的互通性,期望接收邮件的主机应避免定义需要(或使用)Quoted-string形式或者大小写敏感的Local-part的邮箱。对于任何需要生成或比较Local-part的目的(例如针对特定邮箱名称),所有引号表达形式都必须视为等效,并且发送系统应尽可能传输使用最少引用的形式。” - Jim Ratliff
1
很有趣。这意味着引用和大写具有类似的应该/不应该/必须的要求。 - zaTricky

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