Linux shell验证邮箱的有效性

来源:互联网 发布:sql中is null什么意思 编辑:程序博客网 时间:2024/05/04 08:53

最近又好多天没总结了,这两天偶然间网上听了一节课用shell脚本做爬虫。于是就从最基本的邮箱搞起来,今天总结了一些正则表达式的基础写了一个一个验证邮箱有效性的shell脚本。一下是总结内容:

电子邮箱(E-MAILBOX)是通过网络电子邮局为网络客户提供的网络交流的电子信息空间。电子邮箱具有存储和收发电子信息的功能,是因特网中最重要的信息交流工具。在网络中,电子邮箱可以自动接收网络任何电子邮箱所发的电子邮件,并能存储规定大小的等多种格式的电子文件。电子邮箱具有单独的网络域名,其电子邮局地址在@后标注。可以在后面随时的观看,信息等。—个完整的Internet邮件地址由以下两个部分组成,格式如下:登录名@主机名.域名

中间用符号“@”分开,符号的左边是对方的登录名,右边是完整的主机名,它由主机名与域名组成。其中,域名由几部分组成,每一部分称为一个子域(Subdomain),各子域之间用圆点“.”隔开,每个子域都会告诉用户一些有关这台邮件服务器的信息。

相关协议:邮件协议是指用户在客户端计算机上可以通过哪些方式进行电子邮件的发送和接收。常见的协议有SMTP、POP3和IMAP。

1.SMTP协议

SMTP称为简单邮件传输协议,可以向用户提供高效、可靠的邮件传输方式。SMTP的一个重要特点是它能够在传送过程中转发电子邮件,即邮件可以通过不同网络上的邮件服务器转发到其他的邮件服务器。

SMTP协议工作在两种情况下:一是电子邮件从客户机传输到邮件服务器;二是从某一台邮件服务器传输到另一台邮件服务器。SMTP是个请求/响应协议,它监听25号端口,用于接收用户的邮件请求,并与远端邮件服务器建立SMTP连接。

2.POP3协议

POP称为邮局协议,用于电子邮件的接收,它使用TCP的110端口,常用的是第三版,所以简称为POP3。

POP3仍采用C/S工作模式。当客户机需要服务时,客户端的软件(如OutlookExpress)将与POP3服务器建立TCP连接,然后要经过POP3协议的3种工作状态:首先是认证过程,确认客户机提供的用户名和密码;在认证通过后便转入处理状态,在此状态下用户可收取自己的邮件,在完成相应操作后,客户机便发出quit命令;此后便进入更新状态,将作删除标记的邮件从服务器端删除掉。到此为止,整个POP过程完成。

3.IMAP协议

IMAP称为Internet信息访问协议,主要提供的是通过Internet获取信息的一种协议。IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读,但IMAP能完成的却远远不只这些。IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后再作出是否下载的决定。

下面给出基础正则表达式和,扩展的正则表达式的基本字符和意义。

基础正则表达式字符串:

RE字符

意义与规范

^word

查找的字符串word在行首eg:grep –n ‘^#’ 1.txt 查找以#开头的行并列出行号。

word$

查找以word字符串为结尾eg:grep –n ‘!$’ 1.txt 查找以!结尾的行并列出行号。

.

代表一定有一个任意字符的字符eg:grep e.e 可以是eae,ebe,eze,中间必须要有一个字符

\

转义字符,将特殊符号的特殊意义去掉比如\\表示普通字符\

*

重复0-无穷多个前一个字符eg:grep a* 可以是a,aa,aaa…

[list]

从字符集合里面找出想要选取的字符eg:grep g[ld] 可以是gl,gd

[n1-n2]

从字符集合里面找出想要选取的字符范围[0-9]表示0-9任意一个数字字符

[^list]

从字符集合里面找出不要的字符串或者范围[^0-9]表示非0-9的数字字符串

\{n,m\}

连续n-m个前面的字符eg:grep go\{2,3\}d 可以是good,goood

注:正则表达式的特殊字符与一般在Linux命令行输入命令的通配符并不同。例如在通配符中的*代表0-无限多个任意字符,但在正则表达式中则是重复0-无限个前一个RE字符。

扩展正则表达式字符串:

RE字符

意义与规范

+

重复一个或一个以上的前一个RE字符eg:go+d可以是good,good,goooood…

?

零个或一个前一个RE字符

|

用或的方式找出数个字符串eg:gd|good,查找gd或者good

( )

找出组字符串eg:g(la|oo)d查找glad或者good

( )+

多个重复组的判断eg:A(xyz)+B可以是:AxyzB,AxyzxyzB,…

下面内容总结自:http://blog.csdn.net/dream_angel_z/article/details/45974033

1邮箱的基本格式:

username@hostname

username的值可以是字符数字以及以下特殊字符:

点号,单破折号,加号和下划线:. - + _,在有效的邮箱用户名中这些字符可以任意的组合形式出现。匹配模式为:

^([a-zA-Z0-9_\-\.\+]+)

^:表示整个模式以它前面的字符开头

+:表示前面的字符至少出现一次

[]:表示中括号内的符号任意组合都行。

\:转义字符,使一些特殊字符当做普通字符,比如.-+可能有特殊的含义,所以前面加上\:\-\.\+使这几个字符仅表示普通字符。

Hostname这部分是由一个域名和一个服务器名组成,服务器域名的命名也是有这严格的规则,只允许以下特殊字符出现:

点号和下划线

下面这一小段总结自博客:http://blog.csdn.net/make164492212/article/details/51656638

服务器名和域名都用点号分隔开,先指定服务器名,紧接着指定子域名,最后是后面不带点号的顶级域名。

匹配模式:

一般域名的规律为“[N级域名][三级域名.]二级域名.顶级域名”,比如“qq.com”、“www.qq.com”、“mp.weixin.qq.com”、“12-34.com.cn”,分析可得域名类似“** .** .**.**”组成。

“**”部分可以表示为[a-zA-Z0-9_-]+

“.**”部分可以表示为\.[a-zA-Z0-9_-]+

多个“.**”可以表示为(\.[a-zA-Z0-9_-]+)+

综上所述,域名部分可以表示为 [a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$

注:$表示匹配结尾。

最后完整的邮箱格式username@hostname正则表达式为:

^[a-zA-Z0-9_-\.\+]+@[a-zA-Z0-9_-\.]+(\.[a-zA-Z0-9_-]+)+$

本脚本本人亲自编写:

判断一个邮箱是否合法的shell脚本:

#!/bin/bash

#0912

#验证输入的邮箱是否符合格式

#wjp

echo "Please input your emailaddress:"

read email

n=`echo $email | egrep "^[a-zA-Z0-9_-\.\+]+@[a-zA-Z_-\.]+(\.[a-zA-Z0-9_-]+)+$"|wc -l`

if [ $n == 0 ];then

       echo "Your input is invalid."

else

       echo "Your email address is $email"

fi

注:因为之前一直用grep,怎么做就是出不来正确的结果,后来查了资料才知道,原来Linux的grep默认仅支持基础正则表达式,而验证邮箱用的表达式里面的+,(),是属于扩展的正则表达式。所以要用egrep或者是grep –E。





原创粉丝点击