postfix 是一種電子郵件伺服器,它是由任職于ibm華生研究中心(t.j. watson research center)的荷蘭籍研究員wietse venema為了改良sendmail郵件伺服器而産生的。最早在1990年代晚期出現,是一個開放源代碼的軟體。
sendmail由于出現的比較早,但是各方面的問題也比較突出,postfix就是為了替代sendmail的缺點而出現的,postfix 郵件伺服器的優點很明顯:
1. 開源的,要知道開源的即是免費的
2. 速度更快,比sendmail×××倍
3. 相容性好,與sendmail相容,兩者互相遷移很友善。
4. 更能幹,在重負荷之下仍然能正常工作,當超負荷之後,他會自動調整
5. 更靈活,不同于sendmail一體化的設計,postfix使用子產品化的設計,各個子產品專注于自己的工作。
6. 安全性,具有多層的防禦結構。
postfix的子產品有哪些呢?
1. smtpd 用于響應使用者的請求
2. cleanup 用于檢測文法
3. pickup 用于分檢郵件
4. smtp 類似于用戶端,傳輸郵件
5. qmgr 隊列管理器 用于不同郵件狀态的管理。
postfix由這些還有其他的一些子產品來進行服務,各個子產品自己完成自己的任務,他們由一個master程序統一排程
postfix的四種郵件隊列?
1. maildrop 本地郵件存放處
2. incoming 放置正在到達或者隊列管理程序尚未發現的郵件
3. active 放置已經打開了正準備投遞的郵件,當然它是由長度限制的。
4. deferred 放置不能被投遞的郵件
隊列管理程序僅僅在記憶體中保留active隊列,并且限制其長度。
postfix 對郵件風暴的處理
當有新的郵件到達的時候,postfix進行初始化,此時postfix同時隻接受兩個并發連接配接請求,當郵件投遞成功後,可以同時接收的并發連接配接就會緩慢地增長,一直到可配置的值
當系統資源消耗已經達到不能承受的負載,就會停止并發連接配接數量的增長,或者postfix在處理郵件過程中遇到問題,數量也會減少。
當接收到的新郵件的數量,超過它的投遞能力時,postfix會停止投遞deferred隊列中的郵件,去處理新接收到的郵件,因為處理新郵件的延遲小于處理defferred隊列中的郵件。
postfix 對無法投遞的郵件的處理
當第一次發送失敗,postfix會給該郵件,貼上一個将來的時間有票,在達到這個時間之前,不會再處理該類郵件,到到達這個時間時,進行投遞,再次失敗,将再次貼上一個雙倍與第一次的郵件将來時間的郵票,以此類推,進行多次嘗試之後,放棄該郵件,回複使用者錯誤資訊
postfix對于目标不可達的目的郵件的處理
postfix記憶體之中儲存了一個有長度限制的不可達的位址清單,避免想這些地方進行郵件投遞
postfix的安全性
1. 動态配置設定記憶體,放置系統緩沖區溢出
2. 把大郵件分割成幾塊處理,投遞時在進行重組
3. postfix的各個程序互相不進行控制,隻接受master主程序的控制
4. postfix 的隊列檔案有其特殊格式,隻能被postfix本身識别
postfix郵件服務對于郵件的處理過程:
接收的過程: 當接受新郵件時,新的郵件首選在incoming隊列停留,并進行處理
1. 對于來自與本地的郵件:local程序負責接收,并放置郵件于maildrop隊列中,然後pickup程序對其進行完整性檢測,maildrop目錄的權限必須進行設定 避免使用者删除其他使用者的郵件
2. 對于網絡的郵件:smtpd 程序負責接收郵件,并且進行安全性檢測
3. postfix程序會自己産生郵件,用于将郵件的不可投遞資訊傳回給發件人,這些工作由bounce背景程式産生
4. postfix 産生郵件,提示postfix管理者 postfix運作過程中出現問題
5. cleanup程序,對郵件進行處理,添加信頭中丢失的form資訊。也就是将位址重寫為标準的user@’域名‘ 的格式,從信頭中抽取收件人的位址,投入到incoming隊列中,請求處理該信件,請求位址重寫程序将收件人位址轉換為标準的user@‘域名’的格式
郵件的投遞過程
上面的部分結束之後,郵件已經到達incoming的隊列了,接下來進行郵件的投遞。
1. 郵件到達郵件隊列管理程序,他将辦含有隊列檔案路徑資訊,發件人位址,收件人位址的投遞請求發送給投遞代理。
2. 與此同時,郵件隊列管理程序維護者deferred,active隊列,不同狀态的郵件放置于的隊列
3. 針對于發送成功與失敗,隊列管理程序與rewrite,與bounce背景程式練習,成功的給rewrite進行位址解析,失敗的給bounce傳回資訊給使用者
4. 檢查成功的郵件送給投遞代理程序,local和smtpd
實驗:linux中實作postfix郵件伺服器
實驗環境:linux 虛拟機5.4
1.安裝postfix。
[root@mailserver]# rpm -ivh postfix-2.3.3-2.1.el5_2.i386.rpm
[root@mailserver]# rpm -ivh system-switch-mail-0.5.25-12.noarch.rpm
//用于轉換郵件伺服器的工具,系統預設sendmail作為郵件伺服器,轉換為postfix
2.選擇postfixmail

