自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Postfix的投遞過程詳解

運維 系統(tǒng)運維
Smtp協(xié)議要求收下郵件的MTA,必須負責(zé)將郵件送到最終目的地--可能是本地系統(tǒng)的郵箱,也可能同一網(wǎng)絡(luò)上的其他主機,這段工作過程稱為投遞(delivery)。本文就給大家重點講下Postfix的投遞的具體過程。

  在我們討論本地郵件的投遞過程之前,先讓我們理清“本地”、“外地”、“虛擬”這三種郵件的定義以及相關(guān)的MDA.

  Postfix的投遞代理程序

  postfix依據(jù)來信地址來決定是否要收下郵件以及如何選擇適當(dāng)?shù)腗DA來執(zhí)行后續(xù)的投遞任務(wù)。postfix會收下三種網(wǎng)域的郵件,分別是本地(local)、轉(zhuǎn)發(fā)(relay)以及虛擬(virtual),它們的定義與相關(guān)的MDA,如下:

  本地郵件

  若郵件終點站是mydestination參數(shù)所列出的網(wǎng)域之一,postfix就視其為本地郵件,由local MDA(或是你指定的其他程序)執(zhí)行投遞任務(wù)。本地郵件的收件者必須擁有本地系統(tǒng)(postfix server本身所在的主機)的用戶賬戶,或是其名稱被定義在別名文件(傳統(tǒng)上是/etc/aliases)。本地郵件會被投遞到系統(tǒng)的郵件存儲目錄(通 常是/var/spool/mail/),或個人主目錄下的郵件文件(~/mail/)。

  轉(zhuǎn)發(fā)郵件

  若郵件終點站是relay_domains參數(shù)所列出的網(wǎng)域之一,postfix就視其為轉(zhuǎn)發(fā)郵件,由relay MDA來執(zhí)行投遞任務(wù)。一般而言,只有在postfix被當(dāng)成局域網(wǎng)絡(luò)的郵件網(wǎng)關(guān)使用,而同網(wǎng)絡(luò)上還有其他網(wǎng)域的郵件服務(wù)器時,才會讓postfix收下 轉(zhuǎn)發(fā)郵件。也就是說,所謂的“轉(zhuǎn)發(fā)”,通常是指同局域網(wǎng)絡(luò)上的其他主機,而relay其實是smtp MDA的翻版,只不過被刻意設(shè)計成特別適合傳信給局域網(wǎng)絡(luò)上主機而已。

  虛擬網(wǎng)域郵件

  一臺郵件服務(wù)器通常只服務(wù)一個范圍網(wǎng)域 (canonical domain);如果要同時服務(wù)多個網(wǎng)域,則額外的網(wǎng)域稱為虛擬網(wǎng)域(virtual domain)。虛擬網(wǎng)域的郵件由virtual MDA負責(zé)投遞。依據(jù)用戶是否有服務(wù)器的系統(tǒng)賬號,虛擬網(wǎng)域的郵件還可分成“虛擬郵箱”與“虛擬別名”兩種。虛擬郵箱的收件人沒有系統(tǒng)賬戶,而且每一個虛 擬郵箱網(wǎng)域都有自己的郵箱目錄(mail spool),所有虛擬郵箱網(wǎng)域都必須列于virtual_mailbox_domains參數(shù)。另一方面,虛擬別名網(wǎng)域的收件人可以擁有本地或非本地系 統(tǒng)賬戶,postfix會改寫這類郵件的收件地址,然后交給smtp MDA遞送出去(如果新地址是非本地網(wǎng)域),或重新回到收件隊列(如果新地址是本地網(wǎng)域)。

  郵箱格式

  當(dāng)postfix投 遞本地郵件時,郵件內(nèi)容會被傳送到postfix系統(tǒng)上的適當(dāng)郵箱。最常見的兩種郵箱格式,分別是傳統(tǒng)的mbox以及較新的 maildir。兩者都是使用一般的文件來儲存郵件內(nèi)容,差別在于文件內(nèi)部的組織安排有所不同。在postfix中,當(dāng)你設(shè)定任何郵件文件或目錄參數(shù)時, 如果在路徑末端加注一個/符號,表示你想使用maildir格式的郵箱。

  mbox格式

  傳統(tǒng)上,unix系統(tǒng)將同一位用戶 的所有郵件都塞在同一個文件里,像這樣的郵箱格式通常稱為mbox。郵箱文件里的每一封郵件,其第一行的前五個字符必定是“from ”。習(xí)慣上,為了方便表示,我們通常將它寫成“from_“,以下劃線字符強調(diào)空格的存在請勿將mbox文件內(nèi)用來分隔郵件的”from “字樣與郵件標(biāo)頭里的”from:“字段混為一談。郵件在mbox文件里的最后一行必定為空格。因此,一行空格接著一個from_字樣,就可視為下一封信 的開始。

  postfix將郵件寫入mbox文件之前,會先使用信封上的寄件人地址與當(dāng)時的日期創(chuàng)建好from_文本行,并將該行字符串寫到 mbox文件的末端,然后才開始填入郵件內(nèi)容。如果postfix發(fā)現(xiàn)郵件內(nèi)容本身有任何以“from”開頭的文本行,它會在該文本行的開頭加一個 >符號,避免該文本行被誤以為下一封信的開頭。

  當(dāng)pop/imap server讀取mbox文件內(nèi)的郵件時,第一步是掃描文件內(nèi)容,找出代表郵件開頭的from文本行。在讀取郵件內(nèi)容時,如果遇到下一個from_文本行 (或文件結(jié)尾),就可斷定當(dāng)前的郵件已經(jīng)讀完了。有些pop/imap server會主動恢復(fù)">from"的原狀,但有些不會。

  由于 postfix和pop/imap server有可能會同時訪問同一個mbox文件,所有它們必須使用“文件鎖定機制”(file locking)來確保訪問權(quán)。在local投遞本地郵件之前,必須先將該文件加鎖,然后才能將郵件內(nèi)容寫入mbox文件。postfix支持多種鎖定機 制,視系統(tǒng)平臺而定。利用postconf -l命令可查看你的系統(tǒng)提供了哪些鎖定機制可供postfix使用:

  postconf -l

  如果想知道postfix在你系統(tǒng)上列出的各種鎖定機制的詳細信息,請把鎖定機制的名稱告訴man:

  man folck

  如 果你的系統(tǒng)平臺支持flock和fcntl,應(yīng)該就可以找到它們的在線說明文件,因為這兩者都是操作系統(tǒng)或函數(shù)庫提供的功能,而任何系統(tǒng)平臺都支持的 dotlock機制,很可能找不到說明文件,因為dotlock只是程序之間一種不成文協(xié)議,不需要額外的函數(shù)庫。dotlock的原理很簡單,舉個例子 就可以說明清楚。假設(shè)postfix要訪問user1郵件文件,它必須先檢查該文件的同目錄下是否存在一個.user1.lock文件,如果存在,表示 user1郵件文件當(dāng)前被另一個進程占用;如果.user1.lock文件步存在,postfix就自己產(chǎn)生一個,讓其他進程知道user1文件當(dāng)前正被 占用。在postfix關(guān)閉user1文件之后,要主動移除.user1.lock文件,讓其他進程可以使用user1郵件文件。dotlock鎖定機制 的缺點是它沒有強制性(任何進程都可以不檢查,user1.lock是否存在而徑直訪問user1文件),而且效率不佳。

  通常你可以不必擔(dān)心鎖定機制的細節(jié),也不必理會系統(tǒng)支持哪些類型的鎖定機制,因為postfix能自動做出最佳選擇。

  maildir格式

  maildir 郵箱格式不同于mbox之處,在于它使用目錄結(jié)構(gòu)來存儲郵件。maildir的設(shè)計原意為了解決mbox格式的可能性與文件鎖定問題。例如,如果在郵件內(nèi) 容還沒完全寫入mbox文件之前,系統(tǒng)就死機了,這時候可能只有部分內(nèi)容在郵箱里。當(dāng)系統(tǒng)恢復(fù)運行,MDA將郵件寫入郵箱時,新的內(nèi)容會接在前次殘缺內(nèi)容 的后面,因而造成問題。

  mbox格式的另一個缺點,是發(fā)生在pop/imap server與smtp server試圖同時開啟同一個郵箱時。如果雙方?jīng)]有使用相同的鎖定機制,郵箱文件可能因此受損。先前說過,保護文件的鎖定機制有好幾種,但是并非所有郵 件程序都使用鎖定機制。但如果使用maildir格式,則可以不使用文件保護鎖,因為每一封郵件都是存放在單獨的一個文件里。因此,不用的郵件程序,不可 能同時訪問同一個文件。

  一個maildir風(fēng)格的目錄,其下有三個子目錄:tmp/、new/以及cur/。這些子目錄與它們的上層目錄必須位于同一個文件系統(tǒng),習(xí)慣上,它們應(yīng)該放在用戶的主目錄的郵件目錄下

  在new/目錄下的郵件文件,是MDA已經(jīng)送達但是尚未被用戶閱讀的信,文件本身的修改時間,就是收下郵件的時間。郵件文件通常包含RFC 2822格式的郵件,而且不需要“from_"。

  用戶看過郵件之后,郵件文件會被轉(zhuǎn)移到cur/目錄。tmp/目錄供MDA將郵件內(nèi)容存儲成文件,在確定全部內(nèi)柔都寫入文件之后,郵件文件會被搬到new/目錄。

  應(yīng)該選擇mbox還是maildir?

  這 個問題沒有簡單的答案。哪一種郵箱格式最適合你,取決于許多因素。mbox格式的好處是幾乎全世界都支持,但也正是因為它有文件鎖定問題,而導(dǎo)致了 maildir格式的出現(xiàn)。而maildir格式在規(guī)模適合性方面也頗受質(zhì)疑,因為某些文件系統(tǒng)可能無法應(yīng)付太多的郵件文件。在效率方面,兩種格式各有各 優(yōu)缺點:搜索、訪問、刪除特定郵件時,maildir的速度比較快;但是就MDA的投遞工作效率而言,直接將郵件內(nèi)容放入文本未(mbox格式)可能比較 快。實際上,你的選擇可能要看你所用的POP/IMAP SERVER而定,如果你架設(shè)的POP/IMAP SERVER只支持maildir格式,很顯然你沒有選擇的余地。postfix對兩種格式都支持,所以你只要考慮其他因素就行。如果你的環(huán)境讓你感覺到 為難,建議你測試兩種格式,盡量以接近實際的運行環(huán)境和工作量來實驗,依據(jù)實驗結(jié)果做出選擇。

