FreeBSD連載(41):在FreeBSD上查看郵件

1999年12月14日 13:50 王波

在FreeBSD上查看郵件

  FreeBSD上的用戶可以通過mail程序來查看自己的Email,mail是一個最基本的交互式Unix 命令,可以運行在任何類型的終端上,然而使用它來處理郵件也很不方便。使用者常常安裝其他更 為便利的電子郵件客戶程序來處理自己的郵件,這些軟體有elm、mutt、pine,以及只用於X下的 netscape messager、kmail等。

  雖然基於X的郵件處理軟體比較方便和易於學習,然而通過網路遠程直接使用這些X程序比 較麻煩,不是任何電腦上都運行了X伺服器的。而幾乎所有的電腦系統中都支持telnet等字符 終端連接軟體,使用支持字符終端的郵件處理程序就使得使用者無論身在何處,只要連接到自己的 主機上就能處理自己的電子郵件。

  在遠端訪問自己的電子郵件的另一種方式是:首先在遠端的客戶機上安裝、配置電子郵件 軟體,再使用這些軟體訪問自己主機上的郵件。這些遠程訪問郵件伺服器的軟體使用POP3協議或者 IMAP協議,讓用戶查看遠程電腦上的郵件。

  這兩種方式的不同在於郵件處理軟體的安裝位置,安裝在主機上的郵件處理程序基於X或字 符終端,不需要改動客戶電腦上的任何配置,因此適用於經常改變客戶機的使用者。安裝在客戶 機上的用戶可以充分發揮客戶電腦的優勢,例如MS Windows的用戶界面,這種方式適用於擁有固 定個人用電腦的使用者。這兩種方式並不相互衝突,而是相互補充的,適合不同情況的使用者。

  • 郵件處理程序pine

  由於基於字符終端的郵件軟體啟動快捷,能通過telnet等防真終端使用,而不需改變客戶計 算機的任何配置。因此Unix的使用者至少都會選擇安裝一種基於字符終端的郵件處理軟體,以作為 最基本的郵件處理軟體。pine就是其中之一,它提供了簡潔的字符選單界面,功能強大且易於操作, 易用性超過很多圖形接口的郵件處理程序。

  在Pine的主選單下,可以執行發送電子郵件(Compose message),查看目前檔案夾的內容 (Message index),選擇不同的檔案夾(Folder list),使用和維護地址簿(Address Book), 使用S(Setup)用於設置Pine,使用Q(Quit)退出pine回到shell提示下。正常情況下,不需要對 pine進行任何設置,就能正常使用pine閱讀和發送電子郵件。

  然而當使用pine來發送中文郵件時,pine會對中文進行重新編碼,以適應7位傳輸,雖然大 部分電子郵件客戶都會識別這些標準的編碼格式,但還是有一些電子郵件程序不能識別出這些編碼 ,造成閱讀問題。此時就可以重新設置pine直接使用8位編碼。

  在主選單下選擇Setup,當出現提示時,使用Config進入配置部分。就可以搜尋包含enable-8-bits 的兩個選項,配置自己使用的字符集(由於pine中不直接支持中文字符集,可以設置為ISO-8858-1) ,以支持8位字符。

  還可以在這裡設置Pine來閱讀Usenet新聞,這就要在nntp-server的選項中填寫本地新聞服 務器的域名,並配置news-collections選項,例如本地新聞伺服器的名字為news,那麼news-collections 就應設為 ”*{news/nntp}/[]”。也可以設置遠程檔案夾,使得Pine能訪問遠程主機上的郵件。

  Pine預設支持使用IMAP協議訪問遠程主機上的郵箱,但它對POP3的支持未在其文檔中公布, 不能使用設置程序來完成。可以手工更改用戶個人目錄下的配置檔案.pinerc中的選項incoming-folders, 以支持POP3,下面為一個例子:

incoming-folders="imapfolder" {imaphost}INBOX,
	 "pop3folder"	{pop3host/pop3/user=wb}INBOX

  這個例子中配置了兩個遠程帳戶,一個為imaphost上的郵箱,使用IMAP協議進行訪問,在 pine中的檔案夾名為imapfolder,第二個為pop3host上的郵箱,後面使用/pop3指明使用pop3協議 ,/user=wb指明使用wb作帳戶名,其檔案夾的名字為pop3folder。使用這樣的格式就能使pine來管 理多個電腦上的多個郵箱。

  那麼再次啟動pine就能有位於不同主機上的相應incoming和nntp檔案夾,用戶打開相應的檔案 夾就能使用imap、pop3或nntp等不同協議,訪問相應的郵件或新聞了。

  • 使用fetchmail管理多郵件帳戶

  盡管使用pine能非常方便的管理多個POP3或IMAP郵箱,但是如果郵箱主機與目前FreeBSD系 統的網路連接很慢,使用pine來閱讀這些郵箱中的郵件就非常遲緩。此時更好的辦法是先在後台將 郵件取到回本地郵箱中,然後使用pine或其他郵件處理程序進行處理。

  fetchmail就是一個非常方便的從遠程郵件主機下載郵件的應用軟體,它支持pop3、imap, 以及對pop3的一些擴展協議。當安裝好fetchmail之後,使用者可以直接啟動fetchmail,來取得郵 件的方法為:

$ fetchmail -p pop3 -u wangb email.online.ha.cn
password for wangb@email.online.ha.cn:

  在輸入正確的密碼之後,fetchmail將使用pop3協議訪問主機email.online.ha.cn,並取回 用戶wangb的電子郵件,取回的電子郵件將發送到本地郵箱中。也可以用更複雜的方式在後台運行 fetchmail,則需要設置個人目錄下的.fetchmailrc檔案。

$ cat ~/.fetchmailrc
poll email-wangb via email.online.ha.cn
	protocol pop3
	authenticate password
	username wb here is wangb there
	password "1111"
	smtphost localhost
	pass8bits
	stripcr
	fetchall
$ chmod 700 ~/.fetchmailrc

  設置檔案中第一行poll email-wangb via email.online.ha.cn中設置了要下載郵件的郵件 伺服器為email.online.ha.cn,其中email-wangb為對應這一個帳號的標籤名字,用於區分多個不同 的郵箱。然後指定使用的協議為pop3,認証方式為標準的Unix密碼認証,然後,定義了遠端主機上 的郵件帳戶名為wangb(用there表示遠端主機設置),郵件下載到本地用戶wb的郵箱中(使用here 指明本地主機設置)。

  smtphost定義了fetchmail用來轉發郵件時使用的smtp主機,passsword定義了遠程郵件服務 器中帳戶的密碼,在密碼中使用了數字或特殊字符時,就需要使用雙引號將密碼括起來。pass8bits 允許下載郵件中存在8位字符,stripcr用於過濾額外回車字符,由於DOS和Unix在文本定義上的不同 ,這一項用於兼容一些不識別這個差異之處的Windows系統的郵件伺服器,fetchall表示取回全部郵 件,否則就只取回最新的郵件。

  此外,這個檔案因為包括了遠端伺服器的密碼,因此必須具備屬性700,以避免其他用戶能讀 取這個檔案,否則fetchmail不會運行。

  這樣,就可以不使用任何命令行參數,直接在後台運行fetchmail了。每個用戶可以使用cron來運 行自己的fetchmail命令,來管理自己的郵件,而撥號用戶可以在撥號後,使用ppp.linkup啟動fetchmail ,取回自己的郵件。

  • 使用Procmail設置郵件過濾

  由於Internet的使用者不但使用電子郵件和朋友、同事聯繫,而且還通過maillist與Internet 上的其他使用者討論共同感興趣的話題,用戶收到的電子郵件越來越多,並且還會受到廣告、宣傳品 等垃圾郵件的騷擾。使用Promail、maildrop等郵件過濾程序就能幫助使用者阻擋這些廣告和宣傳品, 並幫助管理用戶接收到的郵件。Procmail就是一個用於過濾用戶接收到的電子郵件,並能對其自動分類 、處理的一個應用軟體。對於每天都會收到大量電子郵件的Internet使用者,這是一個非常有用的工具。

  為了使用Procmail,必須在用戶接收到Email時,啟動Procmail進行處理。這個任務可以使用 兩種不同的方式來完成,一個是將Procmail配置為系統的郵件分發代理(Mail Deliery Agent),系 統的郵件伺服器使用porcmail代替其本身原有的郵件分發功能,來分發用戶的郵件。這種方式需要由 系統管理員根據郵件伺服器的不同,而進行不同的設置。

  另一種方法是使用個人目錄下的.forward檔案,系統郵件伺服器在給某個用戶分發郵件的時候, 如果發現他的個人目錄中存在.forward檔案,那麼就會按照這個檔案中的內容來進行處理。因此就可以 在.forward檔案中啟動procmail處理用戶接收到的郵件,與更改系統MDA的設置方式相比,這種方式更為 靈活,並且可以由每個用戶來決定是否使用這個過濾處理能力。

  .forward檔案可以按照需要設置三種不同的處理方式:定義存儲郵件的郵箱檔案名、進行轉發 的目的地址或者對電子郵件進行處理的外部應用程序,顯然啟動Procmail是應使用第三種方法。

  .forward檔案應該屬於這個用戶(或root),並且其權限設置應該為不能被其他或同組用戶可寫。