3. 配置檔案
子產品管理檔案 /etc/postfix/master.cf
主配置文檔 /etc/postfix/main.cf
postconf -d 檢視預設的參數值
postconf -n 檢視新的參數值
postconf -e 編輯
編輯main.cf檔案
69myhostname = mail.163.com //本地域名
77mydomain = 163.com //自己的域名
93myorigin = $mydomain
//實作位址僞裝,将郵件的真實來源改正為myorigin所指的域名中。
110inet_interfaces = localhost //隻接受自己的使用者
107inet_interfaces = all //監聽所有
156mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
//哪些是本地信件,允許本地作用域發送郵件。
觀察日志資訊,如果咩有打開main.cf 156行的注釋
郵件狀态進入到了 deferred,發送失敗
配置本地使用者可以發送郵件。則發送成功!
postfix mail的中繼!!
255mynetworks = 168.100.189.0/28, 127.0.0.0/8
在所标記網段中 的 計算機發來的郵件允許中繼。
postfix mail的中安全認證!
broken_sasl_auth_clients= yes
smtpd_sasl_auth_enable= yes
smtpd_sasl_security_options= noanonymous //不允許匿名賬号發送
#smtpd_sasl_application_name= smtpd //smtpd
#smtpd_client_restrictions= permit_sasl_authenticated,reject//經過驗證可以連接配接,沒經過
驗證拒絕
#smtpd_client_restrictions= permit_sasl_authenticated //限制使用者連接配接驗證不驗證都連
接
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
将他們寫入postfix的主配置檔案中
[root@mail~]# service saslauthd restart
[root@mail~]# vim /usr/lib/sasl2/smtpd.conf
當然此時如果使用不存在的賬号,來測試是否能通訊的話,還是能夠發送郵件,那是因為身份驗證不是強制性的。
673smtpd_client_restrictions = permit_sasl_authenticated,reject //更改配置檔案
還是需要 auth login 進行驗證賬号密碼 均為base64 編碼
拓展:
squirrelmail是一套基于标準的,采用php4開發webmail郵件系統。它内置純php支援的imap和smtp協定,所有頁面都遵循html4.0标準(沒有使用javascript支援),以便最大限度相容更多浏覽器上。它對系統要求非常低,并且安裝和配置非常容易。squirrelmail具備一個用戶端郵件程式所應擁有的一切功能,包括支援增強型的mime、位址薄、檔案夾操作等等功能。outlook皮膚主題。
[root@mail~]# yum install squirrelmail
[root@mail~]# cd /var/www/html/
[root@mailhtml]# ln -s /usr/share/squirrelmail mail
[root@mailsqurrmail]# cd /var/www/html/squrrmail
[root@mailsqurrmail]# ./conf.pl
與性能有關的配置
伺服器設定
全局配置
語言選項
登陸測試
當登陸之後,提示錯誤,錯誤資訊是沒有imap伺服器,也就是沒有郵件接收伺服器,而linux中的郵件接收伺服器是dovecot,是以安裝dovecot,并啟動dovecot 服務之後
673#smtpd_client_restrictions = permit_sasl_authenticated,reject
編輯配置檔案,注釋行
郵件可以發送出去了