#p#

  本地郵件的投遞操作

  若收件 地址的網(wǎng)域部分,是列在mydestination參數(shù)的所有網(wǎng)域之一,postfix就將其當(dāng)成本地郵件交給local MDA進行投遞。你可以隨意在mydestination列出多個網(wǎng)域,但是本地的個別用戶會收到所有網(wǎng)域的郵件。舉例來說,如果 oreilly.com、ora.com和oreillymedia.com同時被列在mydestination參數(shù),則寄給 kdent@ora.com、kdent@oreilly.com或kdent@oreillymedia.com的郵件,最后都是進入同一個本地郵箱。 為了避免收下不明用戶的郵件,所有本地收件人的名稱都必須列在local_recipient_maps參數(shù)所指的表中。此參數(shù)的默認值是指向unix系 統(tǒng)的密碼文件與別名表,所以你通常不需要修改它。

  檢查郵件地址的人名部分時,postfix先檢查別名表。如果發(fā)現(xiàn)相符的別名,則以該別名對應(yīng)的 名稱為新的收件人,重新提交郵件,當(dāng)成新郵件處理;否則,就試著將郵件傳給系統(tǒng)上的用戶。postfix先檢查當(dāng)?shù)赜脩羰欠裨O(shè)置了自己的.forward 文件,如果有,則依據(jù)其設(shè)定內(nèi)容來轉(zhuǎn)寄郵件;乳溝沒有,則將郵件放入用戶的郵箱。

  .forward文件

  .forward 文件讓用戶可以設(shè)置自己的別名。.forward文件的格式與別名文件的RHS-VALUE部分的格式一樣,甚至比其更寬松。比方說,別名文件的RHS- VALUE可以有多個以分號隔開的值,.forward文件也沿用相同慣例,但同時也容許你將值分別寫在不同的行。

  .forward文件的擁有權(quán) 限必須是收件人的系統(tǒng)賬戶,而且通常放在用戶的主目錄下。你可以用forward_path參數(shù)來改變.forward文件的存放路徑。postfix提 供下列8大變量讓你表示.forward文件的存放路徑,這些變量的實際值,由投遞時的系統(tǒng)環(huán)境決定:

  $user 收件人得賬戶名稱(信息來源: /etc/passwd)

  $home 收件人得主目錄(信息來源: /etc/passwd)

  $shell 收件人得shell

  $recipient 收件人得完整郵件地址

  $extension 收件地址得人名部分得擴展部分(不一定有),以+之類得分隔符與人名部分風(fēng)格開。以 user1+labs@example.com為例,$extension等于user1。

  $domain 收件地址的網(wǎng)域部分。

  $local 收件地址的完整人名部分(包括擴展部分在內(nèi)--如果有的話)。以user1+ labs@example.com為例,$local等于user1+labs。

  $recipient delimiter 收件地址得人名部分與擴展部分之間得分隔符(通常是+)如果你增加對一個非標(biāo)準(zhǔn)得.forward文件得支持,可以參考下面得設(shè)定;

  forward_path = /home/$user/.forward /home/$user/other_forward

  別名投遞操作

  當(dāng) 別名文件指定了一個命令或文件時,postfix必須先將自己得執(zhí)行身份改成別名文件擁有者,然后以該身份得權(quán)限來執(zhí)行命令,或?qū)⑧]件內(nèi)容寫入文件。唯一 的例外是別名文件擁有者為root時,這時候postfix使用default_privs參數(shù)所指定的賬戶(默認值為nobody)

  郵箱投遞操作

  當(dāng)postfix 將郵件投遞給一位本地用戶時,它必須將郵件內(nèi)容寫入該用戶在系統(tǒng)上的郵箱。postfix默認使用的郵箱格式是mbox,當(dāng)你安裝postfix時,它會 依據(jù)你所用的Unix平臺類型來決定郵件存儲目錄的位置。mail_spool_directory參數(shù)可用來指定一個默認之外的目錄,而目錄路徑的指定 方式會影響pstfix選擇何種郵件格式。舉例來說,假如你這樣設(shè)定:

  mail_spool_directory = /var/spool/mail

  這表示postfix應(yīng)該使用mbox格式將郵件存在/var/spool/mail目錄下。如果你想改用maildir格式,則必須在目錄名稱之后附加一個/符號:

  mail_spool_directory = /var/spool/mail/

  你也可以要求postfix將郵件放在用戶的主目錄下。設(shè)定一個相對路徑給home_mailbox參數(shù),表示你想要哪一個文件來作為郵箱:

  home_mailbox = mbox

  在路徑名稱之后附加一個/符號,表示postfix應(yīng)該使用maildir格式的投遞程序:

  home_mailbox = maildir/

  這會使得postfix將郵件投遞到用戶主目錄下的maildir/子目錄。

  注意: 使用maildir格式時,postfix通常會自動創(chuàng)建必要的子目錄與文件--如果用戶的身份權(quán)限足夠的話。不過,基于安全上的考慮,如果上層目錄的權(quán)限模式為775,則local MDA不會創(chuàng)建任何額外的文件或目錄。