$ cat ~/.forward
"|IFS=' '&&exec /usr/local/bin/procmail -f-||exit 75 wb"

  這個.forward的例子裡,使用"|"字符設置括號內的參數為一個執行命令,這樣 sendmail就能啟動一個shell執行設置的命令,並使用管道的方式讀取sendail的輸出。執行命令中首 先定義了IFS環境變量(用於分隔不同的域),然後執行procmail,如果procmail執行失敗就執行 exit 75 wb告訴sendmail,郵件分發失敗,需要更改wb為使用者自己的登錄名。

  procmail使用用戶個人目錄下的.procmailrc檔案,來設置對收到的Email進行處理的過濾規 則。最簡單的.procmailrc檔案為:

:0c: 
* ^FROM.*@freebsd.org
$HOME/mail.backup

  第一行首先使用冒號開始定義一個過濾規則,緊隨其後的應該是一個數字,這個數字規定了這 個規則占用的配置行數,一般使用0表示沒有限制配置行,此後的c表示復制(copy),表示下面的規則 只是用於處理郵件的副本,而郵件本身仍然會被其他的過濾處理規則處理。這一行最後的冒號,用於表 示在處理過程中進行加鎖,防止同另一個procmail進程處理同一個檔案時發生衝突,通常這個機制在存 儲郵件檔案時非常有幫助。

  第二行就開始了一個過濾規則的定義,過濾規則使用*字符開頭。一個規則中使用模式匹配來匹 配電子郵件信頭或內容中的特定行。上面例子裡的這個規則匹配所有來自於freebsd.org的電子郵件。 在第三行定義了對符合上面規則的郵件的處理方法,由於給出了一個檔案名mail.backup,因此將所有 來自於freebsd.org的電子郵件添加到mail.backup檔案中保存。如果使用!開頭定義規則處理辦法,表 示進行轉發處理,!後面就為進行轉發的電子郵件的地址,或者以|開頭,表示啟動後面的命令進行郵件 處理。

  procmail不區分大小寫,它使用Unix最常用的模式匹配方式進行匹配特定的郵件。因此使用這 些匹配模式和procmail規則,可以定義一個更複雜的.procmailrc:

PATH=$HOME/bin: /usr/bin: /usr/ucb: /bin: /usr/local/bin:.
SHELL=/bin/sh
MAILDIR=$HOME/mail
DEFAULT=$MAILDIR/mailbox
LOGFILE=/dev/null
SENDMAIL=/usr/lib/sendmail

:0:
* ^From.*badguy          
/dev/null/

:0c:
* ^(From|Cc|To).*freebsd.org
| gzip >> freebsdmail.gz

:0:
* ^From.*@hotmail.com
* ^Subject:.*(joke|funny)
{
   :0 c
   ! friend1@hotmail.com friend2@usa.net
   :0
   joke
}

:0
* ^Subject:.*order
* !^FROM_DAEMON
* !^X-Loop: marketing@company.com
{
   :0 h c
   | (formail -r -A"X-Loop: marketing@company.com " ; \
   cat /market/acknowlegement.txt ) | $SENDMAIL -t
   :0 c
   ! market2@company.com
   :0
   market
}

  這個配置檔案的第一部分中設置了幾個環境變量,用於設置procmail的運行環境,其中將 MAILDIR設置為~/mail,與pine使用的目錄相同,因此這將使pine能直接讀取procmail處理過的郵 件。

  第二部分中為郵件定義了三個不同的過濾規則及相應的處理操作,第一個規則將來自badguy 的郵件濾掉(輸出到/dev/null)﹔第二個規則將與freebsd.org的通信使用gzip保存到freebsdmail.gz 中,用於保存相應maillist的郵件﹔第三個規則將某個使用hotmail帳號的朋友,並使用joke或funny標 題給自己發送笑話的郵件同時轉給其他幾個朋友,並同時保存在joke檔案夾中﹔最後一個規則是設置了 一個自動回復郵件系統,對於使用order做標題,並且沒有FROM_DAEMON行(自動郵件回復程序使用FROM_DAEMON 作標記,通常不需要回復這些的郵件,否則會造成回復循環),並且沒有包括X-Loop行的郵件進行處理:

  首先將X-Loop行添加到郵件中(使用formail將它們添加到mail的信封上),以免造成對同一個郵件的 循環處理,然後將檔案/market/acknowlegement.txt發回給發送者﹔並以及轉發郵件,在market中保存郵件。

  根據這些規則,使用Procmail就能完整的處理各種郵件,減輕電子郵件不斷增多而造成的困擾。