1. 程式人生 > >linux下搭建郵件伺服器(sendmail)

linux下搭建郵件伺服器(sendmail)

一、Sendmail概述

sendmail是最重要的郵件傳輸代理程式。理解電子郵件的工作模式是非常重要的。一般情況下,我們把電子郵件程式分解成使用者代理,傳輸代理和投遞代理。使用者代理用來接受使用者的指令,將使用者的信件傳送至信件傳輸代理,如:outlook expressfoxmail等。而投遞代理則從信件傳輸代理取得信件傳送至終端使用者的郵箱,如:procmail

當用戶試圖傳送一封電子郵件的時候,他並不能直接將信件傳送到對方的機器上,使用者代理必須試圖去尋找一個信件傳輸代理,把郵件提交給它。信件傳輸代理得到了郵件後,首先將它儲存在自身的緩衝佇列中,然後,根據郵件的目標地址,信件傳輸代理程式將找到應該對這個目標地址負責的郵件傳輸代理伺服器,

並且通過網路將郵件傳送給它。對方的伺服器接收到郵件之後,將其緩衝儲存在本地,直到電子郵件的接收者察看自己的電子信箱。

顯然,郵件傳輸是從伺服器到伺服器的,而且每個使用者必須擁有伺服器上儲存資訊的空間(稱為信箱)才能接受郵件(傳送郵件不受這個限制)。可以看到,一個郵件傳輸代理的主要工作是監視使用者代理的請求,根據電子郵件的目標地址找出對應的郵件伺服器,將信件在伺服器之間傳輸並且將接收到的郵件緩衝或者提交給最終投遞程式。有許多的程式可以作為信件傳輸代理,但是sendmail是其中最重要的一個,事實證明它可以支援數千甚至更多的使用者,而且佔用的系統資源相當少。不過,sendmail的配置十分複雜,因此

,也有人使用另外的一些工具,如qmailpostfix等等。

sendmail程式得到一封待發送的郵件的時候,它需要根據目標地址確定將信件投遞給對應的伺服器,這是通過DNS服務實現的。例如一封郵件的目標地址是[email protected],那麼sendmail首先確定這個地址是使用者名稱(tom+機器名(example.com)的格式,然後,通過查詢DNS來確定需要把信件投遞給某個伺服器。

DNS資料中,與電子郵件相關的是MX記錄,例如在example.com這個域的DNS資料檔案中有如下設定:

IN MX 10 mail

IN MX 20 mail1

mail IN A 202.99.11.120

mail1 IN A 202.99.11.121

顯然,在DNS中說明example.com有兩個信件交換(MX)伺服器,於是,sendmail試圖將郵件傳送給兩者之一。一般來說,排在前面的的MX伺服器的優先級別比較高,因此服務器將試圖連線mail.example.com25埠,試圖將信件報文轉發給它。如果成功,你的smtp伺服器的任務就完成了,在這以後的任務,將由mail.example.com來完成。在一般的情況下,mail換器會自動把信件內容轉交給目標主機,不過,也存在這樣的情況,目標主機(比如example.com)可能並不存在,或者不執行smtp服務,而是由其mx交換器來執行信件的管理,這時候,最終的信件將儲存在mx機器上,直到使用者來察看它。

如果DNS查詢無法找出對某個地址的MX記錄(通常因為對方沒有信件交換主機),那麼sendmail將是試圖直接與來自郵件地址的主機對話並且傳送郵件。

二、Sendmail的配置檔案

sendmail安裝完畢後,具有多個配置檔案,所有檔案都旋轉在/etc/mail目錄下.其中主配置檔案為/etc/mail/sendmail.cf,與它存放在同一目錄下的許多檔案都具有重要功能,如下所示:

/etc/mail/access sendmail訪問資料庫檔案

/etc/aliases 郵箱別名

/etc/mail/local-host-names sendmail接收郵件主機列表

/etc/mail/submit.cf  /etc/mail/submit.mc sendmail輔助配置檔案

/etc/mail/mailertable 郵件分發列表

/etc/mail/virtusertable 虛擬使用者和域列表

三、搭建sendmail伺服器

1) Sendmail伺服器的網路配置:

伺服器IP地址是192.168.1.110DNS服務已經啟動,並可以解析example.com域名;具體操作如下圖所示:


2) 安裝sendmail所需軟體:

sendmail的主程式包sendmail-8.13.8預設已經安裝

sendmail-cf 程式是為了以後使用m4命令生成sendmail的主配置檔案

dovecot程式主要負責接收郵件,但該程式包與mysql-5perl-DBI程式有依賴關係,所以安裝該程式包時也必須安裝mysql-tperl-DBI。具體操作如下圖所示:


Sendmail所需軟體安裝完畢後,需要設定sendmail服務與dovecot服務開機時自動啟動,具體操作如下圖所示:


3) 修改sendmail相關配置檔案:

為了使本區域內部實現收發郵件,需要編輯/etc/mail/local-host-names檔案,並在該檔案中新增本區域的域名(本例中為example.com)。具體操作如下圖所示:


/etc/mail/local-host-names檔案的內容為:

由於sendmail主配置檔案sendmail.cf檔案的內容比較複雜,修改時的難度較大,所以我們可以先修改/etc/mail/sendmail.mc檔案,然後再將該檔案的內容匯入到sendmail.cf檔案。方法如下:vim /etc/mail/sendmail.mc,將檔案中的"Addr=127.0.0.1"修改為"Addr=郵件伺服器IP地址"即可;然後再使用m4 sendmail.mc > sendmail.cf命令將sendmail.mc的內容匯入到sendmail.cf中。具體操作如下圖所示