通過上面的文章詳細的描述,大家都應(yīng)該知道了如何用Postfix進行投遞的過程。希望對你們有所幫助!
 

【編輯推薦】

  1. PostfixAdmin 配置過程講解
  2. Postfix的郵件隊列管理
  3. 如何安裝PostfixAdmin
  4. Postfixadmin安裝手冊
  5. 如何對Postfix進行資源控制
  6. Postfix中的地址操作大全
  7. 教你如何設(shè)置Postfixadmin的自動回復(fù)

 

 

  

責(zé)任編輯:趙鵬 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2010-05-25 18:19:41

postfix郵件

2010-06-02 18:00:05

Postfix郵件

2010-06-09 18:17:20

Postfix郵件

2011-01-19 17:30:21

Postfix郵件投遞

2011-01-19 09:55:27

postfix

2010-06-02 18:17:09

Postfix郵件

2010-05-14 15:43:32

MySQL數(shù)據(jù)庫

2011-02-21 10:13:38

Postfix

2011-02-21 13:26:47

Postfix郵件處理

2009-11-30 10:21:41

2009-10-10 15:54:55

RHEL 4配置Pos

2011-02-21 13:08:37

postfix配置

2011-01-19 09:16:48

Postfix配置

2011-01-18 15:00:17

Postfix安裝

2011-01-18 18:52:14

Postfix結(jié)構(gòu)

2010-06-02 17:07:25

Postfix 轉(zhuǎn)發(fā)

2011-02-21 11:14:47

Postfix配置

2011-01-19 09:57:48

Postfix控制

2011-01-19 13:39:38

Postfix郵件監(jiān)控

2010-07-20 16:19:46

配置Telnet服務(wù)
點贊
收藏

51CTO技術(shù)棧公眾號