1. 程式人生 > 其它 >centos環境搭建postfix郵件服務

centos環境搭建postfix郵件服務

技術標籤:架構centos搭建郵件服務

在這裡插入圖片描述

postfix是Wietse Venema在IBM的GPL協議之下開發的MTA(郵件傳輸代理)軟體。postfix是Wietse
Venema想要為使用最廣泛的sendmail提供替代品的一個嘗試。在Internet世界中,大部分的電子郵件都是通過sendmail來投遞的,大約有100萬用戶使用sendmail,每天投遞上億封郵件。這真是一個讓人吃驚的數字。Postfix試圖更快、更容易管理、更安全,同時還與sendmail保持足夠的相容性。

簡介

Postfix 是一種電子郵件伺服器,它是由任職於IBM華生研究中心(T.J. Watson Research

Center)的荷蘭籍研究員Wietse
Venema為了改良sendmail郵件伺服器而產生的。最早在1990年代晚期出現,是一個開放原始碼的軟體。

特點

  1. postfix是免費的:
    postfix想要作用的範圍是廣大的Internet使用者,試圖影響大多數的Internet上的電子郵件系統,因此它是免費的。
  2. 更快:
    postfix在效能上大約比sendmail快三倍。一部執行postfix的臺式PC每天可以收發上百萬封郵件。
  3. 相容性好:
    postfix是sendmail相容的,從而使sendmail使用者可以很方便地遷移到postfix。Postfix支援/var[/spool]/mail、/etc/aliases、 NIS、和 ~/.forward 檔案。
  4. 更健壯:
    postfix被設計成在重負荷之下仍然可以正常工作。當系統執行超出了可用的記憶體或磁碟空間時,postfix會自動減少執行程序的數目。當處理的郵件數目增長時,postfix執行的程序不會跟著增加。
  5. 更靈活:
    postfix是由超過一打的小程式組成的,每個程式完成特定的功能。你可以通過配置檔案設定每個程式的執行引數。
  6. 安全性
    postfix具有多層防禦結構,可以有效地抵禦惡意入侵者。如大多數的postfix程式可以執行在較低的許可權之下,不可以通過網路訪問安全性相關的本地投遞程式等等。

結構

postfix由十幾個具有不同功能的半駐留程序組成,並且在這些程序中並無特定的程序間父子關係。某一個特定的程序可以為其他程序提供特定的服務。

大多數的postfix程序由一個程序統一進行管理,該程序負責在需要的時候呼叫其他程序,這個管理程序就是master程序。該程序也是一個後臺程式。
這些postfix程序是可以配置的,我們可以配置每個程序執行的數目,可重用的次數,生存的時間等等。通過靈活的配置特性可以使整個系統的執行成本大大降低。
1.2.1 postfix的郵件佇列(mail queues) postfix有四種不同的郵件佇列,並且由佇列管理程序統一進行管理: 1. maildrop:本地郵件放置在maildrop中,同時也被拷貝到incoming中。 2.
incoming:放置正在到達或佇列管理程序尚未發現的郵件。 3.
active:放置佇列管理程序已經打開了並正準備投遞的郵件,該佇列有長度的限制。 4. deferred:放置不能被投遞的郵件。
佇列管理程序僅僅在記憶體中保留active佇列,並且對該佇列的長度進行限制,這樣做的目的是為了避免程序執行記憶體超過系統的可用記憶體。
1.2.2 postfix對郵件風暴的處理 當有新的郵件到達時,postfix進行初始化,初始化時postfix同時只接受兩個併發的連線請求。當郵件投遞成功後,可以同時接受的併發連線的數目就會緩慢地增長至一個可以配置的值。當然,如果這時系統的消耗已到達系統不能承受的負載就會停止增長。還有一種情況時,如果postfix在處理郵件過程中遇到了問題,則該值會開始降低。
當接收到的新郵件的數量超過postfix的投遞能力時,postfix會暫時停止投遞deferred佇列中的郵件而去處理新接收到的郵件。這是因為處理新郵件的延遲要小於處理deferred佇列中的郵件。Postfix會在空閒時處理deferred中的郵件。
1.2.3 postfix對無法投遞的郵件的處理 當一封郵件第一次不能成功投遞時,postfix會給該郵件貼上一個將來的時間郵票。郵件佇列管理程式會忽略貼有將來時間郵票的郵件。時間郵票到期時,postfix會嘗試再對該郵件進行一次投遞,如果這次投遞再次失敗,postfix就給該郵件貼上一個兩倍於上次時[間郵票的時間郵票,等時間郵票到期時再次進行投遞,依此類推。當然,經過一定次數的嘗試之後,postfix會放棄]對該郵件的投遞,返回一個錯誤資訊給該郵件的發件人。
1.2.4 postfix對不可到達的目的地郵件的處理 postfix會在記憶體中儲存一個有長度限制的當前不可到達的地址列表。這樣就避免了對那些目的地為當前不可到達地址的郵件的投遞嘗試。從而大大提高了系統的效能。
1.2.5 postfix的安全性 postfix通過一系列的措施來提高系統的安全性,這些措施包括: 1. 動態分配記憶體,從而防止系統緩衝區溢位; 2. 把大郵件分割成幾塊進行處理,投遞時再重組; 3.
Postfix的各種程序不在其他使用者程序的控制之下執行,而是執行在駐留主程序master的控制之下,與其他使用者程序無父子關係,所以有很好的絕緣性。
4. Postfix的佇列檔案有其特殊的格式,只能被postfix本身識別;

