淺析郵件服務器原理

上面的架構圖中包含兩組郵件系統、兩個客户端和一個DNS服務器,其中的郵件系統是企業中比較經典的架構形式,下面我將依據此圖來簡述郵件服務器的工作流程。

名詞解釋:

  • MUA 接收郵件所使用的郵件客户端,使用IMAP或POP3協議與服務器通信,常見的有:outlook、foxmail;
  • MTA 通過SMTP協議發送、轉發郵件,常見的有:sendmail、postfix、qmail;
  • MDA 將MTA接收到的郵件保存到磁盤或指定地方,通常會進行垃圾郵件及病毒掃描;
  • MRA 負責實現IMAP與POP3協議,與MUA進行交互;
  • SMTP 傳輸發送郵件所使用的標準協議;
  • IMAP 接收郵件使用的標準協議之一;
  • POP3 接收郵件使用的標準協議之一;
  • MailBox 用户郵箱;
  • cyrus-SASL及courier-authlib 提供用户認證相關的支持。
  • SQL 數據庫,用於存儲用户身份信息

前面的架構圖中,MUA想發送郵件,就要將郵件通過SMTP協議送到MTA上,MTA通常會要求用户認證身份(也可不認證),認證通常使用SASL,認證源可以是像上面的架構圖中那樣使用SQL數據庫也可以使用其他方式。MTA收到郵件後會檢查郵件目的地址的郵件域,此時會產生兩種情況。
情況一,目的郵件域是本服務器:
如果發現是本服務器的郵件域則將郵件送到MDA,由MDA將其投遞到用户的郵箱(MailBox)中。最後用户在MUA上使用POP3/IMAP協議鏈接MRA,MRA通常也會要求用户認證身份,其認證源同MTA一樣可以是SQL也可以是其他方式,若認證通過,則允許MUA讀取郵件信息。
情況二,目的郵件域非本服務器:
若是郵件域是其他郵件服務器的,則MTA會發送UDP報文向DNS服務器查詢郵件域對應的郵件主機,並最終解析出其IP地址,隨後MTA會查詢本服務器的轉發控制策略,若允許轉發,則將郵件轉發到該域對應的服務器上,最終會重複情況一中MTA收到郵件後的處理方式。

CentOS 6下使用postfix搭建簡單郵件服務器

介紹:
postfix是linux/unix下比較常用的開源免費郵件傳輸代理程序(MTA)。
下圖是postfix的logo,略顯猥瑣。。。

服務安裝:
通常情況下,CentOS默認都會安裝postfix。
如果你不確定你的系統中有沒有postfix可以使用如下命令查看。

yum -qa | grep postfix

若沒有安裝則使用如下命令安裝。

yum install -y postfix

DNS配置:
郵件發送是需要DNS解析支持的,DNS服務器的配置方法參考此篇文章:

CentOS 6下使用BIND配置簡單DNS服務器


最後要求DNS正向解析配置成類似如下形式,反向解析區域可不配置。“192.168.1.20”是我的郵件服務器的IP地址,請按照實際情況來做更改。

主要配置文件介紹:
postfix的配置文件存放路徑為/etc/postfix,其中的主要的配置文件有兩個,一個是main.cf另一個是master.cf。關於兩個配置文件的説明,如下。

main.cf              //此配置文件為postfix主配置文件,決定了postfix的工作方式。
master.cf            //此配置文件用以配置postfix中各個程序的工作參數,一般在做郵件系統優化時才會用到。

postfix配置:
在配置前,我們需要先關掉系統中sendmail(sendmail也是linux/unix下常用的郵件傳輸代理程序)的所有服務,避免二者產生衝突。
查看是否安裝了sendmail。
rpm -qa | grep sendmail
如安裝了sendmail,則關閉sendmail服務,否則跳過這一步。

service sendmail stop
chkconfig sendmail off

編輯主配置文件。

vim /etc/postfix/main.cf

查找“myhostname”關鍵字,一般在第75行左右的位置,因軟件版本差異行號可能不同。

去掉其中一個前面的註釋,這裏是配置postfix服務器的主機名,這個主機名必須是FQDN(完全合格域名,例如:mail.ibadboy.net)。

在第83行左右找到“mydomain”關鍵字。

去掉其前面的註釋,並將參數修改為郵件域。
什麼是郵件域?舉例説明:admin@ibadboy.net這個郵箱地址中@後面的ibadboy.net就是郵件域。

在第98行左右找到“myorigin”關鍵字,去掉第二個“myorigin”前方註釋。
這裏是用於定義由本台郵件服務器寄出的每封郵件的郵件頭中mail from(發信源主機)的地址。如果不設置,默認會以$myhostname也就是本地主機名這個選項的參數為值,最後是這種形式:“from  ‘user1’ <user1@mail.ibadboy.net>”,看起來是不是怪怪的?為了方便閲讀,一般以$mydomain作為其參數,這樣就變成了“:“from  ‘user1’ <user1@ibadboy.net>”。
需要特殊説明的是:main.cf配置文件中所有以$開頭的字符串都是一個變量,變量的值就是變量名對應的選項的參數,例如$mydomin這個變量對應的值就是83行mydomin這個選項的參數。

修改後:

轉到第113行,找“inet_interfaces”這個關鍵字,這裏是定義postfix監聽的接口,默認只監聽本地迴環接口(127.0.0.1),通常的做法是讓其監聽所有的接口(值為all),或者也可以使用主機名為值,要求其只監聽主機名對應IP的接口。

修改後:

轉到164行,找“mydestination”關鍵字,這裏定義postfix可收信的主機名或域名。這裏其實很好理解,一封郵件的目的地址是我這台服務器我就收下,否則我當然不收了。

默認的選項是不包括域名的,通常情況下需要接收主機名或域名為本機的郵件,也就是修改為選項二,如下圖。

至此,一個簡單的postfix郵件服務器就配置好了,我們一共對配置文件做了如下幾個更改:1、指定了主機名,2、指定了郵件域,3、指定了發信源主機,4、使postfix監聽所有網卡,5、設置了允許收信的主機名及域名。
保存配置後,在保證selinux和防火牆均關閉的情況下啓動postfix服務。

service postfix start

服務測試:
推薦搭建完postfix後配合dovecot(MRA,郵件接收代理)一起在郵件客户端進行測試。
dovecot配置教程參考此篇文章:

CentOS 6下郵件接收代理程序——dovecot配置教程