邮件地址的定义(Email Address Specification)

简介:

电子邮件用了N年了,也知道邮件地址的格式就是“用户名@域名”的格式,但是还没真正研究过什么是一个合法的邮件地址,为此特别查了一下相关的协议。

 
邮件地址用于Internet上的邮件传输,在RFC5321和RFC5322 定义。实际上这两个RFC上修订后版本了,最初的版本是RFC821和RFC822。
 
一个邮件地址,例如jsmith@gmail.com,由两部分组成。“@”前面的称为local-part,一般就是收件人的用户名,“@”之后为domain name,邮件系统就是通过域名来发送邮件。local part最大长度为64个字符,domain name最大长度为253个字符,而整个邮件地址长度不能超过254个字符。实际上,协议 定义是最长256个字符,但是因为邮件地址在用于接收或回复地址时,还会在前后加上"<>",所以只能是254了。
 
域名的定义就不多说了,主要是对local part部分进行说明。
 
local part由以下字符组成:
  • 大小写字母(A-Z,a-z)
  • 数字(0-9)
  • 特殊字符(! # $ % & ' * + - / = ? ^ _ ` { | } ~),但其很多字符被认为是不安全的字符,很少在实际邮件系统被使用。
  • 点字符".",但这个字符不能作为loca part的开始和结束字符,也不能出现连续两个(例如john..smith)
 
另外,local part可以使用quoted-strings,也就是引号包括起来的字符串,例如"John Smith"@gmail.com。quoted-strings被认为是连续不可分隔的内容,其 可以出现空格字符。但实际上这种方式通常没有使用,并且在RFC5321 也警告最好不要使用这种方式,否则可能在发送和接收邮件时出现问题。
 
在RFC ,local part是大小写区分的,但这个实际上要看邮件服务器的具体实现,有一些邮件服务器是不区分大小写的。甚至,有些邮件系统规定了只允许使用有限的 特殊字符(例如只允许使用"-"、"_"和"."),这些都是由具体的邮件系统实现来确定的。例如在gmail ,local part 允许出现".",但是服务器会自动忽略掉所有的"."字符,因此如果存在一个local part为your.username的帐号,那么your.user.name或者yourusername这样的帐号都不会允许被创建。
 
RFC也试图对邮件地址进行国际化,例如“张三@浙商银行”这样的形式,但是,实际情况是不允许使用这样的邮件 地址的,现有的邮件服务器不会处理这样的地址。

本文转自 拾瓦兴阁 51CTO博客,原文链接:http://blog.51cto.com/ponyjia/1129833

相关文章
|
C++ Python
LeetCode 929. Unique Email Addresses
LeetCode 929. Unique Email Addresses
68 0
|
Python
Python: email-validator验证Email地址
Python: email-validator验证Email地址
126 0
solidity中transfer异常"send" and "transfer" are only available for objects of type address
solidity中transfer异常"send" and "transfer" are only available for objects of type address
411 0
|
Java 开发者
email 验证|学习笔记
快速学习 email 验证
email 验证|学习笔记
SAP Spartacus shipping address页面请求2 - Put Address
SAP Spartacus shipping address页面请求2 - Put Address
106 0
SAP Spartacus shipping address页面请求2 - Put Address
workflow and email in QD3 - IS_INBOX_USER method
workflow and email in QD3 - IS_INBOX_USER method
workflow and email in QD3 - IS_INBOX_USER method
谋杀 Email
作为新来者,凭着技术的进步、企业提升效率的需求、大厂们留下的中小客户市场切口,Zoom、Slack们高歌猛进,抢夺“Email们”的市场,在“WinTel大厂”们没能涉足的市场切下一块蛋糕。但在未来,当深入到大厂腹地,深入大型客户市场,新老企服软件公司的一战似乎不可避免。面对这些老玩家,他们能成功么
223 0
|
区块链 开发者 存储
solidity 0.5中address payable和address的区别?
在Solidity 0.5.x中,地址类型被细分为address和address payable,那么,这两种类型有什么区别?如何将address类型转换为address paybale类型,或者反向转换?本文将给出这些问题,并指出Solidity进行地址类型细分的目的。
1472 0