處理過程

2.1 接收郵件的過程 當postfix接收到一封新郵件時,新郵件首選在incoming佇列處停留,然後針對不同的情況進行不同的處理: 1.對於來自於本地的郵件:local程序負責接收來自本地的郵件放在maildrop佇列中,然後pickup程序對maildrop中的郵件進行完整性檢測。maildrop目錄的許可權必須設定為某一使用者不能刪除其他使用者的郵件。
2.對於來自於網路的郵件:smtpd程序負責接收來自於網路的郵件,並且進行安全性檢測。可以通過UCE(unsolicited
commercial email)控制smtpd的行為。
3.由postfix程序產生的郵件:這是為了將不可投遞的資訊返回給發件人。這些郵件是由bounce後臺程式產生的。 5.
由postfix自己產生的郵件:提示postmaster(也即postfix管理員)postfix執行過程中出現的問題。(如SMTP協議問題,違反UCE規則的記錄等等。)
關於cleanup後臺程式的說明:cleanup是對新郵件進行處理的最後一道工序,它對新郵件進行以下的處理:新增信頭中丟失的Form資訊;為將地址重寫成標準的[email protected]格式進行排列;從信頭中抽出收件人的地址;將郵件投入incoming佇列中,並請求郵件佇列管理程序處理該郵件;請求trivial-rewrite程序將地址轉換成標準的[email protected]格式。
2.2 投遞郵件的過程 新郵件一旦到達incoming佇列,下一步就是開始投遞郵件,postfix投遞郵件時的處理過程如圖三所示。相關的說明如下:
郵件佇列管理程序是整個postfix郵件系統的心臟。它和local、smtp、pipe等投遞代理相聯絡,將包含有佇列檔案路徑資訊、郵件發件人地址、郵件收件人地址的投遞請求傳送給投遞代理。佇列管理程序維護著一個deferred佇列,那些無法投遞的郵件被投遞到該佇列中。除此之外,佇列管理程序還維護著一個active佇列,該佇列中的郵件數目是有限制的,這是為了防止在負載太大時記憶體溢位。郵件佇列管理程式還負責將收件人地址在relocated表中列出的郵件返回給發件人,該表包含無效的收件人地址。
如果郵件佇列管理程序請求,rewrite後臺程式對收件人地址進行解析。但是預設地,rewrite只對郵件收件人是本地的還是遠端的進行區別。
如果郵件對你管理程序請求,bounce後臺程式可以生成一個郵件不可投遞的報告。
本地投遞代理local程序可以理解類似UNIX風格的郵箱,sendmail風格的系統別名資料庫和sendmail風格的.forward檔案。可以同時執行多個local程序,但是對同一個使用者的併發投遞程序數目是有限制的。你可以配置local將郵件投遞到使用者的宿主目錄,也可以配置local將郵件傳送給一個外部命令,如流行的本地投遞代理procmail。在流行的linux發行版本RedHat中,我們就使用procmail作為最終的本地投遞代理。
遠端投遞代理SMTP程序根據收件人地址查詢一個SMTP伺服器列表,按照順序連線每一個SMTP伺服器,根據效能對該表進行排序。在系統負載太大時,可以有數個併發的SMTP程序同時執行。
pipe是postfix呼叫外部命令處理郵件的機制.

延伸程式

EMOS EMOS是一個基於CentOS,整合ExtMail 郵件系統,只需10分鐘就可安裝配置完畢的小型Linux系統,使安裝不再有壓力。
ExtMail 郵件系統
ExtMail最初以WebMail軟體為主,後逐步完善配套並形成了ExtMail郵件系統,提供完整的SMTP/POP/IMAP/Web和管理支援。目前裝機量超過2萬臺。
iRedMail iRedMail 是一套基於 GPL 釋出的 Shell
指令碼,目的是全自動安裝和配置郵件服務所需要的元件,以減輕系統管理員的負擔。它提供了一個基本的命令列下的使用者互動介面(使用 dialog
程式實現),使用者只需要簡單地選擇他所希望使用的元件,就可以在幾分鐘內(少於 3 分鐘)部署好一臺功能強大的郵件伺服器。 Tmail
Tmail最初以postfix後臺管理軟體為主,後逐步完善配套並形成了tmail郵件系統,提供完整的SMTP/POP/IMAP/Web和後臺管理和監控支援。目前裝機量超過3萬臺。

