邮箱规则整理

QQ邮箱@qq.com, foxmail邮箱@foxmail.com

  • 3-18个英文,数字,点,减号,下划线组成
  • 首字母只能是英文字符
  • 点号,减号,下划线不能连续出现
  • 末位只能是字母或者数字
  • 还有qq账户开通的邮箱,纯数字构成,5-11位
  • 手机号

gmail邮箱@gmail.com

  • 6-30个字母,数字,点号
  • 首位以及末位只能为数字或字母
  • 点号不能连续
  • 用户名长度为8位或者超过8位的时候必须包含至少一个字母

163邮箱

手机邮箱@163.com

同验证手机号规则

  • 可用号段(130-139,140-149,150-159,170-179,180-189)
  • 长度为11位

字母邮箱@163.com, @126.com

  • 6-18个字符,可由字母,数字,下划线组成
  • 首位必须是字母
  • 末位必须是字母或者数字

163 vip邮箱@vip.163.com, 126 vip邮箱@vip.126.com, 188邮箱@188.com

  • 3-20个字符,可由字母,数字,点号,减号,下划线组成
  • 首位必须是字母
  • 末位必须是字母或者数字

188 vip邮箱@188.com

  • 4-20个字符,可由字母,数字,点号,减号,下划线组成
  • 首位必须是字母
  • 末位必须是字母或者数字

其他邮箱通用规则

  • 以字母,数字,点号,下划线,减号构成
  • 不能以点号,下划线,减号开头或者结尾
  • 同域名规则

域名规则

  • 由英文字母,阿拉伯数字,横杠组成
  • 每一个标号不超过63个字符
  • 大小写无区别
  • 由多个标号组成的完整域名总共不超过255个字符

按照以上规则,简单实现的一个模块如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/**
* 邮箱验证
*/


module.exports = (function validate(){

// 去除输入内容的首位空格
function trim( inputVal ){
var trimPattern = /\s*(.*)\s*/;
return trimPattern.exec( inputVal )[1];
};
// 检查输入文本的长度是否在规定范围内
function lenTest( min, max, inputVal ){

var trimdinputVal = trim( inputVal ),
len = trimdinputVal.length,
result = {};

if( len >= min && len <= max ){
result.status = true;
}else{
result.status = false;
result.message = "长度不符合要求";
}
return result;
};
function validateMobilephone( inputVal ){
var mobilephonePattern = /([130-159]|[170-189])(\d){8}/,
result = {};
if( mobilephonePattern.test( inputVal ) ){
result.status = true;
}else{
result.status = false;
result.message = "无效的手机号码";
}
return result;
};
function validateQQMail( inputVal ){
var onlyNumPattern = /\d+/,
result = {};

/*
* 首先验证是不是由纯数字构成,如果是,只有两种可能,是qq号对应的邮箱和手机号对应的邮箱,因为目前qq号最长恰好是11位,而手机号是固定11位长度,所以可以不特别验证是否是手机号码
*/

if( onlyNumPattern.test( inputVal ) ){
if( lenTest( 5, 11, inputVal ).status ){
result.status = true;
}else{
result.status = false;
result.message = "不是有效的qq邮箱";
}
}else{
/*
* 对于并非全部由数字构成的情况:
* 除首尾字符外,分为四种情况,设字母或者数字为1,点号,下划线,横杠为0,则有1开头,1结尾,1开头0结尾,0开头1结尾,0开头0结尾
* 第一次思考
* 1开头,1结尾型为([a-z]|[0-9])+(\.|-|_)*([a-z]|[0-9])+
* 1开头,0结尾型为(([a-z]|[0-9])+(\.|-|_))+
* 0开头,1结尾型为((\.|-|_)([a-z]|[0-9])+)+
* 0开头,0结尾型为((\.|-|_)([a-z]|[0-9])+)+(\.|-|_)
* 第二次思考,上述四种正则可以简化为两种,1开头型的和0开头型的
* 1开头型(([a-z]|[0-9])+(\.|-|_){0,1})+([a-z]|[0-9])*
* 0开头型((\.|-|_)([a-z]|[0-9])+)+(\.|-|_){0,1}
*/

if( lenTest( 3, 18, inputVal ).status ){
var qqPattern = /[a-z]((([a-z]|[0-9])+(\.|-|_){0,1})+([a-z]|[0-9])*|((\.|-|_)([a-z]|[0-9])+)+(\.|-|_){0,1})[a-z|0-9]/;
if( qqPattern.test( inputVal ) ){
result.status = true;
}else{
result.status = false;
result.message = "不是有效的qq邮箱"
}
}else{
result.status = false;
result.message = "不是有效的qq邮箱"
}
}
return result;
};
function validateGmail( inputVal ){

var lentest = lenTest( 6, 30, inputVal ),
result = {};

if( lentest.status ){
/*
* 正则表达式基本等同于qq邮箱验证中并非全部由数字构成的情况的正则表达式
*/

var gmailPattern = /([a-z]|[0-9])((([a-z]|[0-9])+\.{0,1})+[a-z|0-9]*|(\.[a-z|0-9]+)+\.{0,1})([a-z]|[0-9])/;
if( gmailPattern.test( inputVal ) ){
result.status = true;
}else{
result.status = false;
result.message = "不是有效的gmail邮箱";
}
}else{
result = lentest;
}
return result;
};
function validate163Mail( inputVal, provider ){
var lentest,
mailPattern = /[a-z]([a-z]|[0-9]|_)([a-z]|[0-9])/,
result = {};

switch( provider ){
case '163.com' :
case '126.com' :
lentest = lenTest( 6, 18, inputVal );
break;
case 'vip.163.com' :
case 'vip.126.com' :
lentest = lenTest( 3, 20, inputVal );
break;
case '188.com' :
lentest = lenTest( 4, 20, inputVal );
break;
default :
result.status = false;
result.message = "不是有效的网易邮箱";
}

if( lentest.status ){
if( mailPattern.test( inputVal ) ){
result.status = true;
}else{
result.status = false;
result.message = "不是有效的网易邮箱";
}
}else{
result.status = false;
result.message = "不是有效的网易邮箱";
}

return result;
};
function validateOtherMail( inputVal ){
var lentest = lenTest( 3, 30, inputVal ),
mailPattern = /([a-z]|[0-9])([a-z]|[0-9]|\.|-|_)([a-z]|[0-9])/;

if( mailPattern.test( inputVal ) ){
result.status = true;
}else{
result.status = false;
result.message = "无效的邮箱地址"
}
return result;
};
return {
// 输入是用户名+邮箱后缀的形式
email: function( inputVal ){
var strArr = trim( inputVal ).split( '@' ),
domainPattern = /(([a-z]|[0-9]|-){1,63}\.){1,3}([a-z]|[0-9]|-){1,63}/;

if( strArr.length > 2 ){
var result = {};
result.status = false;
result.message = "无效的邮箱地址";
return result;
}
var username = strArr[0], //获取用户名部分
provider = strArr[1]; //获取邮箱域名部分
if( strArr[1] === 'qq.com' ){
return validateQQMail( username );
}else if( strArr[1] === '163.com' || '126.com' || 'vip.163.com' || 'vip.126.com' || '188.com'){
return validate163Mail( username, provider );
}else if( strArr[1] === 'gmail.com' ){
return validateGmail( username );
}else if( domainPattern.test( strArr[1] ) ){
return validateOtherMail( username );
}
},
vacant : function( inputVal ){
var result = {};
if( trim( inputVal ) === '' ){
result.status = true;
}else{
result.status = false;
}
return result;
}
}
})();