1. 程式人生 > >Linux shell驗證郵箱的有效性

Linux shell驗證郵箱的有效性

最近又好多天沒總結了,這兩天偶然間網上聽了一節課用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郵箱的基本格式:

[email protected]

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_-]+)+$

注:$表示匹配結尾。

最後完整的郵箱格式[email protected]正則表示式為:

^[a-zA-Z0-9_-\.\+][email protected][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_-\.\+][email protected][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。