摘要:本文的目的是通過應用Linux系統集成的網絡服務和應用軟件,快速實現基于Web的電 子郵件系統。作者只是普通的Linux的愛好者,嘗試將所學到的一點Linux知識進行綜合應用,希望對大家有所啟發。
免費Webmail是目前ISP普遍提供的一項服務,它最大的優點就是方便,用戶只需要通過瀏覽器就能夠完成郵箱申請、發送郵件、接收郵件等功能;同樣,由于Webmail的出現,大大提高了ISP的站點訪問數量,提高了站點的知名度,所以是一個兩全其美的好東西。不過,大容量的Webmail服務器由于其系統的復雜性和可靠性要求,價格比較昂貴,不太適合 Intr.net環境的需要。
Linux作為一個優秀的網絡操作系統,它的發行版本中集成了大量的網絡應用軟件,如Web服務器(apache)、Ftp服務器(wu-ftp)、郵件服務器(sendmail+imap4)、SQL 數據庫(postgresql)等,可以快速的構建Intranet環境,并且也有精致的郵件收發程序 (metamail)和強大的Web服務器端開發工具(PHP3)。當你配置好sendmail并激活imapd 后,你的Linux用戶都可以使用Outlook等客戶端軟件進行郵件收發,所以,通過將它們集 中進行應用,便可以實現一個簡單的Webmail服務器的功能。
一、Webmail的主要功能和我們使用的方法是:
1、郵箱申請:使用PHP3中的exec以root身份執行useradd和edquota命令建立系統用戶并設置用戶的磁盤限額,并將用戶保存到postgresql的用戶表中,申請到的郵件地址將是形式。如果你只希望提供用戶通過Web申請郵箱的功能,讓他們使用Outlook之類的郵件客戶程序進行郵件處理,那么目的就已經達到了。
2、編輯郵件:使用HTML的form構建編輯域,并利用IE4和Netscape 3支持的“file”類型,提供郵件附件的上傳功能。
3、發送郵件:使用PHP3中的exec執行metasend提供的發送功能,實現對郵件的編碼和發送。
4、接收郵件:使用PHP3中提供的強大的imap支持函數集實現郵件數據的接收和解碼工作以及收件箱的管理,并將郵件的附件拆分成臨時文件放入ftpd的匿名訪問目錄中,并利用附件的描述信息生成超鏈,方便客戶端的下載。
5、帳號管理:使用PHP3中的exec執行passwd和deluser命令實現用戶的口令更改和郵箱的刪除功能。
二、以下分別說明實現上述功能的具體方法和注意事項。
1、支持imap和postgresql的PHP3模塊的編譯我們使用的RedHat 5.1中沒有包含PHP3支持,并且一般的PHP3執行包都沒有預先編譯imap支持,要充分使用這優秀的Web服務器端開發工具,最好到wwwphp.net 上下載源程序,實際上它非常精致總共不到2M,作為一個具有150,000個網站用戶使用認可的(PHP3幫助文檔中的統計數據)并在Linux世界中獲獎的軟件,它的源代碼應該 被所有的發行商所選擇。由于,PHP3的imap支持需要c-client庫和相關的頭文件,所以應先解開imap4的源程序包進行編譯。注意編譯imap4時使用make lnx生成的Makefile 文件中可能不能發現crypt,你只需要在連接庫的選項中加上lcrypt即可。一般在按照源程序的說明文件編譯時出錯,多是因為Makefile文件的include或是lib的目錄與本地的目錄不匹配。
2、upload支持附件(attachment)是郵件的一個重要組成部分,要把客戶端的文件上載到服務器端進行處理,需要客戶端的瀏覽器和服務器端都具有支持。在PHP3的幫助文檔中有關 于upload處理的說明和例子,并且IE4和Netscape都已經很好的支持這一功能,可惜我們沒有在任何關于HTML的書籍中看到類似的介紹。
3、metasend簡介Linux環境下一般使用的郵件收發程序是mail,但它不支持MIME編碼,并且不能設置發送地址,不適合Webmail的需要。metasend是一個支持MIME標準的郵件發送程序,并且可以設置發送端的用戶地址和編碼方式,非常適合做shell命令,它包含在 metamail包中,只有15K。直接使用它作為后端的郵件發送程序,實現MIME編碼可有效的降低程序的復雜度。由于PHP3可以快速處理form數據并利用exec調用系統的外部程序,所以,有效的利用Linux提供的大量應用軟件配合靈活的輸入輸出重定向作為CGI程序,不失為一種簡便方法,并且這也是Linux系統中大量字符界面或是命令行處理程 序的強項。
4、郵件附件的下載由于瀏覽器限制了對本地文件系統的寫入功能,要下載文件最自然的方法便是通過瀏覽器直接使用FTP的匿名訪問。由于Linux系統集成了wu-ftpd,所以把郵件的附件以臨時文件的方式放入ftpd的匿名訪問的子目錄中,并只允許nobody進行寫,而服務器端在顯示郵件信息時利用郵件頭中附件描述信息生成超鏈,能夠簡單而自然的解決這一問題。
5、PHP3中的imap和postgresql支持簡介PHP3實際是Web服務器和大量C庫函數的中介層,并且對處理form提交的數據能力進行了擴充,另外,還具有和C相似的風格,所以能夠簡捷高效的實現多種復雜功能。PHP3含有38個對imap提供相關支持的函數,而這些函數是建立在對imap4協議的標準客戶開發庫的支持的基礎上,其功能和效率是完全可以信賴和保證的,利用這些函數可以快速地連接imapd、驗證地址、接收郵件、拆分郵件、解碼郵件、管理郵箱等。
我們把postgresql數據庫主要用于驗證用戶和跟蹤用戶產生的臨時文件上,功能比較簡單,但由于有了基于SQL的數據庫在處理并發訪問上便不用擔心沖突。PHP3支持許多數據庫系統,當然需要有它們的基于Linux的C開發庫和頭文件,postgresql作為集成在發行包中的面向對象的SQL數據庫并且其psql客戶程序非常友好自然成為首選。PHP3提供的32個postgresql支持函數,且有豐富的文檔和例子,要實現Web數據庫不是難事,主要注意在每個表中對nobody進行授權。PHP3采用的數據庫存取方式幾乎沒有使用ODBC,而是直接利用各數據庫提供的開發庫,不過它使用了相近的函數調用格式,同樣比較方便。PHP3的文檔中有些地方出現返回值類型錯的問題,只要在使用前稍微測試以下就可以避免。
6、sendmail配置sendmail是廣泛使用的郵件傳輸系統,其歷史悠久、功能強大,但是配置比較復雜。不過,可以利用linuxconf啟動其基本的功能。注意,在多郵件服務器的情況下,DNS 的MX記錄起非常關鍵的作用,注意在你的DNS中為每個域都指定一個明確的MX記錄。在使用linuxconf配置sendmail時選擇不立即傳送郵件和較短的隊列處理時間,以減小客戶端由于輸入錯誤的郵件地址而出現的等待,另外,直接編輯/etc/rc.d/init.d/sendmail 設置較短的超時時間有利于提高Intranet環境下的效率。實際上,深入的了解sendmail 提供的功能是建立強大郵件系統的好辦法。
7、安全考慮
由于我們的Webmail系統的用戶是Linux的系統用戶,為確保安全,不能賦予其直接登錄的權限,即指定一個不存在的shell。由于在創建用戶、修改口令、刪除帳號時都使用了root帳號,所以對其口令文件需要隱藏,最好取消telnet 服務或者設置信任主機的范圍。對于系統原有的帳號,可以不作為webmail的 用戶帳號,避免由于Webmail出錯導致關鍵信息丟失。
由于郵件系統是面向多用戶,所以必須提供磁盤限額控制,并縮短超限的時間, 在上傳文件時注意設置其文件傳輸的最大長度。同時,為了防止用戶中途退出, 而不能刪除生成的臨時文件,可以為root設置cron任務對過期的臨時文件進行 處理。
禁用nobody和ftp帳號(缺?。?
8、性能優化
如果發現你的Webmail處于重載的情況,你可以把集成的數據庫服務 (postgresql)、域名服務器(named)與Web服務器分離,它們都是可以通過網絡進行訪問的。
同樣,你可以把用戶分散到多個郵件服務器上滿足用戶的需要,畢竟,Linux是一個要求較低且非常廉價的系統。 另外,你可以打開metasend的源程序,參考直接用PHP3實現郵件的直接發送,避免調用SHELL程序,應該能夠提高性能。同樣,可以使用Mysql替換postgresql。
以上簡單的介紹了我們的Webmail實現方法和注意事項,這僅僅是我們在對Linux系統了解得非常膚淺的情況下的簡單解決方案,并沒有從系統性能的角度進行周密考慮,并不能代表Linux作為一個優秀的網絡系統的真正實力,我們只是從簡捷和方便性上進行了思考,因為我們感覺到快速實現其基本功能,有利于我們更好的學習和使用Linux。不過,我們還是深深地體會到Linux系統和它集成的大量軟件的魅力和實力,同樣深深地體會到它給我們自己在思考和解決問題時帶來的變化,它給了我們更多選擇的機會。的確,它給我們的已經遠遠超過了我們所期望的