前文演示了通過Samba和NFS實現文件共享,本篇演示使用Postfix和Dovecot在局域網實現電子郵件收發系統。
電子郵件系統是我們日常生活和工作中非常重要的一個網絡服務,在windows下收發電子郵件系統工具很多,相信大家一定接觸過,比如qq郵箱、163郵箱等等。本文講解在Linux下通過部署Postfix和Dovecot來實現電子郵件的收發。
一、電子郵件系統前世今生
1.1 產生背景
大家今天熟知的互聯網起源於美國的ARPANET科研項目,這是20世紀60年代美國國防部發起的科研項目。阿帕網是當今互聯網的雛形,它也是世界上第一個運營的封包交換網絡。
在阿帕網發展幾年之后,到1971年遇到了嚴峻的問題,當時參與該項目的科學家分布在美國的不同地區,並且不同地區存在時差,這就導致了不能及時分享各自的科研成功,因此需要一種能夠借助網絡在計算機之間傳輸數據的方法。
看到這里估計很多同學懵圈了,前文不是才講了ftp文件傳輸以及文件共享嗎?是的,他們雖然可以實現文件的傳輸,但是使用場景卻不一樣,他們就像打電話一樣,需要服務器和客戶端同時在線才能完成數據傳輸。手機上的語音信箱相信大家用過吧?郵件系統就類似語音信箱,即使你手機沒電或關機了,等你再次開機的時候,你仍然可以第一時間收到語音留言。
基於這種背景,當時參與阿帕網項目的成員中有一位來自麻省理工大學的教授,用了近一年時間完成了電子郵件的設計,在1971年秋通過sndmsg軟件向自己的另外一台計算機發出了人類歷史上第一封電子郵件。
1.2 電子郵件相關概念
1.2.1 電子郵件地址
就像平時收發快遞一樣,電子郵件要准確發送給他人,那就需要對方提供明確唯一的收件地址。設計者規定電子信箱格式為“姓名@計算機主機名稱”,它選擇@符號作為間隔符的原因是,設計者認為人類的額名字和計算機主機名字中應該不會包含@這個特殊字符。
這很好理解,比如我們平時見到的郵箱:xxxx@qq.com、xxx@163.com等等。
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的郵件保存到本地的收件箱中。
舉個例子,假設你用一個新浪信箱給一個谷歌信箱發送一封電子郵件,其傳輸過程如下圖:
如前所述,電子郵件系統不同於文件傳輸需要雙方同時保持在線,當用戶發送郵件后,無需等待投遞工作完成就可以下線。上圖中假設如果對方郵件服務器(谷歌的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來搭建一個基礎的電子郵件系統,其工作流程如下:
通常情況下,我們的郵箱地址看起來應該形如:test@heimatengyun.com 也就是按照“用戶名@主機地址或域名”的格式來進行規范。
為了提高可讀性不直接采用形如:test@192.168.0.1這種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 ~]),而非完整的域名([root@mail.heimatengyun.com ~])。
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
將上圖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服務程序才能順利讀取文件內容。
按照如下提示根據自身需要修改即可
如上配置,對應的服務器主機名即為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節。
修改完成后重啟網絡服務使配置生效。
[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" root@heimatengyun.com
[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" heima@heimatengyun.com
[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
點擊下一步按鈕
(2)配置電子郵件,保持默認即可
點擊下一步按鈕
(3)選擇電子郵件服務協議類型,保持默認即可
點擊下一步按鈕
(4)填寫賬戶信息
姓名任意取,電子郵件為前邊創建的系統用戶heima加上發件域,即為:heima@heimatengyun.com,密碼為heima賬戶的登錄密碼。
點擊下一步按鈕
(5)電子郵件服務登錄驗證
之前我們配置Dovecot為使用明文登錄電子郵件服務,而Outlook軟件默認會通過SSL加密協議嘗試登錄,因此會提示加密連接不可用。
再次點擊“下一步”按鈕。
順利的話,就會出現這個配置成功的界面。實際可能你的操作過程中會遇到一些問題,此處如果賬號密碼有問題或者登陸遠程郵件系統有問題都會彈出測試界面,如果遇到問題請嚴格按照前邊的步驟進行檢查。筆者此處就曾遇到只能發件不能收件的問題,原因是由於未開啟ssl,需要在docovet中將其關閉。
添加成功后,就可以像自己以及向root用戶發送郵件了。其操作步驟給發qq郵件是一直的,相信大家一定用過qq郵件,所以就不在多嘴了。
截圖為證
2.4.3 采用foxmail測試
在win10上安裝foxmail進行測試,同理先將win10dns設置為centos的ip地址。
foxmail官方地址:https://www.foxmail.com/
(1)安裝foxmail
非常簡單,直接根據向導即可。
(2)設置郵件賬號
安裝完成后,設置郵件賬號,選擇“其他郵箱”
輸入賬號密碼
點擊創建按鈕,在界面中選擇接收服務器類型為POP3
點擊創建按鈕
點擊完成按鈕,即可完成安裝和設置。
設置成功后就可以正常收發郵件了。
截圖為證
通過對比,個人感覺foxmail不如outlook穩定,並且收件較慢。
通過本文的演示,大家應該理解電子郵件系統的基本原理和流程,並可以在局域網搭建一個基本的電子郵件收發系統。
下一篇文章將演示apache服務搭建靜態web網站。