摘要:以當(dāng)前流行的開(kāi)源軟件和操作系統(tǒng)為基礎(chǔ),介紹了兩種服務(wù)器端電子郵件服務(wù)的實(shí)現(xiàn)方式。涉及到服務(wù)器配置以及軟件模塊的編寫(xiě)。并分析了不同方式實(shí)現(xiàn)電子郵件服務(wù)的優(yōu)劣。
關(guān)鍵詞:電子郵件服務(wù);Sun Solaris10;Perl;Sendmail
中圖分類(lèi)號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)31-0815-02
Implement Email Service on Solaris 10
PAN Lei
(College of Software Engineering,Southeast University,Nanjing 210096,China)
Abstract: This paper introduces two ways to implement Email Service based on Open Source software and Open Source operating system. This paper contains Server configuration and module programming, and analysis the Pros and Cons of the two different approaches.
Key words: mail service; sun solaris10; perl; sendmail
1 引言
隨著互聯(lián)網(wǎng)的越發(fā)普及,各種網(wǎng)絡(luò)應(yīng)用已經(jīng)成為人們辦公和學(xué)習(xí)必不可少的一部分。人們最常用的電子郵件提供了比傳統(tǒng)書(shū)信更加簡(jiǎn)捷、方便、迅速的服務(wù)。其應(yīng)用十分廣泛。各種公文、信件、照片、賀年卡甚至游戲存檔,都被人們用電子郵件寄出。收發(fā)電子郵件已經(jīng)從少數(shù)人使用的時(shí)尚變成了大多數(shù)人日常工作生活的一部分。現(xiàn)在各個(gè)電子郵件服務(wù)提供商都推出了免費(fèi)的大容量電子郵箱,這些優(yōu)惠措施使得電子郵件更加流行。
電子郵件是普通人都使用的東西,而在她背后的電子郵件服務(wù)則不同了,說(shuō)到電子郵件服務(wù),人們常常想到的就是大型服務(wù)器,光纖等等。本文以Sun公司的Unix操作系統(tǒng) Solaris10作為服務(wù)器平臺(tái),使用用sendmail以及Perl模塊實(shí)現(xiàn)企業(yè)級(jí)電子郵件服務(wù),以展示電子郵件服務(wù)的原理。
2 郵件服務(wù)器系統(tǒng)蓋述
通常的電子郵件系統(tǒng),需要用戶(hù)登陸,然后提供給用戶(hù)一個(gè)圖形化用戶(hù)界面,讓用戶(hù)可以瀏覽郵件,撰寫(xiě)郵件。這個(gè)過(guò)程可以由電子郵件客戶(hù)端軟件實(shí)現(xiàn),例如:Microsoft Outlook、Thunderbird等等。大多數(shù)在線郵件收發(fā)用戶(hù)界面是由CGI(Common Gateway Interface,通用網(wǎng)關(guān)接口)實(shí)現(xiàn)的。當(dāng)CGI受到HTTP連接時(shí),返回相應(yīng)的HTML頁(yè)面給用戶(hù)的網(wǎng)頁(yè)瀏覽器,當(dāng)用戶(hù)發(fā)送郵件時(shí),CGI調(diào)用郵件發(fā)送模塊,進(jìn)行電子郵件的發(fā)送。當(dāng)有郵件到達(dá)時(shí),郵件服務(wù)器將用戶(hù)的郵件暫時(shí)存儲(chǔ)在服務(wù)器的硬盤(pán)空間上,以便用戶(hù)下次登陸的時(shí)候?yàn)g覽。
3 應(yīng)用技術(shù)簡(jiǎn)介
本文實(shí)現(xiàn)電子郵件服務(wù)的主要工具和技術(shù)包括Perl模塊,Sun公司的Solaris10操作系統(tǒng),Sendmail核心郵件服務(wù)和相應(yīng)的電子郵件服務(wù)器。下面對(duì)各個(gè)技術(shù)進(jìn)行介紹。
3.1 Perl
Perl 是一種腳本語(yǔ)言,與常見(jiàn)的編程語(yǔ)言不同,腳本語(yǔ)言不需要預(yù)先編譯,而是在運(yùn)行的時(shí)候進(jìn)行解釋。Perl最初只是Unix系統(tǒng)管理員的一個(gè)常用工具,被用在無(wú)數(shù)的小任務(wù)中。但如今,它逐步被廣泛地應(yīng)用于 Web 編程、數(shù)據(jù)庫(kù)處理、XML 處理以及系統(tǒng)管理中。Perl有著強(qiáng)大的regular expression和靈活的語(yǔ)言結(jié)構(gòu)。在Perl中實(shí)現(xiàn)某個(gè)功能常常有多種方式。Perl被所有 Unix(包括Linux)捆綁在一起作為標(biāo)準(zhǔn)部件發(fā)布,就連Windows平臺(tái)下也有Active Perl平臺(tái)。由此可見(jiàn)Perl的優(yōu)良跨平臺(tái)性和兼容性。
3.2 Sun Solaris 10
Solaris 10是一款多任務(wù)處理的分布式企業(yè)級(jí)網(wǎng)絡(luò)操作系統(tǒng),是Unix操作系統(tǒng)的一個(gè)分支,最初運(yùn)行在SUN公司的SPARC系列芯片之上,在2005年被宣布開(kāi)放源代碼。Solaris操作系統(tǒng)一直以穩(wěn)定和強(qiáng)健的性能在Unix服務(wù)器領(lǐng)域占有重要的地位。它有著經(jīng)過(guò)優(yōu)化過(guò)的TCP/IP協(xié)議棧和良好的安全性。美國(guó)國(guó)防部使用的操作系統(tǒng)就是Solaris的一個(gè)分支,更可見(jiàn)其性能的優(yōu)秀。
3.3 Sendmail
Sendmail是Unix/Linux系統(tǒng)中的默認(rèn)郵件傳輸代理(MTA)。Sendmail 的任務(wù)是從郵件用戶(hù)代理 (MUA) 接收郵件然后根據(jù)配置文件的定義把它們送給配置好的的寄送程序。Sendmail 也能接受網(wǎng)絡(luò)連接,并且發(fā)送郵件到本地郵箱或者發(fā)送它到其它程序。Sendmail本身也是開(kāi)源程序。
3.4 SMTP Server
SMTP(Simple Mail Transfer Protocol)即簡(jiǎn)單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來(lái)控制信件的中轉(zhuǎn)方式。SMTP協(xié)議屬于TCP/IP協(xié)議族,它幫助每臺(tái)計(jì)算機(jī)在發(fā)送或中轉(zhuǎn)信件時(shí)找到下一個(gè)目的地。通過(guò)SMTP協(xié)議所指定的服務(wù)器, 就可以把E-mail寄到收信人的服務(wù)器上了,整個(gè)過(guò)程只要幾分鐘。SMTP服務(wù)器則是遵循SMTP協(xié)議的發(fā)送郵件服務(wù)器,用來(lái)發(fā)送或中轉(zhuǎn)用戶(hù)發(fā)出的電子郵件。
4 實(shí)現(xiàn)
本文通過(guò)兩種方式實(shí)現(xiàn)電子郵件服務(wù)
3.1 方式一:使用Solaris的Sendmail應(yīng)用程序
使用Solaris下的Sendmail應(yīng)用程序需要網(wǎng)絡(luò)管理員配置好Mail Server, Mail Host和Mail Gateway。由于Mail Service需要DNS服務(wù),所以,也應(yīng)該在相應(yīng)的服務(wù)器上開(kāi)啟DNS服務(wù)。Mail Server用于保存用戶(hù)的電子郵件,提供信箱功能。Mail Host用于解析電子郵件的地址。Mail Gateway用于將電子郵件發(fā)送到不同于本域的其他地址,在和外部網(wǎng)絡(luò)通訊中是必需的。在小型企業(yè)應(yīng)用中Mail Server, Mail Host, Mail Gateway可以是同一臺(tái)服務(wù)器。圖1給出了通常的電子郵件服務(wù)器的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。
在只有一臺(tái)服務(wù)器提供Mail Service時(shí),可以使用/etc/mail/aliases文件作為電子郵件傳送的依據(jù),可以不使用DNS域名服務(wù)。在使用DNS或是LDAP域名服務(wù)時(shí),需要在/etc/hosts文件中提供用戶(hù)主機(jī)、域名信息。此時(shí)/var/mail目錄用于存儲(chǔ)用戶(hù)的郵件,這個(gè)目錄需要被共享以便用戶(hù)進(jìn)行讀寫(xiě)操作。共享該目錄需要服務(wù)器啟動(dòng)NFS服務(wù)。如果希望給Mail Server綁定多個(gè)IP地址,需要設(shè)置虛擬主機(jī)。還可以讓SMTP使用TLS(Transport Layer Security)以提供更安全的電子郵件服務(wù)。
Mail Client端需要掛載服務(wù)器端的/var/mail目錄,并且需要將服務(wù)器信息存在/etc/hosts文件中,這些操作都需要先關(guān)閉Sendmail服務(wù),在操作完成后在開(kāi)啟服務(wù)。Host-name可以用Sun Solaris提供的check-hostname應(yīng)用程序確認(rèn)。[1]
在Sendmail應(yīng)用搭建好后就可以利用Perl程序通過(guò)使用Sendmail以提供電子郵件服務(wù)了。由于Perl可以很快潔的編寫(xiě)CGI因此,通過(guò)Perl調(diào)用Sendmail是可以實(shí)現(xiàn)最有性能的Solaris郵件服務(wù)器。這個(gè)功能可以通過(guò)一個(gè)模塊來(lái)實(shí)現(xiàn)。模塊的輸入是郵件的收信人,郵件的寄信人,郵件的主題,郵件的內(nèi)容( sendEmail(TO Email, From email, SUBJECT of email, BODY of email))。模塊內(nèi)部通過(guò)Perl的文件操作符open將sendmail應(yīng)用程序打開(kāi),$sendmail = ‘/usr/lib/senmail’; open(MAIL,”|$sendmail –oi -t”); 然后利用Perl的print函數(shù)向文件句柄傳入?yún)?shù),例如print MAIL “From:$from\”; print MAIL”Subject:$Subject\”。再用文件操作符close關(guān)閉打開(kāi)的sendmail句柄。Sendmail會(huì)自動(dòng)和Mail Server聯(lián)系,然后將郵件發(fā)送出去。對(duì)HTML電子郵件的支持需要向MAIL句柄的’Content-Type’賦值’text/html;charset=”iso-8859-1”’,如果希望郵件服務(wù)提供抄送、秘密抄送、回復(fù)或是附件功能,只需再增加相關(guān)接口,即可實(shí)現(xiàn)。
3.2 方式二:使用Perl API Mail::Sendmail
第二種實(shí)現(xiàn)方式是采用Perl模塊Mail::Sendmail。需要在www.cpan.org下載,這個(gè)模塊可以拷貝到Solaris下Perl的模塊目錄中被直接使用。這個(gè)模塊是獨(dú)立于Unix Mail Service的,沒(méi)有用到Unix中的Sendmail應(yīng)用程序,它的名字中有Sendmail純屬巧合。它提供的接口和第一個(gè)實(shí)現(xiàn)方式很像,它也提供了抄送和秘密抄送等功能。不過(guò),由于郵件服務(wù)都需要相應(yīng)的SMTP服務(wù)器,這個(gè)模塊也不例外,它需要手工將SMTP服務(wù)器的地址寫(xiě)到sendmail.pm文件或是應(yīng)用程序的配置文件中,可以填寫(xiě)SMTP的服務(wù)器域名,也可以是它的IP地址。不過(guò)這個(gè)模塊不支持SMTP認(rèn)證,所以只能使用不需要SMTP認(rèn)證的電子郵件服務(wù)器進(jìn)行郵件發(fā)送。
這個(gè)模塊需要先被引入項(xiàng)目工程中use Mail::Sendmail,然后需要修改$mail(SMTP)后面的SMTP 服務(wù)器地址。再將相關(guān)參數(shù)用Hash表的形式傳給%mail變量,例如%mail=(To => ‘you@a.com’, From => ‘me@b.com’, Message =>”Message to send”); 然后將%mail作為參數(shù)傳遞給sendmail模塊即可。其他的實(shí)現(xiàn),如抄送、HTML郵件支持和方式一的實(shí)現(xiàn)類(lèi)似。
這個(gè)應(yīng)用也可以寫(xiě)道Perl實(shí)現(xiàn)的CGI中,以提供郵件服務(wù)功能。
4 對(duì)比與總結(jié)
本文介紹的兩種郵件服務(wù)系統(tǒng)實(shí)現(xiàn)方式各有千秋。第一種實(shí)現(xiàn)比較復(fù)雜,第二種則非常快捷。不過(guò),由于現(xiàn)在互聯(lián)網(wǎng)上垃圾郵件橫行,很難找到不需要SMTP認(rèn)證的Mail Host,所以第二種的應(yīng)用很有局限性。不過(guò)在有些情況下,只需要簡(jiǎn)單的郵件功能要求快速開(kāi)發(fā),第二種實(shí)現(xiàn)方式還是值得考慮的。第二個(gè)模塊還有一個(gè)不足,就是由于Perl文件是動(dòng)態(tài)翻譯的,所以所有數(shù)據(jù)都存在內(nèi)存里,當(dāng)應(yīng)用程序使用者很多的時(shí)候,不適于發(fā)送大的附件。對(duì)比第二種實(shí)現(xiàn)方式,第一種方式則可以廣泛使用各種情況。實(shí)際上,各大電子郵件提供商使用的也都是第一種實(shí)現(xiàn)方式。不過(guò)第一種方式需要額外的網(wǎng)絡(luò)管理員的參與,還牽扯到大量的網(wǎng)絡(luò)配置、服務(wù)器配置工作,不適用于小型項(xiàng)目和小規(guī)模公司的應(yīng)用。
本文涉及到的兩種郵件服務(wù)實(shí)現(xiàn)方式都被應(yīng)用于Ericsson軟件開(kāi)發(fā)部門(mén)的接口變更管理工具中。實(shí)現(xiàn)的功能穩(wěn)定可靠。
參考文獻(xiàn):
[1] Solaris System Administration Guide:Network Services[DB].Sun Microsystems,Inc.
[2] Allam E,Assmann C,Shapiro G N.Sendmail Installation and Operation Guide[DB].Sendmail Inc,Version8.708.
[3] Phoenix T,Randal L Schwartz,Learning Perl[M].3rd ed.O’Reilly,2001.
[4] Christiansen T,Torkington N.Perl Cookbook[M].O’Reilly,1998.
[5] Sun Solaris Online Documentation[DB].Sun Microsystems,Inc.