版本釋出

2012年02月01日,Postfix 2.9.0/2.8.8 釋出,SMTP伺服器。
2012年02月19日,Postfix2.9.1 釋出,SMTP 伺服器。
2012年12月14日,Postfix 2.9.5/2.8.13 釋出,SMTP 伺服器。

環境準備

IP版本
192.168.1.10CentOS Linux release 7.6.1810 (Core)

準備域名

實驗環境為了方便直接修改hosts檔案

[[email protected] ~]# vim /etc/hosts
# 新增
192.168.1.10 hello.com

安裝postfix devecot

本文件只是搭建一個簡單的郵件服務,其他功能還需自己去探索

Postfix、Dovecot 簡介

Postfix

Postfix是一個標準的MTA伺服器,它負責通過SMTP協議管理髮送到本機的郵件以及由本機發向外界的郵件

Dovecot

Dovecot是一個優秀的IMAP/POP伺服器,用以接收外界傳送到本機的郵件。

安裝

[[email protected] ~]# yum -y install postfix dovecot

配置Postfix

參考:配置檔案文件

修改配置檔案時,下面的變數為唯一,如果有重複的則刪除,保留一個變數即可

[[email protected] ~]# vim /etc/postfix/main.cf 
myhostname = server.hello.com
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
myorigin = $mydomain
mynetworks = 127.0.0.0/8
inet_interfaces = all
inet_protocols = all
home_mailbox = Maildir/
# 末尾新增
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem
smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem

配置smtps

部分郵件客戶端依賴於使用 465 埠提供加密連線,所以我們修改配置,允許 Postfix 使用 465 埠傳送郵件。

[[email protected] ~]# vim /etc/postfix/master.cf 
# 取消註釋
smtps     inet  n       -       n       -       -       smtpd
 -o smtpd_tls_wrappermode=yes

(注意: -o 前要保留空格)

啟動postfix

[[email protected] ~]# systemctl start postfix
[[email protected] ~]# systemctl enable postfix

Postfix 日誌

Postfix 系統的日誌檔案在系統的這個目錄下的 /var/log/maillog 檔案,此檔案記錄了 Postfix 伺服器的執行狀態資訊。

配置Dovecot

修改dovecot.conf

[[email protected] ~]# vim /etc/dovecot/dovecot.conf
# 末尾新增
ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_key = </etc/pki/dovecot/private/dovecot.pem
protocols = imap pop3 lmtp
listen = *
mail_location = Maildir:~/Maildir
disable_plaintext_auth = no

修改10-master.conf

[[email protected] ~]# vim /etc/dovecot/conf.d/10-master.conf
# 取消註釋
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }

啟動Dovecot

[[email protected] ~]# systemctl start dovecot
[[email protected] ~]# systemctl enable dovecot

/var/log/maillog檔案最後一行如下即成功

[[email protected] ~]# tail -f /var/log/maillog
Dec 21 14:41:39 localhost dovecot: master: Dovecot v2.2.36 (1f10bfa63) starting up for imap, pop3, lmtp (core dumps disabled)

建立賬戶

該配置下郵箱賬戶依賴於系統使用者,所以通過新增系統使用者的方式建立郵箱賬戶。

添加發送使用者

[[email protected] ~]# useradd test
[[email protected] ~]# passwd test

新增接收使用者

使用root使用者不能接收郵件,因為傳送要在root的家目錄下建立目錄,沒有許可權,所以需要建立普通使用者

[[email protected] ~]# useradd hello

測試

切換為test使用者傳送郵件

[[email protected] new]# su test
[[email protected] ~]$ echo "postfix test" | mail -s "hello" [email protected].com

檢視hello使用者的家目錄下

[[email protected] new]# cd /home/hello/Maildir/new
[[email protected] new]# cat 1608533152.Vfd00I6505fM551126.localhost.localdomain 
Return-Path: <[email protected].localdomain>
X-Original-To: [email protected].com
Delivered-To: [email protected].com
Received: from localhost.localdomain (localhost [127.0.0.1])
	by server.hello.com (Postfix) with ESMTP id 74E5D10488A9
	for <[email protected].com>; Mon, 21 Dec 2020 14:45:52 +0800 (CST)
Received: (from [email protected])
	by localhost.localdomain (8.14.7/8.14.7/Submit) id 0BL6jqCp011327
	for [email protected].com; Mon, 21 Dec 2020 14:45:52 +0800
From: [email protected].localdomain
Message-Id: <202012210645.[email protected].localdomain>
Date: Mon, 21 Dec 2020 14:45:52 +0800
To: [email protected].com
Subject: hello
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

postfix test