/etc/mail/sendmail.mc原始檔內容如下圖所示:


/etc/mail/sendmail.mc修改後的檔案內容如下圖所示:


使用m4 sendmail.mc > sendmail.cf 命令如下圖所示:


配置檔案修改完畢,此時可以啟動sendmail 服務與dovecot服務,操作如下圖所示:


4) 收發郵件測試

通過以上操作,已經可以實現在example.com區域內部收發郵件,我們可以新建立幾個郵件使用者並進行測試。

新建立郵件使用者操作如下圖所示:


使用當前使用者(root)tom使用者發郵件,郵件內容為"hello tom",郵件標題為"first mail"。並使用tom的身份登入郵箱,檢視郵件是否存在。

發郵件使用以下命令:echo "郵件內容"|mail -s "郵件標題收件人

收郵件使用以下命令:mutt -f pop://使用者名稱@郵件伺服器地址

具體操作如下圖所示:


開啟郵箱後可以看到一封新郵件,如下圖所示(郵件是發給tom使用者的,標題為first mail)


上圖中輸入回車後可以檢視郵件內容,如下圖所示:


5) 使用access.db檔案設定郵件中繼功能:

由於上述操作只能實現example.com區域內部收發郵件,不能實現內部使用者與外部郵件系統的通迅(例:上述操作不能實現example.com 的使用者向internet上的郵件系統發郵件)。所以我們需要修改/etc/mail/access檔案,以實現本區域的郵件使用者與外部郵件系統通迅。

方法如下:vim /etc/mail/access 檔案,並在該檔案中新增允許中繼的網段(即新增本郵件伺服器允許將哪些網段客戶端的郵件中繼轉發到外部區域)。本例中/etc/mail/access檔案的內容如下圖所示:


修改完/etc/mail/access檔案後,還需要使用makemap命令將access檔案的內容匯入到access.db檔案中,並且重新啟動sendmail服務即可。方法:makemap hash access.db < access,具體操作如下圖所示:


6) 郵件客戶端測試:

客戶端的基本網路配置如下圖所示:


配置foxmail客戶端軟體,並準備向外部郵件系統發郵件(本例中是向caiyuanji at gobenet.com.cn使用者發郵件),具體操作如下圖所示:


使用外部郵箱使用者登入,檢視是否已經收到郵件,本例中我們使用caiyuanji at gobent.com.cn使用者登入郵箱,如下圖所示:


7) 使用sasl實現公司外出(出差或分公司)員工與公司內部或外部的郵件通迅。

由於access.db只能通過IP網段來控制郵件中繼功能,它不能實現使用者名稱+密碼的認證方式來控制郵件中繼功能。所以它不能滿足公司外出員工使用自己的內部郵箱與網際網路上的其它郵件系統通迅。(假設公司有專線接入Internet且在其它城市有多個分支機構,公司有統一的域名example.com,所有員工的郵件地址類似如[email protected]。但是分支機構大多數沒有專線接入,用ISDN或者普通撥號方式入網,並且越來越多的ISP不允許以非ISP的郵件地址域名字尾傳送郵件,即使你是他們的撥號使用者。還有一種情況是移動使用者,經常外地出差,公司派遣使用者在外出差旅行期間,使用者需要傳送郵件,則也同樣需要一種認證方案去允許合法使用者的郵件relay。)

因此我們需要使用sasl的認證機制來控制合法使用者的郵件中繼(主要是通過驗證使用者名稱與密碼是否正確,然後控制使用者是否可以中繼郵件)

SASL簡單身份驗證和安全層 (Simple Authentication and Security Layer, ) 是一種為網路協議提供驗證和可選安全性服務的框架。應用程式將呼叫 SASL  /usr/lib/libsasl.so,此庫提供應用程式與各種 SASL 機制之間的膠合層。驗證過程及提供可選安全性服務時會使用 SASL 機制。

首先:安裝sasl的程式包cyrus-sasl,並啟動saslauthd服務(提示:別忘了使用chconfig saslauthd on 命令設定開機自動執行)。redhat Enterprise 5預設已經安裝,如下圖所示:


然後:修改/etc/mail/sendmail.mc檔案,將檔案中的"Addr=127.0.0.1"修改為"0.0.0.0",並將dnl  DAEMON_OPTIONS('Port=submission, Name=MSA, M=Ea ')dnl 行最前的dnl刪除。效果如下圖所示:


並且將該檔案中含有"MD5"的兩行 行首的"dnl"刪除,並儲存退出,效果如下圖所示:


  最後:使用 m4 sendmail.mc > sendmail.cf 命令將sendmail.mc檔案匯入sendmail.cf配置檔案中。並且重新啟動sendmail服務即可(server sendmail restart)

通過以上操作sendmail伺服器已經支援sasl認證功能。但還需要在客戶端軟體中設定支援"smtp身份驗證"功能。

例:郵件客戶端foxmail的設定:在賬戶屬性-->“郵件伺服器選項中選擇“SMTP伺服器需要身份驗證”,確定即可。操作如下圖所示:


四、關於iptables防火牆設定:

郵件傳送協議SMTP使用TCP25號埠,而郵件接收協議比較多,不同的郵件接收協議使用的埠號不同。例如:pop3使用TCP110埠,imap4使用TCP143埠,pops使用TCP995埠,imaps使用TCP993埠。所以當您使用不同的協議時需要在iptables防火牆中開放不同的埠。本例中開放的是TCP25TCP110埠,操作如下圖所示: