1. 程式人生 > >linux入門系列17--郵件系統之Postfix和Dovecot

linux入門系列17--郵件系統之Postfix和Dovecot

前文演示了通過Samba和NFS實現檔案共享,本篇演示使用Postfix和Dovecot在區域網實現電子郵件收發系統。 電子郵件系統是我們日常生活和工作中非常重要的一個網路服務,在windows下收發電子郵件系統工具很多,相信大家一定接觸過,比如qq郵箱、163郵箱等等。本文講解在Linux下通過部署Postfix和Dovecot來實現電子郵件的收發。 ### 一、電子郵件系統前世今生 #### 1.1 產生背景 大家今天熟知的網際網路起源於美國的ARPANET科研專案,這是20世紀60年代美國國防部發起的科研專案。阿帕網是當今網際網路的雛形,它也是世界上第一個運營的封包交換網路。 在阿帕網發展幾年之後,到1971年遇到了嚴峻的問題,當時參與該專案的科學家分佈在美國的不同地區,並且不同地區存在時差,這就導致了不能及時分享各自的科研成功,因此需要一種能夠藉助網路在計算機之間傳輸資料的方法。 看到這裡估計很多同學懵圈了,前文不是才講了ftp檔案傳輸以及檔案共享嗎?是的,他們雖然可以實現檔案的傳輸,但是使用場景卻不一樣,他們就像打電話一樣,需要伺服器和客戶端同時線上才能完成資料傳輸。手機上的語音信箱相信大家用過吧?郵件系統就類似語音信箱,即使你手機沒電或關機了,等你再次開機的時候,你仍然可以第一時間收到語音留言。 基於這種背景,當時參與阿帕網專案的成員中有一位來自麻省理工大學的教授,用了近一年時間完成了電子郵件的設計,在1971年秋通過sndmsg軟體向自己的另外一臺計算機發出了人類歷史上第一封電子郵件。 #### 1.2 電子郵件相關概念 ##### 1.2.1 電子郵件地址 就像平時收發快遞一樣,電子郵件要準確傳送給他人,那就需要對方提供明確唯一的收件地址。設計者規定電子信箱格式為“姓名@計算機主機名稱”,它選擇@符號作為間隔符的原因是,設計者認為人類的額名字和計算機主機名字中應該不會包含@這個特殊字元。 這很好理解,比如我們平時見到的郵箱:[email protected][email protected]等等。 ##### 1.2.2 電子郵件協議 電子郵件系統基於郵件協議來完成電子郵件的傳輸,常見郵件協議有:SMTP、POP3、IMAP4等。 ***SMTP(Simple Mail Transfer Protocol):簡單郵件傳輸協議***,用於傳送和中轉發出的電子郵件,佔用TCP埠25。 ***POP3(Post Office Protocol 3):郵局協議版本3***,用於將電子郵件儲存到本地主機,佔用TCP埠110。 ***IMAP4(Internet Message Access Protocol 4):Internet訊息訪問協議版本4***,用於在本地主 機上訪問郵件,佔用TCP埠143。 ##### 1.2.3 電子郵件傳輸過程 電子郵件在傳輸過程中涉及到幾個角色:***MUA、MTA、MDA***。 ***MUA(Mail User Agent):郵件使用者代理***,作用是替使用者收發郵件的伺服器。 ***MTA(Mail Transfer Agent):郵件傳輸代理***,作用是轉發處理不同電子郵件服務供應商之間的郵件,把來自於 MUA 的郵件轉發到合適的 MTA 伺服器。 ***MDA(Mail Delivery Agent):郵件投遞代理***,作用是把來自於MTA的郵件儲存到本地的收件箱中。 舉個例子,假設你用一個新浪信箱給一個谷歌信箱傳送一封電子郵件,其傳輸過程如下圖: ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161618668-1309815927.png) 如前所述,電子郵件系統不同於檔案傳輸需要雙方同時保持線上,當用戶傳送郵件後,無需等待投遞工作完成就可以下線。上圖中假設如果對方郵件伺服器(谷歌的MTA)宕機或離線,則發件伺服器(新浪的MTA)就會把要傳送的內容自動暫時儲存到他本地,等檢測到對方郵件伺服器恢復後再次投放,隨後收件人(MUA)就能在自己的郵箱中找到這封郵件了。 ##### 1.2.4 Linux下電子郵件收發程式 一個最基礎的電子郵件系統至少要能提供發件服務和收件服務。在Linux下使用基於SMTP協議的Postfix服務程式來提供發件服務功能,使用基於POP3協議的Dovecot服務程式提供收件服務功能。部署Postfix和Dovecot服務程式後,就可以使用郵件客戶端(如Foxmail、Outlook等)進行收發郵件。 在RHEL5、6及早期的Linux系統中,預設的發件服務是Sendmail,在RHEL7系統中替換成了Postfix。相對而言Postfix在穩定性、併發性方面有了很大改進,並且減少了很多不必要的配置步驟,使用更簡單。 ### 二、Linux區域網部署電子郵件系統 #### 2.1 準備工作 ##### 2.1.0 主機規劃及郵件系統架構 (1)主機及網路規劃 開始之前我們郵件系統規劃如下: | 主機名稱 | 作業系統 | IP地址 | | :---------------------- | :------- | :------------ | | 電子郵件系統及DNS伺服器 | Centos7 | 192.168.0.101 | | 客戶端主機(outlook) | win7 | 192.168.0.111 | | 客戶端主機(foxmail) | win10 | 192.168.0.112 | 域名採用heimatengyun.com (由於此演示是在區域網,自己單擊DNS伺服器,因此域名可以任意寫一個) Centos7是虛擬機器,win10是虛擬機器的宿主機,win7是另外一臺物理機,他們之間組成一個區域網。虛擬機器centos7作為電子郵件系統以及DNS伺服器,設定其網路模式為:橋接模式,目的是直連主機物理網路,以此構成一個區域網。 (2)電子郵件系統基礎架構 如1.2.4所述,我們採用Postfix和Dovecot來搭建一個基礎的電子郵件系統,其工作流程如下: ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161645009-1662611890.png) 通常情況下,我們的郵箱地址看起來應該形如:[email protected] 也就是按照“使用者名稱@主機地址或域名”的格式來進行規範。 為了提高可讀性不直接採用形如:[email protected]這種ip地址的形式。這種ip地址的方式一是因為不容易記住,另外還容易產生誤解(看起來有點像SSH遠端連線的地址),因此我們還需要先部署bind服務程式來為電子郵件伺服器和客戶端提供NDS域名解析服務。 > 篇幅所限,在此不具體分析Bind服務的使用和配置,只給出具體的操作步驟。 下邊就來演示下bind服務程式的配置及管理 ##### 2.1.1 配置伺服器主機名稱 需要保證centos伺服器主機名稱與發信域名保持一致 ~~~ [root@email ~]# hostnamectl set-hostname mail.heimatengyun.com [root@email ~]# hostname mail.heimatengyun.com [root@mail ~]# cat /etc/hostname mail.heimatengyun.com [root@mail ~]# ~~~ 設定主機名稱也可以直接修改/etc/hostname檔案。 另外可以看到修改後的主機名稱只顯示了域名前邊部分([root@mail ~]),而非完整的域名([[email protected] ~])。 ##### 2.1.2 防火牆策略設定 清空iptables防火牆預設策略,避免因防火牆中預設存在的策略阻止了客戶端DNS解析域名及收發郵件。 ~~~ [root@mail ~]# iptables -F [root@mail ~]# ~~~ ***要是嫌麻煩或為了避免干擾,也可以直接先關掉防火牆和selinux。*** ##### 2.1.3 使用bind服務為電子郵件系統提供域名解析 (1)安裝bind服務 ~~~ [root@mail ~]# yum install bind-chroot Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile ...省略部分內容 Complete! [root@mail ~]# ~~~ (2)主配置檔案配置 bind服務程式的名稱為named,因此需要找到對應的配置檔案/etc/named.conf,按如圖方式進行修改。 ~~~ [root@mail ~]# vim /etc/named.conf ~~~ ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161658896-188505532.png) 將上圖2處都改為any,表示伺服器上所有的IP都可以提供DNS域名解析服務,允許所有人對本地伺服器傳送DNS查詢請求。 (3)區域配置檔案配置 區域配置檔案為/etc/named.rfc1912.zones,為了給使用者提供配置參考,該檔案中已預設有了一些無關緊要的解析引數,我們可以直接把檔案清空或將我們的內容新增到檔案末尾即可 ~~~ [root@mail ~]# vim /etc/named.rfc1912.zones zone "heimatengyun.com" IN { type master; file "heimatengyun.com.zone"; allow-update {none;}; }; ~~~ 直接在檔案末尾新增上述配置,儲存並退出。 (4)域名資料檔案配置 建立前一步中配置的資料檔案:heimatengyun.com.zone ~~~ [root@mail ~]# cp -a /var/named/named.localhost /var/named/heimatengyun.com.zone [root@mail ~]# vim /var/named/heimatengyun.com.zone ~~~ > 注意使用cp命令時記得新增-a引數,保留原始檔案的所有者、所屬組、許可權等資訊。這樣bind服務程式才能順利讀取檔案內容。 按照如下提示根據自身需要修改即可 ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161714061-2018942677.png) 如上配置,對應的伺服器主機名即為mail.heimatengyun.com,而郵件域為@heimatengyun.com。 > 需要注意,域名後有一個點,如果配置檔案配錯了會導致後邊重啟bind服務的時候啟動不起來。如果遇到啟動不起來的情況請仔細檢查配置檔案。 配置好後需要重啟bind服務使其生效。 ~~~ [root@mail ~]# systemctl restart named [root@mail ~]# systemctl enable named ln -s '/usr/lib/systemd/system/named.service' '/etc/systemd/system/multi-user.target.wants/named.service' [root@mail ~]# ~~~ (5)DNS伺服器地址配置 通過nmtui命令將DNS伺服器地址配置為本地的IP地址。忘記操作步驟的請看“linux入門系列11--Centos7網路服務管理”2.2節。 ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161727162-918937749.png) 修改完成後重啟網路服務使配置生效。 ~~~ [root@mail ~]# systemctl restart network ~~~ ##### 2.1.4 測試域名解析 通過nslookup命令測試本地DNS是否生效 ~~~ [root@mail ~]# nslookup > mail.heimatengyun.com Server: 192.168.0.101 Address: 192.168.0.101#53 Name: mail.heimatengyun.com Address: 192.168.0.101 > exit [root@mail ~]# ~~~ 說明本地DNS解析服務已經生效了,接下來就開始部署電子郵件系統了。 #### 2.2 Postfix發件系統 Postfix是一款由IBM資助研發的免費開源電子郵件服務程式,能夠很好地相容 Sendmail 服務程式,由許多小模組組成,每個小模組都可以完成特定的功能,因此可在生產工作環境中根據需求靈活搭配它們。 ##### 2.2.1 安裝Postfix服務 ~~~ [root@mail ~]# rpm -q postfix postfix-2.10.1-6.el7.x86_64 [root@mail ~]# ~~~ 可以看到,在RHEL7中已經預設安裝了Postfix。 防火牆禁用 ##### 2.2.2 配置Postfix服務 主配置檔案為/etc/postfix/main.cf,其中主要的引數如下: | 引數 | 作用 | | :-------------- | :----------------------- | | myhostname | 郵局系統的主機名 | | mydomain | 郵局系統的域名 | | myorigin | 從本機發出郵件的域名名稱 | | inet_interfaces | 監聽的網絡卡介面 | | mydestination | 可接收郵件的主機名或域名 | | mynetworks | 設定可轉發哪些主機的郵件 | | relay_domains | 設定可轉發哪些網域的郵件 | ~~~ [root@mail ~]# vim /etc/postfix/main.cf ~~~ 總共有5處需要修改,分別如下: ~~~ myhostname = mail.heimatengyun.com ~~~ 此處定義一個myhostname 的變數,用來儲存伺服器的主機名稱,以供後邊的引數呼叫。 ~~~ mydomain = heimatengyun.com ~~~ 定義一個名為 mydomain 的變數,用來儲存郵件域的名稱,以供後邊的引數呼叫。 ~~~ myorigin = $mydomain ~~~ 呼叫前面的mydomain變數,用來定義發出郵件的域。這樣通過呼叫變數的好處是避免重複寫入資訊,以及便於日後統一修改。 ~~~ inet_interfaces = all ~~~ 定義網絡卡監聽地址,可以指定要使用伺服器的哪些IP地址對外提供電子郵件服務;也可以寫成 all,代表所有IP地址都能提供電子郵件服務。 ~~~ mydestination = $myhostname , $mydomain ~~~ 定義可接收郵件的主機名或域名列表。這裡可以直接呼叫前面定義好的 myhostname 和 mydomain變數。 ##### 2.2.3 建立電子郵件系統登入使用者 與之前提到的vsftp服務程式一樣,postfix可以使用本地系統的賬號密碼進行登入。(建立的建立應該新增nologin禁止登陸,但此處為了後邊方便演示,使其允許登入) ~~~ [root@mail ~]# useradd heima [root@mail ~]# echo "123456" | passwd --stdin heima Changing password for user heima. passwd: all authentication tokens updated successfully. ~~~ ##### 2.2.4 重啟服務並加入開機啟動 ~~~ [root@mail ~]# systemctl restart postfix [root@mail ~]# systemctl enable postfix ~~~ #### 2.3 Dovecot收件系統 Dovecot是一款能夠為Linux系統提供IMAP和POP3電子郵件服務的開源服務程式,安全性高、配置簡單、執行速度快並且佔用資源少,推薦使用。 ##### 2.3.1 安裝Dovecot ~~~ [root@mail ~]# yum install dovecot ...省略部分內容 Installed: dovecot.x86_64 1:2.2.36-3.el7_7.1 Complete! [root@mail ~]# ~~~ ##### 2.3.2 配置Dovecot (1)主配置檔案 Dovecot服務程式的主配置檔案為/etc/dovecot/dovecot.conf 。 ~~~ [root@mail ~]# vim /etc/dovecot/dovecot.conf ~~~ 一般情況下有2處需要修改 第一處: ~~~ protocols = imap pop3 lmtp disable_plaintext_auth = no ~~~ 找到以上行並取消註釋,並在其下新增一行,允許使用者使用明文進行密碼驗證。 > 之所以這樣操作,是因 為 Dovecot 服務程式為了保證電子郵件系統的安全而預設強制使用者使用加密方式進行登入, 而由於當前還沒有加密系統,因此需要新增該引數來允許使用者的明文登入。 第二處: ~~~ #login_trusted_networks =192.168.78.0/24 ~~~ 找到login_trusted_networks,根據需要來選擇取消註釋並配置允許登入的網段地址。我們可以在這裡限制只有來自於某個網段的使用者才能使用電子郵件系統。如果想允許所有人都能使用,則不用修改本引數。 為了演示方便,此處我們不修改,使其允許所有人都能使用。 (2)其他配置檔案 將配置檔案/etc/dovecot/conf.d/10-ssl.conf的ssl設定為no ~~~ [root@mail ~]# vim /etc/dovecot/conf.d/10-ssl.conf ...省略部分內容 ssl = no ~~~ > 這步如果不設定的話,客戶端通過outlook無法接受郵件。我在這裡踩了個大坑,希望大家注意。 ##### 2.3.3 配置郵件格式與儲存路徑 在子配置檔案/etc/dovecot/conf.d/10-mail.conf 中,找到mail_location並把註釋去掉即可 ~~~ [root@mail ~]# vim /etc/dovecot/conf.d/10-mail.conf mail_location = mbox:~/mail:INBOX=/var/mail/%u ~~~ 修改後儲存並退出。 切換到剛才建立的heima賬號,並在其家目錄中建立用於儲存郵件的目錄。 ~~~ [root@mail ~]# su - heima [heima@mail ~]$ mkdir -p mail/.imap/INBOX [heima@mail ~]$ exit logout [root@mail ~]# ~~~ 最後記得重啟dovecot服務 ~~~ [root@mail ~]# systemctl restart dovecot [root@mail ~]# systemctl enable dovecot ln -s '/usr/lib/systemd/system/dovecot.service' '/etc/systemd/system/multi-user.target.wants/dovecot.service' [root@mail ~]# ~~~ 至此基本的電子郵件系統就安裝完畢,接下來進行測試收發電子郵件。 #### 2.4 測試收發郵件 經過上邊的操作,基本的電子郵件系統以及構建好了,如何驗證該電子郵件系統是否可用呢?以下三種方法中根據個人喜好選取一種即可,為了保持完整性,分別進行了測試。 ##### 2.4.1 採用mail命令簡單測試收發 用mial命令就可以實現收發郵件,不同使用者登入到系統中用mail命令,就可以看到收發的郵件了。理論上不同使用者登入系統只能看到自己的郵件,比如當前使用者如果是root,那他只能看到別人發給他的郵件(一種特殊情況是可以設定郵件別名,這樣就可以看到其他人的郵件),如果當前使用者是heima,那也只能看到它自己的郵件。 用root使用者分別給自己發郵件並檢視 ~~~ [root@mail ~]# echo "msg" | mail -s "first email to root" [email protected] [root@mail ~]# mail ... 省略部分內容 N 10 root Tue Feb 4 22:22 18/609 "first email to root" & exit You have mail in /var/spool/mail/root [root@mail ~]# ~~~ root給heima發郵件並切換到heima賬戶檢視郵件 ~~~ [root@mail ~]# echo "msg" | mail -s "first email to heima" [email protected] [root@mail ~]# su - heima Last login: Tue Feb 4 15:43:52 CST 2020 on :1 ABRT has detected 1 problem(s). For more info run: abrt-cli list --since 1580802239 [heima@mail ~]$ mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/heima": 2 messages 1 new 1 Mail System Internal Tue Feb 04 20:15 13/562 "DON'T DELETE THIS MES" >N 2 root Tue Feb 4 22:22 18/613 "first email to heima" & exit You have mail in /var/spool/mail/heima [heima@mail ~]$ exit logout [root@mail ~]# ~~~ 可以看到收件和發件都正常。 但是這樣還不夠,這是在Centos伺服器內部,還需要客戶端進行測試,以下outlook和foxmail任選其一即可 ##### 2.4.2 採用outlook測試 在win7上安裝outlook2007來進行測試,先將win7的dns設定為centos的ip地址,即192.168.0.101 安裝並配置outlook,過程如下: (1)執行outlook ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161754390-1389079684.png) 點選下一步按鈕 (2)配置電子郵件,保持預設即可 ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161804345-1701220431.png) 點選下一步按鈕 (3)選擇電子郵件服務協議型別,保持預設即可 ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161814427-41811516.png) 點選下一步按鈕 (4)填寫賬戶資訊 ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161826014-1937673079.png) 姓名任意取,電子郵件為前邊建立的系統使用者heima加上發件域,即為:[email protected],密碼為heima賬戶的登入密碼。 點選下一步按鈕 (5)電子郵件服務登入驗證 ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161838039-1469221413.png) 之前我們配置Dovecot為使用明文登入電子郵件服務,而Outlook軟體預設會通過SSL加密協議嘗試登入,因此會提示加密連線不可用。 再次點選“下一步”按鈕。 ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161848658-1728272789.png) 順利的話,就會出現這個配置成功的介面。實際可能你的操作過程中會遇到一些問題,***此處如果賬號密碼有問題或者登陸遠端郵件系統有問題都會彈出測試介面,如果遇到問題請嚴格按照前邊的步驟進行檢查***。筆者此處就曾遇到只能發件不能收件的問題,原因是由於未開啟ssl,需要在docovet中將其關閉。 新增成功後,就可以像自己以及向root使用者傳送郵件了。其操作步驟給發qq郵件是一直的,相信大家一定用過qq郵件,所以就不在多嘴了。 截圖為證 ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161858507-217779349.png) ##### 2.4.3 採用foxmail測試 在win10上安裝foxmail進行測試,同理先將win10dns設定為centos的ip地址。 foxmail官方地址:https://www.foxmail.com/ (1)安裝foxmail 非常簡單,直接根據嚮導即可。 (2)設定郵件賬號 安裝完成後,設定郵件賬號,選擇“其他郵箱” ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161913218-1460477764.png) 輸入賬號密碼 ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161926465-877150236.png) 點選建立按鈕,在介面中選擇接收伺服器型別為POP3 ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161937566-660031662.png) 點選建立按鈕 ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304161950125-302581537.png) 點選完成按鈕,即可完成安裝和設定。 設定成功後就可以正常收發郵件了。 截圖為證 ![](https://img2020.cnblogs.com/blog/556128/202003/556128-20200304162000986-619940235.png) 通過對比,個人感覺foxmail不如outlook穩定,並且收件較慢。 通過本文的演示,大家應該理解電子郵件系統的基本原理和流程,並可以在區域網搭建一個基本的電子郵件收發系統。 下一篇文章將演示apache服務搭建靜態web