一、基礎知識梳理
MUA (Mail User Agent)
MUA 既是"郵件使用者代理人",因為除非你可以直接利用類似 telnet 之類的軟體登入郵件主機來主動發出信件,否則您就得要透過 MUA 來幫你送信到郵件主機上頭去。 最常見的 MUA 像是 Mozilla 推出的Thunderbird ( 雷鳥 ) 自由軟體, 或者是 Linux 桌面 KDE 常見的 Kmail ,及Windows 內件的 Outlook Express (OE) 等 。MUA 主要的功能就是收受郵件主機的電子郵件,以及提供使用者瀏覽與編寫郵件的功能!
MTA (Mail Transfer Agent)
MUA 幫使用者傳送郵件到郵件主機上,那這部郵件主機如果能夠幫使用者將這封信寄出去, 那它就是一部郵件傳送主機 (MTA) 啦!這個 MTA 就是『郵件傳送代理人』的意思。也來顧名思義一下,既然是『傳送 代理人』, 那麼使用者寄出的信,與使用者要收信時,就是找它 (MTA) 就對啦!基本上, MTA 的功能有這些:
1)收受信件:使用簡單郵件傳送協議 (SMTP)
MTA 主機最主要的功能就是將來自客戶端或者是其它 MTA 的來信收下來,這個時候 MTA 使用的是 Simple Mail Transfer Protocol (SMTP) ,它使用的是25埠。
2) 轉遞信件
如果該封信件的目的地並不是本身使用者,且該封信的相關資料符合使用 MTA 的權力, 那麼MTA 就會將該封信再傳送到下一部主機上。這即是所謂的轉遞 (Relay) 的功能。
3)響應使用者的收信要求
POP 或 IMAP 協定使用者可以透過 MTA 主機提供的郵政服務協議 (Post Office Protocol, POP) 來收下自己的信件, 也可以透過IMAP (Internet Message Access Protocol) 協議將自己的信件保留在郵件主機上面, 並進一步建立郵件資料匣等進階工作。
總之,一般提到的 Mail Server 就是 MTA !而嚴格來說, MTA 其實僅是指 SMTP 這個協議而已。 而達成 M他的 SMTP 功能的主要套件包括老牌的 sendmail ,後起之秀的 postfix ,還有qmail等等。
MDA (Mail Delivery Agent)
字面上的意思是『郵件遞送代理人』的意思。事實上,這個 MDA 是掛在 MTA 底下的一個小程式, 最主要的功能就是: 分析由 MTA 所收到的信件表頭或內容等資料, 來決定這封郵件的去向。 所以說,上面提到的MTA 的信件轉遞功能,其實是由 MDA 達成的。 舉例來說,如果 MTA 所收到的這封信目標是自己,那麼MDA 會將這封信給它轉到使用者的信箱 (Mailbox) 去, 如果不是呢?那就準備要轉遞出去了。此外, MDA 還有分析與過濾郵件等功能喔!如:過濾垃圾郵件,自動回覆,自動轉發等……。
各主要的 MTA 程式 (sendmail,postfix...) 都有自己的 MDA 功能,不過有些外掛的程式功能更強大, 舉例來說 procmail就是一個過濾的好幫手,另外 Mailscanner + Spamassassion 也是可以使用的一些 MDA 喔。
Mailbox
就是電子郵件信箱!簡單的說,就是某個賬號專用的信件收受檔案。我們的 Linux 系統預設的信箱都是放在 /var/spool/mail/ 使用者賬號 中! 若 MTA 所收到的信件是本機的使用者, MDA 就會將信件送到該 mailbox 當中去!
POP3
(Post Office Protocol 3)即郵局協議的第3個版本,它規定怎樣將個人計算機連線到Internet的郵件伺服器和下載電子郵件的電子協議。它是因特網電子郵件的第一個離線協議標準,POP3允許使用者從伺服器上把郵件儲存到本地主機(即自己的計算機)上,同時刪除儲存在郵件伺服器上的郵件,而POP3伺服器則是遵循POP3協議的接收郵件伺服器,用來接收電子郵件的。
IMAP
Interactive Mail Access Protocol(互動式郵件存取協議)是由美國華盛頓大學所研發的一種郵件獲取協議。它的主要作用是郵件客戶端(例如MS Outlook Express)可以通過這種協議從郵件伺服器上獲取郵件的資訊,下載郵件等。無論是POP3還是IMAP都是描述如何從郵箱取出郵件。
請注意:POP3/IMAP和SMTP可以組建在不同的伺服器上,經常使用MUA的使用者肯定記得軟體的設定中經常將POP3/IMAP和SMTP進行分開設定。
——————————SMTP、POP3、IPMAP三者說明——————————
簡單來說:SMTP是郵件傳送協議;POP3和IMAP是郵件接收協議。其中: 1)SMTP 全稱是"Simple Mail Transfer Protocol",目標是向使用者提供高效、可靠的郵件傳輸。它是一組用於由源地址到目的地址傳送郵件的規則, 通過它來控制郵件的中轉方式。SMTP協議屬於TCP/IP 協議簇,它幫助每臺計算機在傳送或中轉信件時找到下一個目的地。 SMTP伺服器就是遵循SMTP協議的傳送郵件伺服器。 SMTP認證,簡單地說就是要求必須在提供了賬戶名和密碼之後才可以登入SMTP 伺服器,這就使得那些垃圾郵件的散播者無可乘之機。 增加SMTP認證的目的是為了使使用者避免受到垃圾郵件的侵擾。 2)POP3 POP3是Post Office Protocol 3的簡稱,即郵局協議的第3個版本,它規定怎樣將個人計算機連線到Internet的郵件伺服器和下載電子郵件的電子協議。 它是因特網電子郵件的第一個離線協議標準,POP3允許使用者從伺服器上把郵件儲存到本地主機(即自己的計算機)上,同時刪除儲存在郵件伺服器上的 郵件,而POP3伺服器則是遵循POP3協議的接收郵件伺服器,用來接收電子郵件的 3)IMAP IMAP全稱是Internet Mail Access Protocol,即互動式郵件存取協議,它是跟POP3類似郵件訪問標準協議之一。不同的是,開啟了IMAP後,您在電子 郵件客戶端收取的郵件仍然保留在伺服器上,同時在客戶端上的操作都會反饋到伺服器上,如:刪除郵件,標記已讀等,伺服器上的郵件也會做相應 的動作。所以無論從瀏覽器登入郵箱或者客戶端軟體登入郵箱,看到的郵件以及狀態都是一致的。 ====================POP3和IMAP的區別==================== POP3協議允許電子郵件客戶端下載伺服器上的郵件,但是在客戶端的操作(如移動郵件、標記已讀等),不會反饋到伺服器上,比如通過客戶端收取了 郵箱中的3封郵件並移動到其他資料夾,郵箱伺服器上的這些郵件是沒有同時被移動的 。 而IMAP提供webmail 與電子郵件客戶端之間的雙向通訊,客戶端的操作都會反饋到伺服器上,對郵件進行的操作,伺服器上的郵件也會做相應的動作。 同時,IMAP像POP3那樣提供了方便的郵件下載服務,讓使用者能進行離線閱讀。IMAP提供的摘要瀏覽功能可以讓你在閱讀完所有的郵件到達時間、主題、 發件人、大小等資訊後才作出是否下載的決定。此外,IMAP 更好地支援了從多個不同裝置中隨時訪問新郵件。
總之: IMAP 整體上為使用者帶來更為便捷和可靠的體驗。POP3 更易丟失郵件或多次下載相同的郵件,但 IMAP 通過郵件客戶端與webmail 之間的雙向同步功能很好地避免了這些問題。 注意: 若在web郵箱中設定了“儲存到已傳送”,使用客戶端POP服務發信時,已發郵件也會自動同步到網頁端“已傳送”資料夾內。
網易163免費郵箱相關伺服器資訊:
Maildirs
Maildirs是使用非常廣泛的e-mail郵件儲存格式。也可以說是一種基於目錄的郵件儲存格式。它在新增,移動或刪除時並不依賴於應用程式級的檔案鎖定來維護訊息的完成性。每一個訊息(每一封郵件)被儲存在一個獨立的且名稱唯一的檔案中。所有的更改均使用基於檔案系統的原子操作(atomic filesystem operations )因此檔案系統來控制檔案鎖定從而避免一致性問題。通常Maildir為一個目錄(名稱為Maildir)其下包含三個子目錄,分別為tmp,new和cur。
Courier IMAP
Courier IMAP server 是使用Maildir儲存格式的高速,可擴充套件,企業級 IMAP 伺服器。許多E-mail提供商使用Courier IMAP server來處理幾十萬的郵件使用者,使用它建立IMAP和POP3集合代理,可以說Courier IMAP server 簡直具有無限的水平擴充套件能力。在代理配置環境中,一些Courier 伺服器提供IMAP和POP3服務,它們等待客戶端登陸請求,查詢並操作郵件使用者的mailbox,與伺服器建立代理連線,所有的這些操作都在一個單獨的,無縫連線的程式中。
Courier-IMAP主要特點:
- 小巧而高效;
- 提供多種使用者認證模組和方式;
- 支援虛擬郵箱;
- 可限制IMAP同時登入的總數目及同一個IP地址同時登入的數目,能有效保護系統在受到拒絕服務(Denial-of-service)攻擊時不致因超載而癱瘓;
maildrop
具有過濾功能的郵件投遞代理(MDA)。
Courier-Authlib
Courier authentication library 為其他 Courier 應用程式提供驗證服務。
SASL
SASL的英文全稱是Simple Authentication and Security Layer,即簡單驗證和安全層。SMTP 協議並沒有提供使用者驗證功能,很容易匿名中轉郵件。即使限制了可以轉發的網段,也不安全。他的定義是: a method for adding authentication support to connection-based protocols,為基於連線的協議提供認證功能。SASL是一個膠合(glue)庫,通過這個庫把應用層 與 形式多樣的認證系統整合在一起。這有點類似於PAM,但是後者是認證方式,決定什麼人可以訪問什麼服務,而SASL是認證過程,側重於信任建立過程,這個過程可以呼叫PAM來建立信任關係。
Open-Relay是什麼?
Open-Relay(開放轉發或匿名轉發)是指由於郵件伺服器不理會郵件傳送者或郵件接受者的是否為系統所設定的使用者,而對所有的入站郵件一律進行轉發(RELAY)的功能。通常,若郵件伺服器的此功能開放,則我們一般稱此郵件伺服器是Open-Relay的。
由於Internet E-mail採用開放式標準,所以MTA、MDA、MUA等不同角色,可分別由許多不同的軟體包來扮演。實現相同協議的不同包,可以彼此互相交流,而不管它們是在什麼系統上執行。如果將一個完整的E-mail郵件系統集中在一起,可以發現的是處理SMTP的是一套軟體,處理POP/IMAP的是另一套軟體。但郵件系統中的每一種角色,都有許多不同的軟體可以選擇。
二、Postfix+Extmail+Extman環境部署過程
1)基礎環境準備
[root@mail ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@mail ~]# ifconfig|grep addr|grep Bcast|cut -d":" -f2|awk -F" " '{print $1}' 192.168.10.202 [root@mail ~]# hostname mail.kevin.com [root@mail ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.202 mail.kevin.com [root@mail ~]# /etc/init.d/iptables stop [root@mail ~]# setenforce 0 [root@mail ~]# getenforce [root@mail ~]# cat /etc/sysconfig/selinux ...... SELINUX=disabled 軟體部署說明 ------------------------------------------------------------------------------ 軟體名稱 功能 Postfix MTA MySQL 儲存postfix虛擬使用者資訊 courier-authlib 搭配SASL做驗證 cyrus-sasl 把應用(E-Mail)與驗證(courier-authlib)結合在一起 courier-imap 結合postfix提供imap/imaps與pop3/pop3s服務 perl 直譯器 pcre 安裝Imap需要-- Perl相容正規表示式 httpd web伺服器 Extmail webmail伺服器 Extman 結合extmail管理郵件使用者 Clamav 防毒軟體 amavisd-new 掃描郵件病毒 Spamassassin 防垃圾郵件
2)軟體下載
web伺服器軟體 這裡我安裝了LAMP環境,其實只需要http、mysql,不需要php。 LAMP安裝包下載地址:https://pan.baidu.com/s/1pYo9X7f1vy5d70eV0RDYWA 提取密碼:ebj8 郵件伺服器軟體 相關軟體下載地址:https://pan.baidu.com/s/1Ai6FlJoUzeWGLXjGjeV0sg 提取密碼:c4ft
3)LAMP環境安裝
安裝文件:http://www.cnblogs.com/kevingrace/p/6395131.html
apache的配置 下載地址:https://pan.baidu.com/s/1f8kMhADiOzAYqxv990136g 提取密碼:g1vy [root@mail extra]# pwd /usr/local/apache/conf/extra [root@mail extra]# cat extmail.conf <VirtualHost *:80> ServerName mail.kevin.com DocumentRoot /data/web/ </VirtualHost> [root@mail extra]# cat /data/web/test.php <?php phpinfo() ?> 如上,在後面的extmail和extman還沒安裝之前,extmail.conf配置暫時如上所示內容,這樣便於進行httpd服務的測試。 解析mail.kevin.com到192.168.10.202機器上(或做hosts繫結),然後訪問http://mail.kevin.com/test.php即可測試! 待安裝完extmail和extman之後,上面的extmail.conf檔案配置如下: [root@mail extra]# cat extmail.conf <VirtualHost *:80> ServerName mail.kevin.com DocumentRoot /data/web/ ScriptAlias /extmail/cgi /data/web/extmail/cgi ScriptAlias /extman/cgi /data/web/extman/cgi Alias /extmail /data/web/extmail/html Alias /extman /data/web/extman/html </VirtualHost>
4)Mysql安裝
安裝文件:http://www.cnblogs.com/kevingrace/p/6109679.html
mysql一鍵安裝指令碼下載地址:https://pan.baidu.com/s/1oRePULz4gu_y7oFuc4mB9A 提取密碼:bhcw
安裝mysql的時候,要解除安裝系統自帶的mysql,但要記住,最好不要解除安裝mysql-libs [root@mail ~]# rpm -qa | grep mysql mysql-libs-5.1.73-8.el6_8.x86_64 如果解除安裝了mysql-libs,那麼就會把預設的libmysqlclient.so.16庫檔案刪除,而編譯安裝的mysql,庫檔案是libmysqlclient.so.18。 但是登入extmail時會依賴libmysqlclient.so.16這個庫檔案,這樣就會報如下錯: install_driver(mysql) failed: Can't load '/usr/lib64/perl5/auto/DBD/mysql/mysql.so' for module DBD::mysql: libmysqlclient.so.16: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200. at (eval 17) line 3 Compilation failed in require at (eval 17) line 3. Perhaps a required shared library or dll isn't installed where expected at /data/web/extmail/libs/Ext/Auth/MySQL.pm line 45 這時候解決辦法:https://www.cnblogs.com/kevingrace/p/9378776.html 其實也就是重新安裝mysql,重新生成libmysqlclient.so.16庫檔案。 所以最好還是不要刪除mysql-libs,免得後面再重新安裝自帶的mysql,重新生成libmysqlclient.so.16的庫檔案。
5)建立相關使用者
使用者 組 簡介 備註 mysql mysql mysql使用者和組 安裝mysql時創 vmail vmail Postfix虛擬賬戶所使用的使用者和組 無home目錄不可能登陸系統。uid: 1001,gid: 1001 無 postdrop Postfix專用組 該組不能包含任何成員,包括前面的postfix虛擬帳號也不例外。gid:1002 postfix postfix Postfix主程式使用的使用者和組 uid:1000,gid:1000 clamav clamav clamav 防毒軟體使用者 無 amavis amavis 郵件掃描使用者 無 ------------------------------------------------------------------------------------ [root@mail ~]# groupadd -g 1001 vmail [root@mail ~]# useradd -g 1001 -u 1001 -s /sbin/nologin -M vmail [root@mail ~]# groupadd -g 1002 postdrop [root@mail ~]# yum remove postfix [root@mail ~]# userdel -r postfix [root@mail ~]# groupadd -g 1000 postfix [root@mail ~]# useradd -g 1000 -u 1000 -s /sbin/nologin -M postfix [root@mail ~]# useradd clamav [root@mail ~]# useradd amavis
6)解除安裝系統中相關軟體
如果系統自帶了postfix,就解除安裝了(上面已解除安裝) [root@mail ~]# yum remove postfix [root@mail ~]# userdel -r postfix 接著解除安裝sendmail CentOS系統安裝後,預設是裝好了Sendmail服務,其目的是為root使用者傳送一些有用的資訊。那麼,在安裝Postfix之前一定要先解除安裝Sendmail。 [root@mail ~]# service sendmail stop [root@mail ~]# rpm -qa | grep sendmail sendmail-8.13.8-2.el5 [root@mail ~]# rpm -e --nodeps sendmail-8.13.8-2.el5 解除安裝sasl [root@mail ~]# rpm -qa |grep sasl cyrus-sasl-lib-2.1.22-4 cyrus-sasl-devel-2.1.22-4 cyrus-sasl-2.1.22-4 cyrus-sasl-plain-2.1.22-4 [root@mail ~]# rpm -e --nodeps cyrus-sasl-lib-2.1.22-4 cyrus-sasl-devel-2.1.22-4 cyrus-sasl-2.1.22-4 cyrus-sasl-plain-2.1.22-4
7)配置相關係統環境
[root@mail ~]# vim /etc/ld.so.conf ...... /usr/local/lib /usr/local/mysql/lib/ /usr/lib64/ [root@mail ~]# ldconfig
8)建立相應目錄
虛擬使用者的郵件存放路徑 [root@mail ~]# mkdir -p /var/mailbox [root@mail ~]# chown vmail.vmail /var/mailbox [root@mail ~]# chmod 700 /var/mailbox apache的base目錄 [root@mail ~]# mkdir -p /data/web [root@mail ~]# chown vmail.vmail /data/web extman的臨時目錄 [root@mail ~]# mkdir /tmp/extman [root@mail ~]# chown vmail.vmail /tmp/extman clamav臨時目錄 [root@mail ~]# mkdir -p /dev/shm/clamav/tmp [root@mail ~]# chown -R amavis.amavis /dev/shm/clamav/ [root@mail ~]# echo " mkdir -p /dev/shm/clamav/tmp" >>/etc/rc.local [root@mail ~]# echo " chown -R amavis.amavis /dev/shm/clamav/" >>/etc/rc.local
9)安裝必要元件
先安裝epel源(百度雲盤下載地址:https://pan.baidu.com/s/1JucsbDuYwedEb4kGvN6MPg 提取密碼:pxn7) [root@mail ~]# cd /usr/local/src/ [root@mail src]# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm [root@mail src]# rpm -ivh epel-release-latest-6.noarch.rpm [root@mail src]# yum install perl-Unix-Syslog perl-DBI perl-Class-DBI-mysql perl-DBD-MySQL rrdtool perl-rrdtool perl-File-Tail perl-IO-stringy perl-MIME-* perl-Net-Server perl-BerkeleyDB perl-Crypt-* perl-Mail-DKIM perl-Convert-TNEF perl-Convert-UUlib perl-Archive-Zip =============================================================== 在使用yum過程中,遇到下面問題: libsasl2.so.2: cannot open shared object file: No such file or directory 這是因為在上面已經提前解除安裝了cyrus-sasl-lib所致! 解決辦法: 從別的機器上拷貝這個庫檔案到本機上 比如從192.168.10.201機器上拷貝到本機: [root@localhost ~]# find / -name libsasl2.so.2 /usr/lib64/libsasl2.so.2 [root@localhost ~]# ll /usr/lib64/libsasl2.so.2 lrwxrwxrwx. 1 root root 18 Jan 16 2018 /usr/lib64/libsasl2.so.2 -> libsasl2.so.2.0.23 [root@localhost ~]# ll /usr/lib64/libsasl2.so.2.0.23 -rwxr-xr-x. 1 root root 108728 Mar 25 2015 /usr/lib64/libsasl2.so.2.0.23 [root@localhost ~]# rsync -e "ssh -p22" -avpgolr /usr/lib64/libsasl2.so.2.0.23 root@192.168.10.202:/usr/lib64/ [root@localhost ~]# rsync -e "ssh -p22" -avpgolr /usr/lib64/libsasl2.so.2 root@192.168.10.202:/usr/lib64/ 到本機上檢視: [root@mail ~]# ll /usr/lib64/libsasl2.so.2 lrwxrwxrwx. 1 root root 18 Jan 16 2018 /usr/lib64/libsasl2.so.2 -> libsasl2.so.2.0.23 再次使用yum就正常了! ===============================================================
10)安裝配置courier-authlib
[root@mail ~]# cd /usr/local/src/ [root@mail src]# tar -jvxf courier-authlib-0.62.4.tar.bz2 [root@mail src]# cd courier-authlib-0.62.4 [root@mail courier-authlib-0.62.4]# ./configure --prefix=/usr/local/courier-authlib --with-mailuser=vmail --with-mailgroup=vmail --with-mysql-libs=/usr/local/mysql/lib/mysql --with-mysql-includes=/usr/local/mysql/include/mysql --without-stdheaderdir [root@mail courier-authlib-0.62.4]# make && make install [root@mail courier-authlib-0.62.4]# make install-configure [root@mail courier-authlib-0.62.4]# ln -s /usr/local/courier-authlib/bin/courierauthconfig /usr/bin/ 說明: 在指定編譯選項時需要指定mysql的include位置和lib位置,由於我mysql是原始碼安裝的,所以這裡一定要使用--with-mysql-includes和 --with-mysql-includes引數指定。--without-stdheaderdir 引數是說將標頭檔案安裝到我自己制定的目錄中,而非編譯器找到的預設目錄中。 ===================需要注意=================== 如果courier-authlib安裝到非標準位置(例如安裝到/usr/local下),一定記得在./configure時增加-- without-stdheaderdir, 這樣以後在編譯Courier-IMAP和maildrop的時候,不用特別指定courier- authlib的庫檔案位置 -------------------------------------------------------------------------------------------------- 安裝完成後需要修改/usr/local/courier-authlib/etc/authlib/目錄下的authdaemonrc 和 authmysqlrc 檔案 authdaemonrc這個檔案時告訴courier-authlib要使用什麼驗證方法 [root@mail courier-authlib-0.62.4]# vim /usr/local/courier-authlib/etc/authlib/authdaemonrc ....... # 驗證模組只保留mysql #authmodulelist="authuserdb authpam authmysql authcustom authpipe" authmodulelist="authmysql" ....... #authmodulelistorig="authuserdb authpam authmysql authcustom authpipe" authmodulelistorig="authmysql" ...... # 開啟debug日誌和包括記錄驗證密碼,有助於以後的排錯 #DEBUG_LOGIN=0 DEBUG_LOGIN=2 -------------------------------------------------------------------------------------------------- authmysqlrc這個檔案是courier-authlib程式通過mysql驗證時需要訪問資料庫的資訊。 [root@mail courier-authlib-0.62.4]# vim /usr/local/courier-authlib/etc/authlib/authmysqlrc ...... # mysql資料庫地址 MYSQL_SERVER 192.168.10.202 # 訪問資料庫的使用者名稱 MYSQL_USERNAME extmail # 訪問資料庫的密碼 MYSQL_PASSWORD extmail # mysql 的socket路徑 MYSQL_SOCKET /usr/local/mysql/var/mysql.sock # mysql開放的埠 MYSQL_PORT 3306 # 進行驗證的資料庫是哪個。這個在後面安裝extmail會有介紹 MYSQL_DATABASE extmail # 進行驗證時要訪問那個表 MYSQL_USER_TABLE mailbox # 取出密碼的欄位是哪個 MYSQL_CRYPT_PWFIELD password # 預設域名 DEFAULT_DOMAIN kevin.com # 這裡設定mail虛擬帳號的uid MYSQL_UID_FIELD '1001' # 虛擬帳號的gid MYSQL_GID_FIELD '1001' # 登入名從哪個欄位中取得 MYSQL_LOGIN_FIELD username # 郵件存放路徑在哪裡,這裡是根目錄。 MYSQL_HOME_FIELD '/var/mailbox/' # 郵件賬戶的描述資訊欄位 MYSQL_NAME_FIELD name # 郵件賬戶的詳細郵件目錄,從maildir欄位中取得。 MYSQL_MAILDIR_FIELD maildir # MYSQL_USER_TABLE 表中的quota欄位,這裡concat函式取出S之前的字元 MYSQL_QUOTA_FIELD concat(quota,'S') # 這裡定義SQL語句中where的條件 MYSQL_WHERE_CLAUSE active='1' ===================需要注意=================== 預設域名可有可無,如果設定了預設域名,則在courier-authlib連線mysql驗證時如果使用者只指定了username為test的話,則程式會自動 加上這裡設定的預設域名,否則必須指定使用者名稱為test@example.com。這裡看來還是設定預設域名比較方便。在設定多個虛擬域名的時候, 主域名的使用者可以不用輸入完整的使用者郵箱,其他虛擬域則必須設定完整的郵件地址。 配置好之後的檔案,即如下: [root@mail courier-authlib-0.62.4]# cat /usr/local/courier-authlib/etc/authlib/authmysqlrc|grep -v "#"|grep -v "^$" MYSQL_SERVER 192.168.10.202 MYSQL_USERNAME extmail MYSQL_PASSWORD extmail MYSQL_SOCKET /usr/local/mysql/var/mysql.sock MYSQL_PORT 3306 MYSQL_OPT 0 MYSQL_DATABASE extmail MYSQL_USER_TABLE mailbox MYSQL_CRYPT_PWFIELD password DEFAULT_DOMAIN kevin.com MYSQL_UID_FIELD 1001 MYSQL_GID_FIELD 1001 MYSQL_LOGIN_FIELD username MYSQL_HOME_FIELD '/var/mailbox' MYSQL_NAME_FIELD name MYSQL_MAILDIR_FIELD maildir MYSQL_QUOTA_FIELD concat(quota,'S') MYSQL_WHERE_CLAUSE active='1' 加入啟動項(切換到原始碼目錄下) [root@mail courier-authlib-0.62.4]# pwd /usr/local/src/courier-authlib-0.62.4 [root@mail courier-authlib-0.62.4]# cp courier-authlib.sysvinit /etc/init.d/courier-authlib [root@mail courier-authlib-0.62.4]# chmod 755 /etc/init.d/courier-authlib [root@mail courier-authlib-0.62.4]# chkconfig --add courier-authlib [root@mail courier-authlib-0.62.4]# service courier-authlib start Starting Courier authentication services: authdaemond [root@mail courier-authlib-0.62.4]# 修改authdaemon 的socket目錄許可權 如果該目錄許可權不正確修改,maildrop及postfix等將無法正確獲取使用者的資訊及密碼認證: [root@mail courier-authlib-0.62.4]# chmod 755 /usr/local/courier-authlib/var/spool/authdaemon [root@mail courier-authlib-0.62.4]# ll -d /usr/local/courier-authlib/var/spool/authdaemon drwxr-xr-x. 2 vmail vmail 4096 Jul 29 02:49 /usr/local/courier-authlib/var/spool/authdaemon [root@mail courier-authlib-0.62.4]# 系統整合 [root@mail courier-authlib-0.62.4]# ln -s /usr/local/courier-authlib/lib/courier-authlib/* /usr/lib [root@mail courier-authlib-0.62.4]# echo "/usr/lib" >> /etc/ld.so.conf [root@mail courier-authlib-0.62.4]# cat /etc/ld.so.conf include ld.so.conf.d/*.conf /usr/local/mysql/lib/ /usr/lib64/ /usr/lib [root@mail courier-authlib-0.62.4]# ldconfig
11)安裝/配置Cyrus-SASL2
編譯安裝 [root@mail ~]# cd /usr/local/src/ [root@mail src]# tar -zvxf cyrus-sasl-2.1.23.tar.gz [root@mail cyrus-sasl-2.1.23]# ./configure --disable-anon --disable-gssapi --disable-sample --disable-digest --enable-plain --enable-login --enable-sql --with-mysql=/usr/local/mysql --with-authdaemond=/usr/local/courier-authlib/var/spool/authdaemon/socket [root@mail cyrus-sasl-2.1.23]# make && make install 特別注意: --with-authdaemond標出的部分為先前安裝的courier-authlib啟動之後的socket檔案位置。一定要指定,否則sasl無法和authdaemon連線! -------------------------------------------------------------------------------------------- make安裝的時候,可能報如下錯誤: 1)error: mysql.h: No such file or directory 報錯資訊大致如下: ...... sql.c:65:19: error: mysql.h: No such file or directory sql.c: In function '_mysql_open': ...... make[2]: *** [sql.lo] Error 1 make[2]: Leaving directory `/usr/local/src/cyrus-sasl-2.1.23/plugins' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/usr/local/src/cyrus-sasl-2.1.23' make: *** [all] Error 2 解決辦法: 在你的mysql的安裝路徑:/usr/local/mysql/include/mysql 下面看看有沒有 .h的檔案,沒有的話,在mysql是上一層目錄中,有這些檔案, 拷貝一份到mysql下 [root@mail ~]# cd /usr/local/mysql/include/mysql [root@mail mysql]# ll mysql.h -rw-r--r--. 1 root root 29129 Jul 29 02:59 mysql.h [root@mail mysql]# ll ../mysql.h -rw-r--r--. 1 mysql mysql 29129 Dec 9 2017 ../mysql.h [root@mail mysql]# cd ../ [root@mail include]# \cp -f *.h mysql/ [root@mail include]# ll mysql.h -rw-r--r--. 1 mysql mysql 29129 Dec 9 2017 mysql.h 然後再接著make && make install編譯安裝就成功了! 2)error: des.h: No such file or direcctory 報錯資訊大致如下: auth_getpwent.c:48:20: error: des.h: No such file or direcctory make[3]: *** [auth_getpwent.o] Error 1 make[3]: Leaving directory '/usr/local/src/cyrus-sasl-2.1.23/saslauthd/' make[2]: *** [all] Error 2 這個錯誤的原因是沒有找到des.h標頭檔案導致的,處理的方法很簡單,就是將cyrus-sasl原始碼包資料夾下面的mac路徑裡的des.h檔案拷到錯誤提示的路徑下! 解決辦法: [root@mail cyrus-sasl-2.1.23]# pwd /usr/local/src/cyrus-sasl-2.1.23 [root@mail cyrus-sasl-2.1.23]# cp mac/libdes/public/des.h /usr/local/src/cyrus-sasl-2.1.23/saslauthd/ -------------------------------------------------------------------------------------------- 系統整合 [root@mail cyrus-sasl-2.1.23]# ln -s /usr/local/lib/sasl2/ /usr/lib/ [root@mail cyrus-sasl-2.1.23]# cat /etc/ld.so.conf include ld.so.conf.d/*.conf /usr/local/mysql/lib/ /usr/lib64/ /usr/lib [root@mail cyrus-sasl-2.1.23]# ldconfig [root@mail cyrus-sasl-2.1.23]# ldconfig -v | grep sasl ldconfig: Path `/usr/lib' given more than once ldconfig: Path `/usr/lib64' given more than once libsasl2.so.2 -> libsasl2.so.2.0.23 libcourierauthsasl.so -> libcourierauthsasl.so.0 libcourierauthsaslclient.so -> libcourierauthsaslclient.so.0 配置 Postfix的SMTP認證需要透過Cyrus-SASL,連線到authdaemon獲取認證資訊,這裡我們需要配置smtp的驗證,後續的還需要修改postfix的main.cf檔案。 這裡就先不做說明,等到了配置postfix的時候再說下如何配置postfix的smtp認證的配置。 在/usr/local/lib/sasl2/目錄下建立smtpd.conf檔案並新增如下內容 [root@mail cyrus-sasl-2.1.23]# ll /usr/local/lib/sasl2/smtpd.conf ls: cannot access /usr/local/lib/sasl2/smtpd.conf: No such file or directory [root@mail cyrus-sasl-2.1.23]# touch /usr/local/lib/sasl2/smtpd.conf [root@mail cyrus-sasl-2.1.23]# vim /usr/local/lib/sasl2/smtpd.conf pwcheck_method: authdaemond mech_list: PLAIN LOGIN log_level: 3 authdaemond_path: /usr/local/courier-authlib/var/spool/authdaemon/socket
12)Postfix安裝/配置
[root@mail ~]# cd /usr/local/src/ [root@mail src]# tar -zvxf postfix-2.8.7.tar.gz [root@mail src]# cd postfix-2.8.7 [root@mail postfix-2.8.7]# make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/local/include/sasl' 'AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm -L/usr/local/lib -lsasl2' [root@mail postfix-2.8.7]# make && make install 編譯完成後程式會自動進入互動狀態,等待使用者的輸入,一般情況下,一路回車即可完成所有的安裝。 ---------------------------------------------------------------------------------------------- 可能報錯如下: bin/postconf: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory ...... postfix-install: Error: "" should be "no" or an absolute path name. make: *** [install] Error 1 解決辦法: [root@mail postfix-2.8.7]# find / -name libpcre.so.1 /usr/local/lib/libpcre.so.1 #如果沒有,就執行"yum install -y pcre pcre-devel"(其實在安裝LAMP時已編譯安裝了pcre) 然後放到.so庫的引用檔案裡: [root@mail postfix-2.8.7]# echo "/usr/local/lib/" >> /etc/ld.so.conf [root@mail postfix-2.8.7]# cat /etc/ld.so.conf include ld.so.conf.d/*.conf /usr/local/mysql/lib/ /usr/lib64/ /usr/lib /usr/local/lib/ [root@mail postfix-2.8.7]# ldconfig 最後再執行即可成功了! [root@mail postfix-2.8.7]# make && make install ---------------------------------------------------------------------------------------------- 注意: make的引數可以參考postfix原始碼目錄下README_FILES資料夾中的INSTALL、MYSQL_README、SASL_README 檔案。 接著生成別名二進位制檔案 下面這條命令的作用就是將/etc/alias 檔案利用工具轉為postfix可以讀取的二進位制檔案,存為/etc/postfix/ aliases [root@mail postfix-2.8.7]# /usr/bin/newaliases 驗證安裝的Postfix是否支援SASL、MySQL [root@mail postfix-2.8.7]# postconf -a cyrus dovecot [root@mail postfix-2.8.7]# postconf -m btree cidr environ hash internal mysql nis pcre proxy regexp static tcp texthash unix 需要注意的是: -- 如果沒有顯示出cyrus項說明你的postfix不支援SASL,需要檢查但前系統是否將libsasl庫加入到系統中,利用ldconfig -v | grep 檢視。 如果沒有libsasl2.so.2 -> libsasl2.so.2.0.23 需要將/usr/local/lib目錄新增到/etc/ld.so.conf檔案中然後再執行ldconfig命令使其生效。 -- 如果沒有mysql項說明postfix不支援mysql協議的查詢,肯定是編譯時mysql的目錄指定錯誤,重新檢視mysql的lib目錄和include目錄的確切 位置後重新編譯安裝postfix Postfix配置 先不著急進行Postfix的配置,這個放到最後等courier-imap、maildrop、extmail安裝完成之後做統一的配置。 建立虛擬使用者驗證配置檔案的目錄 由於虛擬使用者是結合mysql進行驗證的,postfix的配置檔案中可以針對虛擬使用者進行配置的定義,該目錄就是儲存mysql驗證的配置檔案。 後文extman配置時會介紹。這裡先建立相應目錄。 [root@mail postfix-2.8.7]# mkdir -p /etc/postfix/mysql 建立postfix啟動daemon控制指令碼 [root@mail postfix-2.8.7]# ll /etc/init.d/postfix ls: cannot access /etc/init.d/postfix: No such file or directory [root@mail postfix-2.8.7]# vim /etc/init.d/postfix #!/bin/sh # # postfix Postfix Mail Transfer Agent # # chkconfig: 2345 80 30 # description: Postfix is a Mail Transport Agent, which is the program \ # that moves mail from one machine to another. # processname: master # pidfile: /var/spool/postfix/pid/master.pid # config: /etc/postfix/main.cf # config: /etc/postfix/master.cf # # $Revision: 2.4 $ # # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 [ -x /usr/sbin/postfix ] || exit 0 [ -d /etc/postfix ] || exit 0 [ -d /var/spool/postfix ] || exit 0 RETVAL=0 start() { # Start daemons. echo -n "Starting postfix: " /usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure RETVAL=$? [ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix echo return $RETVAL } stop() { # Stop daemons. echo -n "Shutting down postfix: " /usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure RETVAL=$? [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix echo return $RETVAL } reload() { echo -n "Reloading postfix: " /usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure RETVAL=$? echo return $RETVAL } restart() { stop start } abort() { /usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure return $? } flush() { /usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure return $? } check() { /usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure return $? } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) restart ;; reload) reload ;; abort) abort ;; flush) flush ;; check) check ;; status) status master ;; condrestart) # don't use /var/lock/subsys/postfix, check for postfix running directly daemon_directory=$(postconf -h daemon_directory) $daemon_directory/master -t 2>/dev/null && : || restart ;; *) echo "Usage: postfix {start|stop|restart|reload|abort|flush|check|status|condrestart}" exit 1 esac exit $? 新增服務,指定自動啟動 [root@mail postfix-2.8.7]# chmod +x /etc/init.d/postfix [root@mail postfix-2.8.7]# chkconfig --add postfix [root@mail postfix-2.8.7]# chkconfig postfix on
13)安裝/配置 courier-imap
[root@mail ~]# cd /usr/local/src/ [root@mail src]# tar -jvxf courier-imap-4.5.1.tar.bz2 && cd courier-imap-4.5.1 [root@mail courier-imap-4.5.1]# ./configure --prefix=/usr/local/courier-imap --with-redhat --disable-root-check --enable-unicode=utf-8,iso-8859-1,gb2312,gbk,gb18030 --with-trashquota --with-dirsync --with-mysql-libs=/usr/local/mysql/lib/mysql --with-mysql-includes=/usr/local/mysql/include/mysql --with-authmysql --with-authmysql=yes CPPFLAGS='-I/usr/local/courier-authlib/include' LDFLAGS='-L/usr/local/courier-authlib/lib/courier-authlib' COURIERAUTHCONFIG='/usr/local/courier-authlib/bin/courierauthconfig' [root@mail courier-imap-4.5.1]# make && make install && make install-configure [root@mail courier-imap-4.5.1]# cp courier-imap.sysvinit /etc/rc.d/init.d/imapd [root@mail courier-imap-4.5.1]# chmod 755 /etc/rc.d/init.d/imapd [root@mail courier-imap-4.5.1]# chkconfig --add imapd [root@mail courier-imap-4.5.1]# chkconfig imapd on 配置 [root@mail courier-imap-4.5.1]# vim /usr/local/courier-imap/etc/imapd ...... IMAPDSTART=YES [root@mail courier-imap-4.5.1]# vim /usr/local/courier-imap/etc/pop3d ...... POP3DSTART=YES 啟動服務 [root@mail courier-imap-4.5.1]# service imapd start Starting Courier-IMAP server: imap pop3 [root@mail courier-imap-4.5.1]# netstat -tulnp | egrep "110|143" tcp 0 0 :::110 :::* LISTEN 12045/couriertcpd tcp 0 0 :::143 :::* LISTEN 12039/couriertcpd
14)安裝配置maildrop
編譯安裝pcre(這個在之前部署LAMP的時候就已經安裝了) 編譯安裝maildrop [root@mail ~]# cd /usr/local/src/ [root@mail src]# tar -jvxf maildrop-2.2.0.tar.bz2 [root@mail src]# cd maildrop-2.2.0 [root@mail maildrop-2.2.0]# ./configure --enable-sendmail=/usr/sbin/sendmail --enable-trusted-users='root vmail' --enable-syslog=1 --enable-maildirquota --enable-maildrop-uid=1001 --enable-maildrop-gid=1001 --with-trashquota --with-dirsync [root@mail maildrop-2.2.0]# make && make install 需要注意: ./configure --help 檢視的編譯選項不全,檢視目錄下的INSTALL檔案獲得更多的編譯選項。 驗證安裝 [root@mail maildrop-2.2.0]# maildrop -v maildrop 2.1.0 Copyright 1998-2005 Double Precision, Inc. GDBM/DB extensions enabled. Courier Authentication Library extension enabled. Maildir quota extension enabled. This program is distributed under the terms of the GNU General Public License. See COPYING for additional information. 如果沒有顯示Courier Authentication Library extension enabled.說明你的maidrop還不支援courier auth,請仔細檢查, 重新編譯maildrop建議不要自定義目錄安裝,可以減少不必要的麻煩,刪除很方便:直接在已經編譯的原始碼目錄 make uninstall 知道maildrop把郵件移動到哪個使用者目錄還是非常有必要的,這個操作就是maildrop的日誌記錄。這裡我們建立一個新檔案 /etc/maildroprc,這個檔案就2行內容:如果加入反SPAM,需要更改以下內容: [root@mail maildrop-2.2.0]# vim /etc/maildroprc logfile "/var/log/maildrop.log" to "$HOME/$DEFAULT" 需要注意: /etc/maildroprc 檔案為maildrop工作在投遞模式下的全域性過濾說明文件。詳細的配置說明可以參考 man maildropfilter 文件。 [root@mail maildrop-2.2.0]# touch /var/log/maildrop.log;chown vmail.vmail /var/log/maildrop.log [root@mail maildrop-2.2.0]# ll /var/log/maildrop.log -rw-r--r--. 1 vmail vmail 0 Jul 29 06:13 /var/log/maildrop.log
15)安裝extmail與extman
安裝extmail [root@mail ~]# cd /usr/local/src/ [root@mail src]# tar -zvxf extmail-1.1.0.tar.gz [root@mail src]# mv extmail-1.1.0 /data/web/ [root@mail src]# mv /data/web/extmail-1.1.0 /data/web/extmail [root@mail src]# chown vmail.vmail -R /data/web [root@mail src]# cd /data/web/extmail/ [root@mail extmail]# cp -p webmail.cf.default webmail.cf 配置extmail [root@mail extmail]# vim webmail.cf SYS_CONFIG = /data/web/extmail/ SYS_LANGDIR = /data/web/extmail/lang SYS_TEMPLDIR = /data/web/extmail/html # web頁面登陸語言設定 SYS_USER_LANG = zh_CN #虛擬使用者mail存放的根目錄 SYS_MAILDIR_BASE = /var/mailbox # 關於資料庫的設定,根據實際情況設定 SYS_MYSQL_USER = extmail SYS_MYSQL_PASS = extmail SYS_MYSQL_DB = extmail SYS_MYSQL_HOST = 192.168.10.202 SYS_MYSQL_SOCKET = /usr/local/mysql/var/mysql.sock # courier-authlib驗證程式socket位置 SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket # 全域性聯絡人配置檔案位置 SYS_G_ABOOK_FILE_PATH = /data/web/extmail/globabook.cf --------------------------------------------------------------------------- 安裝extman [root@mail ~]# cd /usr/local/src/ [root@mail src]# tar -zvxf extman-0.2.5.tar.gz [root@mail src]# mv extman-0.2.5 /data/web/ [root@mail src]# mv /data/web/extman-0.2.5 /data/web/extman [root@mail src]# chown -R vmail.vmail /data/web/ 配置extman [root@mail src]# sed -i 's/extmail.org/kevin.com/g' /data/web/extman/docs/init.sql [root@mail src]# cd /data/web/extman/ [root@mail extman]# vim webman.cf SYS_CONFIG = /data/web/extman/ SYS_LANGDIR = /data/web/extman/lang SYS_TEMPLDIR = /data/web/extman/html SYS_MAILDIR_BASE = /var/mailbox # sys_sess_dir, the session dir SYS_SESS_DIR = /tmp/extman/ SYS_CAPTCHA_ON = 0 #不需要認證碼 SYS_GROUPMAIL_SENDER = postmaster@kevin.com # sys_default_uid, if not set, webman will ignore it SYS_DEFAULT_UID = 1001 # sys_default_gid, if not set, webman will ignore it SYS_DEFAULT_GID = 1001 # 資料庫相關設定 SYS_MYSQL_USER = extman SYS_MYSQL_PASS = extman SYS_MYSQL_DB = extmail SYS_MYSQL_HOST = 192.168.10.202 SYS_MYSQL_SOCKET = /usr/local/mysql/var/mysql.sock 修改extmail建立表的mysql語句 [root@mail extman]# sed -i 's/TYPE=MyISAM/ENGINE=InnoDB DEFAULT CHARSET=utf8/g' /data/web/extman/docs/extmail.sql 初始化資料庫(mysql5.6.39在之前已經編譯安裝了,密碼為123456) [root@mail extman]# mysql -u root -p123456 </data/web/extman/docs/extmail.sql [root@mail extman]# mysql -u root -p123456 </data/web/extman/docs/init.sql 登入mysql檢視是否已經匯入資料了: [root@mail extman]# mysql -p123456 Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 764 Server version: 5.6.39-log Source distribution Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | extmail | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) mysql> use extmail; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-------------------+ | Tables_in_extmail | +-------------------+ | alias | | domain | | domain_manager | | mailbox | | manager | +-------------------+ 5 rows in set (0.00 sec) mysql> 需要注意: 通過仔細的檢視extmail.sql 檔案,發現其sql語句中已經有新增使用者的操作。 因此,下面的通過grant命令來建立使用者並指定許可權的操作可以省略。 另外可以根據需要修改extmail.sql中使用者的配置。但修改之後一定要將extmail/extman的配置也同步修改。 將虛擬使用者驗證配置檔案複製到/etc/postfix/mysql目錄中 [root@mail extman]# cp /data/web/extman/docs/mysql_virtual_* /etc/postfix/mysql/ 注意:這些檔案是postfix的配置相關檔案,其所有者必須為root。 [root@mail extman]# ll /etc/postfix/mysql/ total 20 -rw-r--r--. 1 root root 166 Jul 29 07:00 mysql_virtual_alias_maps.cf -rw-r--r--. 1 root root 168 Jul 29 07:00 mysql_virtual_domains_maps.cf -rw-r--r--. 1 root root 170 Jul 29 07:00 mysql_virtual_limit_maps.cf -rw-r--r--. 1 root root 172 Jul 29 07:00 mysql_virtual_mailbox_maps.cf -rw-r--r--. 1 root root 173 Jul 29 07:00 mysql_virtual_sender_maps.cf 針對extmail/extman 對mysql的配置 mysql> grant all on extmail.* to extmail@'192.168.10.202' identified by 'extmail'; Query OK, 0 rows affected (0.03 sec) mysql> grant all on extmail.* to extman@'192.168.10.202' identified by 'extman'; Query OK, 0 rows affected (0.18 sec) mysql> 針對extmail/extman 對apache所做的配置 [root@mail extman]# vim /usr/local/apache/conf/httpd.conf ...... DirectoryIndex index.html index.cgi index.htm index.php index.html.var [root@mail extman]# vim /usr/local/apache/conf/extra/extmail.conf <VirtualHost *:80> ServerName mail.kevin.com DocumentRoot /data/web/ ScriptAlias /extmail/cgi /data/web/extmail/cgi ScriptAlias /extman/cgi /data/web/extman/cgi Alias /extmail /data/web/extmail/html Alias /extman /data/web/extman/html </VirtualHost> 重啟apache服務 [root@mail extman]# /usr/local/apache/bin/httpd -k restart [root@mail extman]# lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 12744 vmail 4u IPv6 323890 0t0 TCP *:http (LISTEN) httpd 12745 vmail 4u IPv6 323890 0t0 TCP *:http (LISTEN) httpd 12746 vmail 4u IPv6 323890 0t0 TCP *:http (LISTEN) httpd 12747 vmail 4u IPv6 323890 0t0 TCP *:http (LISTEN) httpd 12748 vmail 4u IPv6 323890 0t0 TCP *:http (LISTEN) httpd 28707 root 4u IPv6 323890 0t0 TCP *:http (LISTEN)
16)測試extmail/extman
解析mail.kevin.com到192.168.10.202機器上(或做hosts繫結),訪問http://mail.kevin.com/extmail/,如下圖所示,注意選擇的是"登入郵箱管理"這一項,進入郵箱管理後臺介面。預設使用者名稱和密碼分別是root@kevin.com和extmail*123*
如果忘記了管理員密碼,則使用下面命令密碼重新修改為"extmail*123*"的初始預設密碼!
mysql> update manager set password='$1$BrT9qxfB$Ha81Mb5YVV6rNKNN5jmtj1' where username= "root@kevin.com"; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> flush privileges; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select username,password from manager; +----------------------------+------------------------------------+ | username | password | +----------------------------+------------------------------------+ | root@kevin.com | $1$BrT9qxfB$Ha81Mb5YVV6rNKNN5jmtj1 | +----------------------------+------------------------------------+ 1 row in set (0.00 sec) mysql> flush privileges; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
登入的時候,可能會有報錯,總結如下:
報錯1: Can't locate CGI.pm in @INC (@INC contains: /data/web/extmail/libs /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at /data/web/extmail/libs/Ext/CGI.pm line 20. BEGIN failed--compilation aborted at /data/web/extmail/libs/Ext/CGI.pm line 20. Compilation failed in require at /data/web/extmail/libs/Ext/App.pm line 23. BEGIN failed--compilation aborted at /data/web/extmail/libs/Ext/App.pm line 23. Compilation failed in require at /data/web/extmail/libs/Ext/App/Login.pm line 16. BEGIN failed--compilation aborted at /data/web/extmail/libs/Ext/App/Login.pm line 16. Compilation failed in require at /data/web/extmail/cgi/index.cgi line 20. 解決辦法: [root@mail ~]# yum install perl-CGI ========================================= 報錯2: Unix::Syslog not found, please install it first! (in cleanup) Undefined subroutine &Ext::Logger::do_closelog called at /data/web/extmail/libs/Ext/Logger.pm line 86. 解決辦法: [root@mail ~]# perl Makefile.PL 如果安裝這個包的報錯 Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at Makefile.PL line 1. BEGIN failed--compilation aborted at Makefile.PL line 1. 解決辦法: [root@mail ~]# yum install -y perl-ExtUtils-MakeMaker 然後 [root@mail ~]# perl Makefile.PL [root@mail ~]# make install ========================================= 報錯3 DBI connect('database=extmail;host=localhost;mysql_socket=/usr/local/mysql/var/mysql.sock','db_user',...) failed: Access denied for user 'db_user'@'localhost' (using password: YES) at /data/web/extmail/libs/Ext/Auth/MySQL.pm line 45 解決辦法: 進入資料庫失敗,修改主配置檔案。 SYS_MYSQL_USER = extmail ; SYS_MYSQL_PASS = extmail =========================================
登入郵箱後臺後,可以進行新增使用者、新增管理員、修改管理員資訊、新增別名、郵箱限額、網盤限額、禁止使用者自由註冊(在"域列表"中選中kevin.com進行修改)等操作。
特別注意:
使用者建立完成後檢視/var/mailbox/目錄下是否自動建立了kevin.com/wangshibo目錄。如果沒有生成這個使用者目錄,說明建立使用者的時候沒有自動生成目錄,這種情況大多是因為許可權不對。通過檢視apache的日誌排錯。同時將/var/mailbox的許可權設定為700 所有者設定為 vmail。
[root@mail ~]# ll /var/mailbox/ total 4 drwx------. 3 vmail vmail 4096 Jul 29 07:31 kevin.com [root@mail ~]# ll /var/mailbox/kevin.com/ total 4 drwx------. 3 vmail vmail 4096 Jul 29 07:31 wangshibo [root@mail ~]# ll -d /var/mailbox/ drwx------. 3 vmail vmail 4096 Jul 29 07:31 /var/mailbox/
啟動圖形日誌服務測試(不做下面一步,後臺裡的“影象日誌”將不會顯示圖片)
[root@mail ~]# cp -rp /data/web/extman/addon/mailgraph_ext/ /usr/local/ [root@mail ~]# /usr/local/mailgraph_ext/mailgraph-init start Starting mail statistics grapher: mailgraph_ext [root@mail ~]# /usr/local/mailgraph_ext/qmonitor-init start Starting queue statistics grapher: qmonitor 加入開機啟動 [root@mail ~]# echo "/usr/local/mailgraph_ext/mailgraph-init start">>/etc/rc.local [root@mail ~]# echo "/usr/local/mailgraph_ext/qmonitor-init start">>/etc/rc.local
登入檢視,是否出圖:
使用管理後臺裡建立的使用者(比如上面的wangshibo)登入網頁版郵箱。注意登入時,選中"登入郵箱"這一選項:
17)cyrus-sasl +courier-authlib+ postfix+ courier-imap+ maildrop聯合配置與除錯
完善配置postfix。本例中的main.cf檔案下載地址:https://pan.baidu.com/s/176QEclvdvYtG37uQrW_yJg 提取密碼:qi8i main.cf檔案一定要配置正確,否則郵件收發都會出現問題!
注意下面第二行的格式,不能頂格寫。即將前面的註釋開啟。 [root@mail ~]# cp /etc/postfix/master.cf /etc/postfix/master.cf.bak [root@mail ~]# vim /etc/postfix/master.cf ....... maildrop unix - n n - - pipe flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient} [root@mail ~]# cp /etc/postfix/main.cf /etc/postfix/main.cf.bak [root@mail ~]# >/etc/postfix/main.cf [root@mail ~]# vim /etc/postfix/main.cf myhostname = mail.kevin.com mydomain = kevin.com #郵箱域名 myorigin = $mydomain #發件人郵箱域名 inet_interfaces = all mynetworks = 192.168.0.0/16, 127.0.0.0/8 relay_domains = $mydestination #給外部郵箱發件時的外部郵箱域名!可以跟多個。注意,此處$mydestination需註釋掉的! alias_maps = $alias_database alias_database = hash:/etc/aliases mail_spool_directory = /var/spool/mail default_recipient_refill_delay = 1s #====================SASL ESMTP Authenticat================= smtpd_sasl_auth_enable = yes #smtpd_helo_required = yes smtpd_sasl_local_domain = $mydomain smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_recipient_restrictions = permit_mynetworks, #此處下面是一行的,下面要空格! permit_sasl_authenticated, reject_invalid_hostname, reject_non_fqdn_hostname, reject_unknown_sender_domain, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_pipelining, reject_unauth_destination smtpd_sasl_application_name = smtpd #smtpd_banner = $myhostname ESMTP $mail_name ($mail_version) smtpd_banner = $myhostname ESMTP Jobkoo mail system (version:1.0) #=====================Vritual Mailbox settings========================= virtual_mailbox_base = /var/mailbox/ virtual_mailbox_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql/mysql_virtual_domains_maps.cf virtual_alias_domains = virtual_alias_maps = mysql:/etc/postfix/mysql/mysql_virtual_alias_maps.cf virtual_uid_maps = static:1001 virtual_gid_maps = static:1001 virtual_transport = maildrop maildrop_destination_recipient_limit = 1 maildrop_destination_concurrency_limit = 1 #====================QUOTA============================================ message_size_limit = 20000000 mailbox_size_limit = 409600000 virtual_mailbox_limit = 20000000 virtual_create_maildirsize = yes virtual_mailbox_extended = yes virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_limit_maps.cf virtual_mailbox_limit_override = yes virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later. virtual_overquota_bounce = yes 啟動postfix,啟動前先設定好一些許可權 [root@mail ~]# chown -R postfix.postfix /var/lib/postfix [root@mail ~]# chown -R postfix.postfix /var/spool/postfix [root@mail ~]# /etc/init.d/postfix start Starting postfix: [ OK ] [root@mail ~]# /etc/init.d/postfix status master (pid 13888) is running... 檢視maillog日誌,進行檢查(warning資訊可以忽略) [root@mail ~]# tail -f /var/log/maillog [root@mail ~]# postfix check
驗證courier-authlib認證
首先確認courier-authlib已經執行 [root@mail ~]# service courier-authlib restart Stopping Courier authentication services: authdaemond Starting Courier authentication services: authdaemond 使用上面在郵箱管理後臺建立的wangshibo使用者進行認證測試(使用者名稱:wangshibo@kevin.com 密碼:wang@123456) [root@mail ~]# /usr/local/courier-authlib/sbin/authtest -s loggin wangshibo@kevin.com wang@123456 Authentication succeeded. Authenticated: wangshibo@kevin.com (uid 1001, gid 1001) Home Directory: /var/mailbox Maildir: kevin.com/wangshibo/Maildir/ Quota: 524288000SS Encrypted Password: $1$8qUqeb7z$dqiSMpnZJrpEyBkkC.bP4/ Cleartext Password: wang@123456 Options: (none) 以上認證資訊表明:ExtMan的正確安裝,資料庫也正確匯入,courier-authlib能正確連線到mysql資料庫。 下面檢視maillog日誌看看courier-authlib都做了什麼。 [root@mail ~]# tail -f /var/log/maillog ....... #courier-authlib接到驗證請求型別為login Jul 29 16:27:31 centos6-03 authdaemond: received auth request, service=loggin, authtype=login #使用authmysql驗證模組 Jul 29 16:27:31 centos6-03 authdaemond: authmysql: trying this module #根據使用者提交的使用者名稱從資料庫中查詢資訊 Jul 29 16:27:31 centos6-03 authdaemond: SQL query: SELECT username, password, "", 1001, 1001, '/var/mailbox', maildir, concat(quota,'S'), name, "" FROM mailbox WHERE username = 'wangshibo@kevin.com' AND (active='1') #驗證密碼成功 Jul 29 16:27:31 centos6-03 authdaemond: password matches successfully #authmysql 模組獲得查詢結果 Jul 29 16:27:31 centos6-03 authdaemond: authmysql: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=wangshibo@kevin.com, fullname= 王士博, maildir=kevin.com/wangshibo/Maildir/, quota=524288000SS, options=<null> #authmysql 分析clearpasswd欄位和passwd欄位值 Jul 29 16:27:31 centos6-03 authdaemond: authmysql: clearpasswd=<null>, passwd=$1$8qUqeb7z$dqiSMpnZJrpEyBkkC.bP4/ #通過驗證顯示使用者資訊 Jul 29 16:27:31 centos6-03 authdaemond: Authenticated: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=wangshibo@kevin.com, fullname= 王士博, maildir=kevin.com/wangshibo/Maildir/, quota=524288000SS, options=<null> #驗證成功顯示使用者密碼資訊 Jul 29 16:27:31 centos6-03 authdaemond: Authenticated: clearpasswd=wang@123456, passwd=$1$8qUqeb7z$dqiSMpnZJrpEyBkkC.bP4/ 特別注意: 由於我的courier-authlib驗證服務將除錯資訊開啟了,因此可以在maillog檔案中檢視這麼詳細的日誌資訊。 配置檔案中(/usr/local/courier-authlib/etc/authlib/authdaemonrc)關於除錯資訊的設定分為三個級別,分別為:(我的檔案裡面是DEBUG_LOGIN=2) 0 → 關閉除錯資訊 1 → 開啟除錯資訊 2 → 開啟除錯資訊並顯示密碼
測試SMTP認證
首先隨便測試一個賬號,生成存放client的檔案,預設的位置在 /etc/sasldb2(這個檔案很重要,否則會造成認證失敗) [root@mail ~]# /usr/local/sbin/saslpasswd2 -c -u mail.kevin.com bobo Password: #輸入兩次密碼 Again (for verification): [root@mail ~]# chmod 777 /etc/sasldb2 [root@mail ~]# ll /etc/sasldb2 -rwxrwxrwx. 1 root root 12288 Jul 29 17:24 /etc/sasldb2 通過以下命令獲得wangshibo@kevin.com的使用者名稱及密碼的BASE64編碼:(分別是使用者名稱和密碼) [root@mail ~]# perl -e 'use MIME::Base64; print encode_base64("wangshibo\@kevin.com")' d2FuZ3NoaWJvQGtldmluLmNvbQ== [root@mail ~]# perl -e 'use MIME::Base64; print encode_base64("wang@123456")' aHVpMTk4NzUyMQ== 然後本機測試,其過程如下 [root@mail ~]# telnet localhost 25 Trying localhost... Connected to localhost. Escape character is '^]'. 220 mail.kevin.com ESMTP Jobkoo mail system (version:1.0) ehlo mail.kevin.com #輸入這個域名 250-mail.kevin.com 250-PIPELINING 250-SIZE 20000000 250-VRFY 250-ETRN 250-AUTH PLAIN LOGIN 250-AUTH=PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth login #輸入登入口令 334 VXNlcm5hbWU6 d2FuZ3NoaWJvQGtldmluLmNvbQ== #輸入使用者名稱的編碼 334 UGFzc3dvcmQ6 aHVpMTk4NzUyMQ== #輸入密碼的編碼 235 2.7.0 Authentication successful quit 221 2.0.0 Bye Connection closed by foreign host. 如上,最後出現235 2.7.0 Authentication successful,表示認證成功了! 下面檢視maillog日誌看看: [root@mail ~]# tail -f /var/log/maillog ....... Jul 30 11:16:25 centos6-03 authdaemond: received auth request, service=smtp, authtype=login Jul 30 11:16:25 centos6-03 authdaemond: authmysql: trying this module Jul 30 11:16:25 centos6-03 authdaemond: authmysqllib: connected. Versions: header 50639, client 50639, server 50639 Jul 30 11:16:25 centos6-03 authdaemond: SQL query: SELECT username, password, "", 1001, 1001, '/var/mailbox', maildir, concat(quota,'S'), name, "" FROM mailbox WHERE username = 'wangshibo@kevin.com' AND (active='1') Jul 30 11:16:25 centos6-03 authdaemond: password matches successfully Jul 30 11:16:25 centos6-03 authdaemond: authmysql: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=wangshibo@kevin.com, fullname=王士åš, maildir=kevin.com/wangshibo/Maildir/, quota=524288000SS, options=<null> Jul 30 11:16:25 centos6-03 authdaemond: authmysql: clearpasswd=<null>, passwd=$1$4o9ugUuB$kbzKQ6VTl03aHDfFQqHIy0 Jul 30 11:16:25 centos6-03 authdaemond: Authenticated: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=wangshibo@kevin.com, fullname=王士åš, maildir=kevin.com/wangshibo/Maildir/, quota=524288000SS, options=<null> Jul 30 11:16:25 centos6-03 authdaemond: Authenticated: clearpasswd=wang@123456, passwd=$1$4o9ugUuB$kbzKQ6VTl03aHDfFQqHIy0 Jul 30 11:16:49 centos6-03 postfix/smtpd[101444]: disconnect from localhost[127.0.0.1]
測試POP3
[root@mail ~]# telnet 192.168.10.202 110 Trying 192.168.10.202... Connected to 192.168.10.202. Escape character is '^]'. +OK Hello there. user wangshibo@kevin.com #輸入使用者名稱 +OK Password required. pass wang@123456 #輸入密碼 +OK logged in. list #輸入list +OK POP3 clients that break here, they violate STD53. . quit #退出 +OK Bye-bye. Connection closed by foreign host. 檢視maillog日誌 [root@mail postfix]# tail -f /var/log/maillog ....... #連線pop3 埠 Jul 29 17:42:13 centos6-03 pop3d: Connection, ip=[::ffff:192.168.10.202] #需要驗證,服務型別為pop3 Jul 29 17:42:26 centos6-03 authdaemond: received auth request, service=pop3, authtype=login #使用authmysql模組認證 Jul 29 17:42:26 centos6-03 authdaemond: authmysql: trying this module #與mysql連線獲得認證資訊 Jul 29 17:42:26 centos6-03 authdaemond: authmysqllib: connected. Versions: header 50639, client 50639, server 50639 Jul 29 17:42:26 centos6-03 authdaemond: SQL query: SELECT username, password, "", 1001, 1001, '/var/mailbox', maildir, concat(quota,'S'), name, "" FROM mailbox WHERE username = 'wangshibo@kevin.com' AND (active='1') Jul 29 17:42:26 centos6-03 authdaemond: password matches successfully Jul 29 17:42:26 centos6-03 authdaemond: authmysql: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=wangshibo@kevin.com, fullname= 王士博, maildir=kevin.com/wangshibo/Maildir/, quota=524288000SS, options=<null> Jul 29 17:42:26 centos6-03 authdaemond: authmysql: clearpasswd=<null>, passwd=$1$8qUqeb7z$dqiSMpnZJrpEyBkkC.bP4/ Jul 29 17:42:26 centos6-03 authdaemond: Authenticated: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=wangshibo@kevin.com, fullname= 王士博, maildir=kevin.com/wangshibo/Maildir/, quota=524288000SS, options=<null> Jul 29 17:42:26 centos6-03 authdaemond: Authenticated: clearpasswd=wang@123456, passwd=$1$8qUqeb7z$dqiSMpnZJrpEyBkkC.bP4/ #=============== 通過認證 ================ #通過pop3登陸 Jul 29 17:42:26 centos6-03 pop3d: LOGIN, user=wangshibo@kevin.com, ip=[::ffff:192.168.10.202], port=[44178] #退出pop3 Jul 29 17:42:35 centos6-03 pop3d: LOGOUT, user=wangshibo@kevin.com, ip=[::ffff:192.168.10.202], port=[44178], top=0, retr=0, rcvd=12, sent=88, time=9 現在使用root使用者手動給wangshibo發2封郵件(可以邊查郵件日誌/var/log/maillog邊排錯!如果日誌裡沒有什麼錯誤,就去extmail的郵箱裡去檢視郵件) [root@mail ~]# mail -s 'hello' -v wangshibo@kevin.com <~/.bashrc [root@mail ~]# mail -s 'hello' -v wangshibo@kevin.com <~/.bashrc 檢視maillog日誌,看看有沒有報錯資訊 [root@mail ~]# tail -f /var/log/maillog [root@mail ~]# telnet 192.168.10.202 110 Trying 192.168.10.202... Connected to 192.168.10.202. Escape character is '^]'. +OK Hello there. user wangshibo@kevin.com #輸入使用者名稱 +OK Password required. pass wang@123456 #輸入密碼 +OK logged in. list #輸入list +OK POP3 clients that break here, they violate STD53. 1 653 #說明已經發現有一封郵件了。1代表第一封郵件,653為郵件大小 2 1849 quit #退出 +OK Bye-bye. Connection closed by foreign host. 使用wangshibo使用者登入extmail可以收到兩封郵件
登入extman管理後臺,多建立幾個基於kevin.com域名的郵箱,相互之間就能正常收發郵件了!
18)通過MUA測試收發郵件
本次MUA軟體使用Foxmail,測試使用者為wangshibo@kevin.com。需要注意的是:kevin.com郵箱域名解析時,解析要包括:mail、smtp、pop3、imap的A記錄以及MX記錄。
開啟Foxmail客戶端,建立新賬號,如下圖:
===============針對外部郵箱收發郵件的設定=================
按照上面的配置後,發現給外部郵箱傳送和接收郵件有問題,/etc/postfix/main.cf檔案修改如下: [root@mail ~]# cat /etc/postfix/main.cf myhostname = mail.kevin.com mydomain = kevin.com myorigin = $mydomain inet_interfaces = all mynetworks = 192.168.0.0/16, 127.0.0.0/8 relay_domains = $mydestination, grace.com alias_maps = $alias_database alias_database = hash:/etc/aliases mail_spool_directory = /var/spool/mail default_recipient_refill_delay = 1s #====================SASL ESMTP Authenticat================= smtpd_sasl_auth_enable = yes #smtpd_helo_required = yes smtpd_sasl_local_domain = $mydomain smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_sasl_application_name = smtpd #smtpd_banner = $myhostname ESMTP $mail_name ($mail_version) smtpd_banner = $myhostname ESMTP Jobkoo mail system (version:1.0) #=====================Vritual Mailbox settings========================= virtual_mailbox_base = /var/mailbox/ virtual_mailbox_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql/mysql_virtual_domains_maps.cf virtual_alias_domains = virtual_alias_maps = mysql:/etc/postfix/mysql/mysql_virtual_alias_maps.cf virtual_uid_maps = static:1001 virtual_gid_maps = static:1001 virtual_transport = maildrop maildrop_destination_recipient_limit = 1 maildrop_destination_concurrency_limit = 1 #====================QUOTA============================================ message_size_limit = 20000000 mailbox_size_limit = 409600000 virtual_mailbox_limit = 20000000 virtual_create_maildirsize = yes virtual_mailbox_extended = yes virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_limit_maps.cf virtual_mailbox_limit_override = yes virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later. virtual_overquota_bounce = yes 需要注意的是: 上面的main.cf檔案配置相比於之前的配置,改動的地方: 1)relay_domains這一項追加了外部郵箱的域名,比如這個要傳送或接收grace.com域名的郵件。 2)新增的外部郵箱地址,要保證postfix部署機能和外部郵箱地址通訊!如果不能通訊,則不能正常收發外部郵件! 3)smtp認證部分的smtpd_recipient_restrictions這一項只保留三個引數配置。 另外,由於grace.com域名也是公司內部域名,還需要在其正向解析配置中新增郵件的MX記錄,否則會出現傳送郵件失敗的情況! 如下,192.168.10.29和192.168.10.27是負責解析grace.com域名的兩臺DNS伺服器地址;192.168.61.201是mail.grace.com郵箱伺服器地址。 [root@mail ~]# cat /var/named/grace.com_zone $TTL 600 @ IN SOA ns.grace.com. root. ( 2017071114 2H 10M 7D 1D ) @ IN NS ns1.graces.com. @ IN NS ns2.grace.com. ns1 IN A 192.168.10.29 ns2 IN A 192.168.10.27 mail IN A 192.168.61.201 smtp IN A 192.168.61.201 pop3 IN A 192.168.61.201 imap IN A 192.168.61.201 @ IN MX 10 mail.grace.com. [root@mail ~]# cat /var/named/192.168.61.zone $TTL 600 @ IN SOA ns1.grace.com. root. ( 2017071101 2H 10M 7D 1D ) @ IN NS ns1.grace.com. @ IN NS ns2.grace.com. 201 IN PTR smtp.grace.com. 201 IN PTR pop3.grace.com. 201 IN PTR mail.grace.com. 201 IN PTR imap.grace.com. 經過上面的調整後,kevin.com域名郵箱和grace.com域名郵箱就可以相互之間傳送和接收郵件了!!!
19)郵件發垃圾和反病毒
防毒軟體
防毒軟體選用clamav,安裝clamav [root@mail ~]# cd /usr/local/src/ [root@mail src]# tar -zvxf clamav-0.94.1.tar.gz [root@mail src]# cd clamav-0.94.1 [root@mail clamav-0.94.1]# ./configure --prefix=/usr/local/clamav --with-dbdir=/usr/local/share/clamav [root@mail clamav-0.94.1]# make && make install 說明: --with-dbdir 引數指定病毒庫位置,這個路徑在clamav的配置檔案中也有出現。當指定了這個引數之後,編譯安裝後悔自動建立這個目錄。 配置clamav Clamav有2個配置檔案,一個主配置檔案/usr/local/clamav/etc/clamd.conf,一個病毒更新配置檔案/usr/local/clamav/etc/freshclam.conf。 下面分別進行配置: [root@mail clamav-0.94.1]# cp /usr/local/clamav/etc/clamd.conf /usr/local/clamav/etc/clamd.conf.bak [root@mail clamav-0.94.1]# vim /usr/local/clamav/etc/clamd.conf #清空原檔案,直接複製下面內容 # 將example注掉 # example LogFile /var/log/clamd.log LogSyslog yes LogVerbose yes PidFile /var/run/clamav/clamd.pid TemporaryDirectory /dev/shm/clamav/tmp DatabaseDirectory /usr/local/share/clamav LocalSocket /tmp/clamd.socket StreamMaxLength 20M #附件大小,超過20M不掃描 User amavis ScanMail yes ScanArchive yes [root@mail clamav-0.94.1]# cp /usr/local/clamav/etc/freshclam.conf /usr/local/clamav/etc/freshclam.conf.bak [root@mail clamav-0.94.1]# vim /usr/local/clamav/etc/freshclam.conf #清空原檔案,直接複製下面內容到檔案中 # 將example注掉 # example DatabaseDirectory /usr/local/share/clamav UpdateLogFile /var/log/freshclam.log PidFile /var/run/clamav/freshclam.pid DatabaseOwner amavis DatabaseMirror db.CN.clamav.net DatabaseMirror database.clamav.net 說明: 在上面兩個配置檔案中,都有使用者的設定,這裡都設定成了amavis 。為什麼不用預設的使用者clamav而使用amavis呢?這樣做的目的是為了與amavis-new結合在一起。 配置中的socker是防毒程式的socket檔案位置,後面與amavis-new結合使用的時候配置amavis-new需要指定這個檔案。 修改相應目錄許可權 [root@mail clamav-0.94.1]# chown -R amavis.amavis /usr/local/share/clamav [root@mail clamav-0.94.1]# chown -R amavis.amavis /dev/shm/clamav/ [root@mail clamav-0.94.1]# touch /var/log/freshclam.log [root@mail clamav-0.94.1]# chown amavis.amavis /var/log/freshclam.log [root@mail clamav-0.94.1]# touch /var/log/clamd.log [root@mail clamav-0.94.1]# chown amavis.amavis /var/log/clamd.log [root@mail clamav-0.94.1]# mkdir -p /var/run/clamav/ [root@mail clamav-0.94.1]# chown amavis.amavis /var/run/clamav/ -R 手動更新病毒庫並執行防毒程式(啟動後,執行ps -ef|grep clamd,確保/tmp/clamd.socket存在) [root@mail clamav-0.94.1]# /usr/local/clamav/bin/freshclam --daemon [root@mail clamav-0.94.1]# /usr/local/clamav/sbin/clamd LibClamAV Warning: ************************************************** LibClamAV Warning: *** The virus database is older than 7 days! *** LibClamAV Warning: *** Please update it as soon as possible. *** LibClamAV Warning: ************************************************** [root@mail clamav-0.94.1]# 將病毒庫升級和防毒程式設定為隨系統啟動 [root@mail clamav-0.94.1]# echo "/usr/local/clamav/bin/freshclam --daemon" >> /etc/rc.local [root@mail clamav-0.94.1]# echo "/usr/local/clamav/sbin/clamd" >> /etc/rc.local
郵件病毒掃描與垃圾郵件過濾
amavisd-new程式是提供postfix郵件掃描防毒的,因此需要連線clamav防毒軟體和postfix程式。 安裝 [root@mail ~]# cd /usr/local/src/ [root@mail src]# tar -zvxf amavisd-new-2.6.4.tar.gz [root@mail src]# cd amavisd-new-2.6.4 [root@mail amavisd-new-2.6.4]# mkdir -p /var/amavis/{tmp,var,db} [root@mail amavisd-new-2.6.4]# chown -R amavis.amavis /var/amavis [root@mail amavisd-new-2.6.4]# chmod -R 750 /var/amavis [root@mail amavisd-new-2.6.4]# cp amavisd /usr/local/sbin/ [root@mail amavisd-new-2.6.4]# chown root /usr/local/sbin/amavisd [root@mail amavisd-new-2.6.4]# chmod 755 /usr/local/sbin/amavisd [root@mail amavisd-new-2.6.4]# cp amavisd.conf /etc/ [root@mail amavisd-new-2.6.4]# chown root /etc/amavisd.conf [root@mail amavisd-new-2.6.4]# chmod 644 /etc/amavisd.conf [root@mail amavisd-new-2.6.4]# mkdir /var/virusmails [root@mail amavisd-new-2.6.4]# chown amavis.amavis /var/virusmails [root@mail amavisd-new-2.6.4]# chmod 750 /var/virusmails 配置Amavisd與Clamav結合 [root@mail amavisd-new-2.6.4]# cp /etc/amavisd.conf /etc/amavisd.conf.bak [root@mail amavisd-new-2.6.4]# vim /etc/amavisd.conf $max_servers=8; $daemon_user = 'amavis'; $daemon_group = 'amavis'; $mydomain = 'kevin.com'; $db_home = "$MYHOME/db"; $inet_socket_port = 10024; $sa_tag_level_deflt = 5.0; $sa_tag2_level_deflt = 6.2; $sa_kill_level_deflt = $sa_tag2_level_deflt; $virus_admin = "virusalert@$mydomain"; $sa_spam_subject_tag = '***SPAM*** '; $forward_method = 'smtp:127.0.0.1:10025'; $notify_method = $forward_method; $final_virus_destiny = D_DISCARD; $final_banned_destiny = D_DISCARD; $final_spam_destiny = D_PASS; ['ClamAV-clamd', &ask_daemon, ["CONTSCAN {}n", "/tmp/clamd.socket"], qr/bOK$/, qr/bFOUND$/, qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ], # 在154行左右,修改投遞/攔截的方法: $final_virus_destiny = D_DISCARD; $final_banned_destiny = D_BOUNCE; $final_spam_destiny = D_PASS; $final_bad_header_destiny = D_PASS; 需要注意: 1)配置檔案編寫完成後使用執行/usr/local/sbin/amavisd debug 進行除錯。如果發現缺少perl元件就利用yum search 查詢相關元件, 最後用yum 安裝,這樣來的方便些! 2)配置中的socket部分是clamav 防毒軟體的socket檔案,這個檔案的位置是在配置clamav的時候指定的,在這裡配置amavis時一定要指定正確! 3)最後四行部分是amavisd執行時開啟的埠號 4)forward_method部分是與postfix連線時需要連線的地址和埠號。這個地址是在postfix的master.cf檔案中指定的。後文會介紹。 5)最後4個設定中,對spam(垃圾郵件)預設會直接反彈(BOUNCE),現在修改為繼續投遞(PASS)但在信頭中增加相關X-Spam- Status資訊等。 這樣可以很方便的在extmail中設定將被標記為垃圾郵件的mail投遞到"垃圾郵件箱"中,便於使用者翻查。 垃圾郵件過濾服務spamassassin安裝配置 [root@mail ~]# cd /usr/local/src/ [root@mail src]# wget http://archive.apache.org/dist/spamassassin/Mail-SpamAssassin-3.0.0.tar.gz [root@mail src]# tar -zvxf Mail-SpamAssassin-3.0.0.tar.gz [root@mail src]# cd Mail-SpamAssassin-3.0.0 [root@mail Mail-SpamAssassin-3.0.0]# perl Makefile.PL #一路回車,預設配置即可 [root@mail Mail-SpamAssassin-3.0.0]# make && make install mail:: spamassassin配置 [root@mail Mail-SpamAssassin-3.0.0]# cp /etc/mail/spamassassin/local.cf /etc/mail/spamassassin/local.cf.bak [root@mail Mail-SpamAssassin-3.0.0]# vim /etc/mail/spamassassin/local.cf #required_hits 5 #report_safe 0 #rewrite_header Subject [SPAM] required_hits 5 use_bayes 1 bayes_auto_learn 1 skip_rbl_checks 0 use_razor2 1 use_pyzor 0 啟動spamassassin 並加入到系統啟動 [root@mail Mail-SpamAssassin-3.0.0]# /usr/local/bin/spamd --daemonize --pidfile /var/run/spamd.pid [root@mail Mail-SpamAssassin-3.0.0]# echo "/usr/local/bin/spamd --daemonize --pidfile /var/run/spamd.pid" >> /etc/rc.local 啟動amavisd並加入到系統啟動 [root@mail Mail-SpamAssassin-3.0.0]# /usr/local/sbin/amavisd start [root@mail Mail-SpamAssassin-3.0.0]# echo "/usr/local/sbin/amavisd start ">>/etc/rc.local 配置Postfix 整合amavisd-new(注意下面的-o內容不能頂格寫,要空格,否則postfix服務會啟動失敗,通過/var/log/maillog日誌能看出啟動資訊) [root@mail Mail-SpamAssassin-3.0.0]# cp /etc/postfix/master.cf /etc/postfix/master.cf.bak2 [root@mail Mail-SpamAssassin-3.0.0]# vim /etc/postfix/master.cf 127.0.0.1:10025 inet n - n - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000 -o receive_override_options= 編輯/etc/postfix/main.cf [root@mail Mail-SpamAssassin-3.0.0]# cp /etc/postfix/main.cf /etc/postfix/main.cf.bak2 [root@mail Mail-SpamAssassin-3.0.0]# vim /etc/postfix/main.cf #在最後新增 # Content-Filter content_filter = smtp:[127.0.0.1]:10024 receive_override_options = no_address_mappings 需要注意: 1)這裡content_filter 選項指定的smtp:[127.0.0.1]:10024 埠正是配置amavisd-new時所指定的。 2)receive_override_options 這裡必須增加,禁止地址展開/影射,否則如果遇到別名的時候會引起冗餘郵件的產生。 重啟postfix [root@mail Mail-SpamAssassin-3.0.0]# /etc/init.d/postfix restart Shutting down postfix: [ OK ] Starting postfix: [ OK ]
測試Clamav
先登入extmail介面建立bobo@kevin.com賬號,利用wangshibo@kevin.com賬號給bobo@kevin.com賬號發郵件,因為遇到郵件中有病毒或垃圾郵件的話, postfix會給wangshibo@kevin.com發一封郵件。 利用telnet測試25埠,過程如下: [root@mail ~]# telnet localhost 25 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.kevin.com ESMTP Jobkoo mail system (version:1.0) mail from:<wangshibo@kevin.com> #輸入發件郵箱 250 2.1.0 Ok rcpt to:<bobo@kevin.com> #輸入目標郵箱 250 2.1.5 Ok data #輸入這個 354 End data with <CR><LF>.<CR><LF> X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* #輸入這個 . #輸入這個 250 2.0.0 Ok: queued as DD4A3A0673 quit #輸入這個 221 2.0.0 Bye Connection closed by foreign host. 檢視郵件日誌 [root@mail ~]# tail -f /var/log/maillog ....... Jul 30 02:13:30 centos6-03 amavis[9707]: (09707-02) Passed CLEAN, [127.0.0.1] [127.0.0.1] <wangshibo@kevin.com> -> <bobo@kevin.com>, Message-ID: <20180729181322.70E8CA0681@mail.kevin.com>, mail_id: xvp4rzGLpwmT, Hits: -, size: 365, queued_as: 4A837A0689, 196 ms ....... Jul 30 02:13:30 centos6-03 authdaemond: received userid lookup request: bobo@kevin.com Jul 30 02:13:30 centos6-03 authdaemond: authmysql: trying this module Jul 30 02:13:30 centos6-03 authdaemond: SQL query: SELECT username, password, "", 1001, 1001, '/var/mailbox', maildir, concat(quota,'S'), name, "" FROM mailbox WHERE username = 'bobo@kevin.com' AND (active='1') Jul 30 02:13:30 centos6-03 authdaemond: Authenticated: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=bobo@kevin.com, fullname=bobo, maildir=kevin.com/bobo/Maildir/, quota=524288000SS, options=<null> Jul 30 02:13:30 centos6-03 authdaemond: Authenticated: clearpasswd=<null>, passwd=$1$Gj0qfSAN$iHQjS0BeNfbeArKL1MQ8D0 Jul 30 02:13:30 centos6-03 postfix/smtp[19451]: 70E8CA0681: to=<bobo@kevin.com>, relay=127.0.0.1[127.0.0.1]:10024, delay=8.6, delays=8.4/0/0/0.2, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=09707-02, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 4A837A0689) 說明: 從日誌中可以清楚的看到,剛剛測試的郵件被amavis捕捉到了,上面maillog中第一部分資訊表示被amavis攔截了。這時郵件經過postfix打包,發給了bobo@kevin.com 這個賬戶;從第二部分日誌資訊中可以很清楚的看到。通過extmail登陸bobo@kevin.com後可以看到警報郵件的內容,如下圖:
最終測試
現在通過簡單的email收發來確認系統是否正常。 傳送測試郵件 輸入以下命令,通過telnet方式給wangshibo@kevin.com傳送一封測試信件 [root@mail ~]# telnet localhost 25 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.kevin.com ESMTP Jobkoo mail system (version:1.0) mail from:<wangshibo@kevin.com> #輸入這個 250 2.1.0 Ok rcpt to:<bobo@kevin.com> #輸入這個 250 2.1.5 Ok data #輸入這個 354 End data with <CR><LF>.<CR><LF> Subject: Hello World #輸入這個 Hello World! #輸入這個 . #輸入這個 250 2.0.0 Ok: queued as 23EC7A0681 quit #輸入這個 221 2.0.0 Bye Connection closed by foreign host. 此時通過另一個命令列視窗,觀察maillog,將看到如下資訊: [root@mail clamav-0.94.1]# tail -f /var/log/maillog ........ Jul 30 02:21:37 centos6-03 amavis[9708]: (09708-01) Passed CLEAN, [127.0.0.1] [127.0.0.1] <wangshibo@kevin.com> -> <bobo@kevin.com>, Message-ID: <20180729182117.23EC7A0681@mail.kevin.com>, mail_id: q8itRecEZJag, Hits: -, size: 332, queued_as: 5D4BBA068D, 1239 ms Jul 30 02:21:37 centos6-03 postfix/smtp[19467]: 23EC7A0681: to=<bobo@kevin.com>, relay=127.0.0.1[127.0.0.1]:10024, delay=26, delays=25/0/0/1.2, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=09708-01, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 5D4BBA068D) Jul 30 02:21:37 centos6-03 authdaemond: received userid lookup request: bobo@kevin.com Jul 30 02:21:37 centos6-03 authdaemond: authmysql: trying this module Jul 30 02:21:37 centos6-03 postfix/qmgr[10803]: 23EC7A0681: removed ....... 說明: 上述日誌表示郵件經過了amavisd-new的掃描,並且已經通過maildrop投遞到使用者的maildir了,黃色字型表面通過檢查。
20)啟動服務項及程式整理
courier-authlib [root@mail ~]# chkconfig courier-authlib on [root@mail ~]# service courier-authlib start postfix [root@mail ~]# chkconfig --list postfix [root@mail ~]# service postfix start imapd [root@mail ~]# chkconfig imapd on [root@mail ~]# service imapd start extmail 圖形監控 加入啟動項 [root@mail ~]# echo "/usr/local/mailgraph_ext/mailgraph-init start">>/etc/rc.local [root@mail ~]# echo "/usr/local/mailgraph_ext/qmonitor-init start">>/etc/rc.local 啟動 /usr/local/mailgraph_ext/mailgraph-init start /usr/local/mailgraph_ext/qmonitor-init start clamav 加入啟動項 [root@mail ~]# echo "/usr/local/clamav/bin/freshclam --daemon" >> /etc/rc.local [root@mail ~]# echo "/usr/local/clamav/sbin/clamd" >> /etc/rc.local 啟動 [root@mail ~]# /usr/local/clamav/bin/freshclam --daemon [root@mail ~]# /usr/local/clamav/sbin/clamd amavisd-new [root@mail ~]# /usr/local/sbin/amavisd start [root@mail ~]# echo "/usr/local/sbin/amavisd start ">>/etc/rc.local 啟動spamassassin 並加入到系統啟動 [root@mail ~]# /usr/bin/spamd --daemonize --pidfile /var/run/spamd.pid [root@mail ~]# echo "/usr/bin/spamd --daemonize --pidfile /var/run/spamd.pid" >>/etc/rc.local
21)郵件伺服器壓力測試-利用Postal工具
postal下載:http://doc.coker.com.au/projects/postal/ postal安裝 [root@mail ~]# tar -zxvf postal7.tgz [root@mail ~]# cd postal7 [root@mail postal7]# ./configure [root@mail postal7]# make [root@mail postal7]# make install [root@mail postal7]# make clean 壓力測試(maillist.txt檔案中放入大量的郵件賬號,進行壓力測試) [root@mail ~]# postal -m 100 -p 25 192.168.10.202 maillist.txt
================登入extman的時候,報錯===============
Can't open /tmp/extman//sid_cdbff585272d01da9209e113acb4d90f, No such file or directory (2012-06-08 15:19:42)轉載▼ 解決辦法: [root@mail ~]# mkdir /tmp/extman [root@mail ~]# chown -R postfix:postfix /tmp/extman [root@mail ~]# chmod -R 777 /tmp/extman 可以寫一個指令碼, 檢查/tmp下是否有extman目錄, 如果沒有, 就建立該目錄並授權, 指令碼內容如下: [root@mail ~]# cat /opt/tmp_monit_extman.sh #!/bin/bash ls -l -d /tmp/extman if [ $? -ne 0 ];then /bin/mkdir /tmp/extman /bin/chown -R postfix:postfix /tmp/extman /bin/chmod -R 777 /tmp/extman else echo "it is ok" >/dev/null 2>&1 fi 新增指令碼執行許可權, 並設定計劃任務, 每一分鐘執行一次 [root@mail ~]# chmod 755 /opt/tmp_monit_extman.sh [root@mail ~]# crontab -l * * * * * /bin/bash -x /opt/tmp_monit_extman.sh >/dev/null 2>&1