Internet上最基本的服務,現在應該大部分人都有自己的郵箱吧,用的人多,但理解的人估計沒多少,我自己以前也是常常用,但對其原理並不操心。今天就來操心下,進行個小總結
一.郵件服務的基本流程
郵件服務器構成了電子郵件系統的核心。每個收信人都有一個位於某個郵件服務器上的郵箱(mailbox)。首先,當你將E-mail輸入你的計算機開始發送時,計算機會根據SMTP協議和TCP/IP協議的要求將你的信件"打包",並加注信件頭后送到你所屬服務商的郵件服務器上,這就相當於我們平時將信件投入郵筒后,郵遞員把信從郵筒中取出來並按照地區分類。然后,郵件服務器根據你注明的收件人地址,通過路由器按照當前網上傳輸的情況,尋找一條最不擁擠的路徑,將信件傳到下一個郵件服務器。接着,這個服務器也如法炮制,將信件往下傳送。參與傳遞信件的每一個服務器都會在信件頭上注明自己的名稱以及上一級郵件服務器的名稱和有關的傳輸記錄。這一步相當於郵局之間的轉信,即當郵件被分類以后,由始發地郵局運往目的地的省會郵局,然后由省會郵局轉給下一級的地區郵局,這樣層層向下傳遞,最終到達用戶手中。最后,E-mail被送到用戶服務商的服務器上,保存在服務器上的用戶E-mail信箱中。用戶個人終端電腦通過與服務器的連接從其信箱中讀取自己的E-mail。這一步相當於信件已經被傳送到了你的個人信箱中,你自己拿鑰匙打開信箱就可以讀取信件了。
比如dl的郵箱用於管理和維護已經發送給他的郵件消息。一個郵件消息的典型旅程是從發信人的用戶代理開始,游經發信人的郵件服務器,中轉到收信人的郵件服務器,然后投遞到收信人的郵箱中。基本過程就是如此。
二.相關名詞解釋
1. MUA (message user agent)
郵件用戶代理; 由於通常我們 Client 端的計算機都無法直接寄信的,所以,需要透過 MUA 來幫我們傳達信件,不論是送信還是收信,Client 端的用戶都需要透過各個操作系統提供的 MUA(比如foxmail和outlook) 才能夠使用郵件系統.
從MTA取的信,或者通過POP,IMAP把信發到MTA上(將信息傳送給郵件傳輸代理(MTA ))---后面會詳細提及
2.MTA (message transfer agent)
郵件傳輸代理,MUA 是用在 Client 端上面的軟件,那么這個 MTA 就是用在郵件主機上面的軟件;監視MUA的請求 ,找出對方的MTA,把信傳到對方MTA服務器,或者把信收到郵件隊列(決定信息送至目的地的路由,然后根據情況決定是否還需要將信息交給中介郵件傳輸代理)
其功能有以下幾個:
★收受外部主機寄來的信件:既然是郵件主機,那么接收郵件就是其主要功能, MTA 最主要的功能就是收受外部來的信件,只要這個信件里面有 MTA 內部的賬號時,那么這封信就會被 MTA 收下來;
★幫使用者寄出信件:只要使用者具有合法的使用MTA的權利,那么就可以利用這部MTA將信件傳送出去,只不過MTA會將信件送給目的地的MTA而不是目的地的MUA,這個可千萬別弄混了。比如,我用我的qq郵箱給朋友的163郵箱發信,那么我肯定是通過qq的郵件服務器(MTA)發送給朋友的網易郵件服務器(MTA),然后我朋友才從其個人電腦上通過MUA軟件(比如foxmail,outlook)來收取網易服務器上的信件。這就是前面說的監視MUA的請求 ,找出對方的MTA,把信傳到對方MTA服務器
★讓使用者自己的信可以收回去:使用者可以將放置在郵件主機的信件收到自己的個人計算機上面收看。
3.MDA (message deliver agent)
郵件投遞代理 ---把信最終投遞到具體的用戶;主要功能是將MTA所收到的信件,依照信件的流向(送到那里去)來將該信件放置到本機賬戶下的郵件檔案中(mailbox_收件箱),或者再經由MTA將這個信件發送到下個MTA;
如果我們的信件流向是流向本機,這個郵件代理功能就不僅限於將MTA傳遞來的郵件放置於使用者的mailbox,其還具備一定的郵件分析功能:比如我們申請的一些網站的郵箱常常具備的過濾垃圾郵件的功能,其會自動將一些名字比較符合“垃圾”的郵件自動拒絕或者放置與垃圾桶中等等。還有就是我們收信時候常常會遇到的自動回復功能。比如我給無憂網上的公司發招聘郵件,我常常會收到其自動回復類似於歡迎應聘之類的信息,這也是MDA的功能。
我們使用比較廣泛的我們使用的foxmail和outlook只是一個MUA和MDA,而一個郵件服務器扮演了兩個角色,MTA和MDA
三.基本流程
其實前面已經說過流程了,不過在明白相關的名字解釋后,再來敘述次整個流程似乎概念會更清晰些。基本流程如下:
1.使用者利用MUA寄信到MTA上面。
2.MTA收到自己的信后,交由MDA發送到該賬號的mailbox中。
3. MTA 將信再轉送出去:如果由 第一步來的信件的收件人並不是 MTA 的內部賬號,那么該封信將會被再轉送出去,這也就是郵件傳遞(relay)的功能
4. 遠程 MTA 收受本地的 MTA 所發出的郵件:遠程的 MTA 會收受我們這部 MTA 的信件,並將該信件交給他的 MDA 來處理,此時,信件會存放在遠程的 MTA 上面,等待使用者登錄讀取或者下載回去!
舉個例子
我電腦上裝有foxmail軟件,我通過此軟件將我qq郵箱的信發送給我網易郵箱:
1. 首先打開我的foxmail,寄信人是
dl@qq.com,收信人是dl@163.com.填寫好信的內容后,我點發送開始寄信,這個時候信是先郵寄到QQ公司的MTA服務器上的(這就是前面說的第一步)
2. QQ公司的MTA服務器收到俺的MUA傳遞來的信后,會判斷這個收信地址是否是QQ公司MTA的內部地址,如果是的話,則直接傳遞給MDA(foxmail),並放置到其收件箱中(這就是前面說的第2步)
3. QQ公司的MTA服務器經過判斷,發現原來收信人是網易郵箱,不是咱QQ的,那么QQ公司的MTA會將此信根據地址發送給網易公司的MTA服務器。(這就是第三步)
4. 網易公司收到來自QQ公司的郵件后,也會做出判斷,根據其具體收信地址將信件交給某個賬號下的MDA來處理,在客戶端的MDA(foxmail)沒有收信前,郵件會一直保存在網易的MTA上,等待使用者登陸讀取或者是下載。
通常情況下 一封 郵件通過MUA把信傳到MTA服務器 或者從MTA服務器把信取到本機通過MTA傳送給對方的MTA服務器的服務隊列,通過MDA發給指定用戶。
四.使用的協議
在網絡世界干什么都是離不開協議的,郵件服務自然更不能例外。有三個基本的協議是必須要提到的:
1.SMTP:Simple Mail Transfer Protocol/簡單郵件傳送協議
定義郵件傳送,基於TCP服務的應用層, 明文傳送,SMTP協議使用25端口;在寄信的時候MUA會主動連接MTA的25端口,然后將信由MTA的SMTP協議發送出去,而郵件主機MTA在傳遞的時候,也是經由下一部MTA的25端口來將信送出去。
基礎使用方法:
telnet linux102.example.com 25
ehlo linux102 //通報來訪者地址
mail from :dl@ linux102.example.com //發件人地址
rcpt to :dl@163.com //收件人地址
data //輸入正文內容
it's test! //正文內容
. //句號的圓點表示寫信結束的意思
quit //退出
2.POP3:Post office Protocol 3 / 郵局協議第三版
POP3協議適用於不能時時在線的郵件用戶。支持客戶在服務器上租用信箱,
然后利用POP3協議向服務器請求下載,基於TCP/IP協議與客戶端/服務端模型,POP3的認證與郵件傳送都采用明文,使用110端口。
基本流程是收信是 MUA 經由 POP協議來連接到 MTA 的使用者 Mailbox,以讀取或者下載使用者在 Mailbox 當中的信件。目前常用的 POP 協議為 POP3 ( Post Office Protocol version 3 ),你的 MUA 經由 MTA 的 port 110 將信件由 MTA 的 mailbox 當中將信件收到本地端的 MUA 上面供你瀏覽!同樣的,只要 MTA 與 MUA 同時支持 POP3 這個協議,那么信件就可以自由的收受了!
所以我們知道了!
3.IMAP:internet Message Access Protocol /英特網信息存取協議
另一種從郵件服務器上獲取郵件的協議,與POP3相比,支持在下載郵件前先行下載郵件頭以預覽郵件的主題來源,基於TCP/IP,使用143端口。
在 pop3 的收信協議中,一般來說,當 client 端收完了主機端的信件之后,則該信件會主動的被主機端所刪除!不過, IMAP 則可以避免這個問題! IMAP 具有讓使用者 ( client 客戶端 ) 自行定義信件放置的目錄功能,以及是否要儲存下載的信件之后,原信件是否保留在主機上面的功能!
總結:寄信的時候通過25端口使用smtp協議,收信的時候則是通過110端口使用pop3協議。
通常一部提供收發信件的 MTA ( 不考慮 Web 接口的郵件主機 ) 至少需要兩個協議,分別是 SMTP 與 POP3 !而且,只要你的 MUA 與 MTA 同時均支持 SMTP 與 POP3 ,那么彼此就可以溝通,這也是為什么你使用 foxmail 寄出的信,但是你的朋友可以使用 outlook 收下來的原因!
五.什么是 Relay 與認證機制
前面我們已經提起過relay。現在我們再回顧一下:當MTA服務器收到郵件后,如果收件者不是MTA本身的賬號,那么此MTA會將郵件再傳送到下一個MTA上去,這個功能其實就是relay。因為每台MTA都是具有relay功能的,那是否任何人都可以通過任意一台MTA服務器進行郵件傳遞了呢?為了防止此類事情的發生,所以都不會對外完全的開放 Relay 的功能的!而是預設為僅針對主機開放relay功能(通過access),這樣的MTA是可以收到來自internet上面注明是本機賬戶的信件,所以MTA在收信上是OK的。但是在發信的時候,就比較麻煩了,凡是在access中沒設置的對外地址,則不能對外發信,而且如果通過access來設置一些規范內的ip的話,也很麻煩,萬一是adsl,那ip地址來回改變的豈不是很糟糕。所以就需要通過郵件認證機制來防范
『郵件認證機制』在 MTA 當中加入需要檢查發信者的『賬號與密碼』比對的功能,當 MTA 接到來自 Client 端的傳信需求時,會檢查來自 Client 端的認證比對(賬號密碼),如果賬號與密碼比對正確,則開始接受信件並幫忙轉信,如果比對不正確則將該 MTA 並不會接受該封信件,直接在 Client 端顯示『不接受您的信件』之類的訊息!目前有相當多種的郵件認證機制,目前廣為使用的是SMTP 郵件認證這個機制。
所謂的 SMTP 郵件認證機制,顧名思義,就是在 smtp 這個協定上面動手腳的一個機制!亦即是在寄信的時候,(由MUA 到 MTA 那個第一個的步驟中 ),我們的 MTA 主機『一定要求檢驗 MUA 發信者的賬號與密碼!』這樣的功能!那么你的 MTA 就可以在經過認證之后,提供認證者的 Relay 功能,因為經由『認證』的機制,你的 MTA 會去分析寄信者的相關信息,通過后才會接受信件並幫他們寄信,否則就不接受信件!透過這樣的機制,您將不需要規范 Relay 的 IP 或網段,直接交給 SMTP 郵件認證來幫你管理你寄件者的 Relay 功能。這就是我們常用的郵箱賬號和密碼。
六.常用軟件
sendmail 是使用smtp協議的郵件提交工具,承擔mta和MDA的作用
后台進程:sendmail;腳本:/etc/init.d/sendmail ;使用端口:25(smtp);所需RPM包:sendmail
1. 安裝所需的軟件
[root@linux102 ~]# rpm -qa | grep sendmail //檢查我是否安裝了此軟件
sendmail-cf-8.13.8-2.el5
sendmail-8.13.8-2.el5
[root@linux102 ~]# rpm -q mailx //檢查我是否有安裝mailx
mailx-8.1.1-44.2.2
2. 套件內容解釋
安裝好sendmail后,linux系統上會有如下一些目錄etc/mail/sendmail.mc;/etc/mail/sendmail.cf;/etc/mail/access;/etc/mail/access.db;/etc/aliases;…..等等。主要分為以下幾類:
(1) 設定檔案:
Sendmail 的設定檔幾乎全部都在 /etc/mail 底下,主要由以下幾個:
★sendmail.cf:是默認的sendmail主要配置文件,但這個文件是很復雜的,我們一般不做更改,(主要我們也看不懂啊)而是通過對sendmail.mc的更改來變相的更改sendmail.cf文件
★ local-host-names:這個檔案主要用來處理一個主機同時擁有多個主機名稱時候的收發信件主機名稱問題,當你的主機擁有多個 HOSTNAME 的時候,多個主機名必須都寫在此文件中時,這幾個主機名的域名才可以正常收信。類似於web服務器中的虛擬主機設置。比如linux102.example.com和linux103.example.com是兩個主機名,現在我想這兩個主機名都可以收發郵件,那么就要將這2個名字都寫在 local-host-names中去,一個名字占一行。
★ access.db:這個是規定誰可以或不可以使用本郵件服務器的數據庫,要轉成這個數據庫需要藉由 makemap 以及 /etc/mail/access 檔案的配合!這個檔案可以說是 Sendmail 里面最重要的『使用者權限管理』的數據了!
★ /etc/mail/aliases.db 或 /etc/aliases.db:這個 aliases.db 是用來設定『信箱別名』!可以由這個檔案的設定來規范你的『群組收信』!不過,還需要由 aliases 及 newaliases 來做成這個檔案才行!比如我想發給admin 的信同時被test1和test2收到,那么就可以在這里面進行設定。后面再提及。
(2) 執行檔案
★ /usr/sbin/sendmail:就是 sendmail 的主要執行檔!他會讀取 sendmail.cf 這個檔案的設定內容喔。你在發送信件時,就是使用這支程序啦!啟用這支程序之后,預設的啟用的 25端口
★/usr/sbin/makemap:主要將 access 轉成 access.db 的數據庫制作的執行文件;
★ /usr/sbin/mailstats:將 /etc/mail/statistics 檔案讀出來的一支程序!可以查看到目前為止 Sendmail 工作共傳送、接收多少郵件啰!
★/usr/bin/newaliases:將 /etc/mail/aliases 轉成 /etc/mail/aliases.db 的執行檔!不僅僅可以轉換aliases,其他的也可以。
★ /usr/bin/mailq:用來觀察 /var/spool/mqueue 這個郵件暫存目錄的數據情況的指令!
(3)郵件的相關目錄
sendmail 接收下來的郵件放置在哪里呢?
★ /var/spool/mail :這個是郵件『收受下來之后,每個使用者信件放置的目錄』,一個賬號會使用掉一個檔案,例如你的賬號為 test ,那么你的信在 Server 中時,就是 /var/spool/mail/test 這個檔案了!此外,你的 POP3 的協議亦是使用這個目錄中的 mailbox 做為預設的郵件取得的檔案數據★ /var/spool/mqueue:當郵件由於對方主機的問題,或者是網絡的問題,而無法送出去時,那么該封郵件將會暫時的存放在這個目錄下,然后主機會每隔大約 30 ~ 60 分鍾重新嘗試傳送一遍,通常設定在五天內該封信件還寄不出去,那就會退給原發信者了! Mailq命令查看的就是此文件
★ /var/spool/clientmqueue:這是新的 sendmail 8.12 版本才會出現的隊列目錄。當你使用簡單的sendmail發郵件的時候,或者系統默認要發一些郵件(比如cron發的郵件)的時候,首先會把郵件拷貝到這個目錄里,然后等待MTA(mail transfer agent) 來處理,MTA做的事情通常是把這個目錄中的郵件弄到/var/spool/mqueue里,然后再發送到真正的目的地。出現/var/spool/clientmqueue/非常大的情況通常因為沒有合適的MTA發送郵件,就都積累在這里了
大致上的檔案就是這樣啦!接下來談一下如何設定 sendmail 吧!
- 設定sendmail
在配置sendmail前,我們一般要設置好DNS服務,畢竟郵件服務是和DNS緊密相連的,不然你的郵件域名在網絡上找不到豈不是白搭。所以我們要檢查DNS是否有MX記錄指向你的郵件服務器。這里就不細說了,dns前面已經總結過了,按前面所說的配置就好了,這里只是強調下別忘記在dns中做相應的搭配。
(1) 搭建一個簡單的可以收發郵件的服務器
通過前面的總結我們知道sendmail最主要的配置就是sendmail.cf文件。我們可以通過配置sendmail.mc來進行更改sendmail.cf。
在sendmail.mc文件中是以dnl為開頭,以dnl為結尾,配置參數寫在兩個dnl之間。
[root@station47 mail]# vi sendmail.mc
116 dnl # address restriction to accept email from the internet or intranet.
117 dnl #
118 dnl # DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')nl //注釋掉此行,意思是監聽所有端口,否則只能本機去收發信件
我們說過,默認的設定檔里面已經將郵件來源的接口定義為『僅來自 127.0.0.1 這個界面』,亦即是只監聽本地端口,要讓其他客戶端可以使用我們的服務器,我們要把127.0.0.1改成0.0.0.0或者直接注釋掉。請注意,這里僅開放『監聽』而不是開放 Relay。
改好后,保存退出,並重啟服務
[root@station47 mail]# make -C /etc/mail //本身編輯的是sendmail.mc文件,必須make以此來編輯sendmail.cf文件。其實make可以編輯/etc/mail下的所有需要將數據轉換成數據庫的文件。
make: Entering directory `/etc/mail'
make: Leaving directory `/etc/mail'
[root@station47 mail]# service sendmail restart
Shutting down sendmail: [FAILED]
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]
查看端口是否被監聽:
試驗收發郵件
[root@linux102 mail]# telnet 192.168.1.102 25 //通過25端口連接102服務器
Trying 192.168.1.102...
Connected to linux102.example.com (192.168.1.102).
Escape character is '^]'.
220 linux102.example.com ESMTP Sendmail 8.13.8/8.13.8; Tue, 13 Sep 2011 07:50:54 -0700
mail from :dongliang@linux102.example.com //寄信人
250 2.1.0 dongliang@linux102.example.com... Sender ok //sender ok 表示成功
rcpt to: lee@linux102.example.com //收件人的地址
250 2.1.5 lee@linux102.example.com... Recipient ok
Data //開始撰寫正文
354 Enter mail, end with "." on a line by itself //表示文字末尾用"."來結束
Test //正文內容
test
. //結束正文
250 2.0.0 p8DEosgN021895 Message accepted for delivery
Quit //退出
221 2.0.0 linux102.example.com closing connection
Connection closed by foreign host.
[root@linux102 mail]# mail -u lee //查看lee用戶的收件箱
Mail version 8.1 6/6/93. Type ? for help.
"/var/mail/lee": 2 messages 1 new 2 unread
U 1 MAILER-DAEMON@163.co Mon Sep 5 05:56 66/2207 "Warning: could not se"
>N 2 dongliang@linux102.e Tue Sep 13 07:51 13/617
& 2 //查看第2封信
Message 2:
From dongliang@linux102.example.com Tue Sep 13 07:51:38 2011
Date: Tue, 13 Sep 2011 07:50:54 -0700
From: linux02 <dongliang@linux102.example.com>
X-Authentication-Warning: linux102.example.com: linux102.example.com [192.168.1.102] (may be forged) didn't use HELO protocol
test
test
&
Ok,說明我剛才通過dongliang 這個用戶給lee用戶寄信是成功的。瞧最簡單的收發信件就是這么簡單就可以了。
(2) 通過多個主機名來收發郵件
前面我們是最簡單的一個收發郵件的方法,但前面這個我們是通過ip地址去訪問的,但如果我們是用域名呢?首先假設我的DNS服務都是已經配置ok的,這個時候如果我的主機有兩個域名linux102.example.com和 linux103.example.com. 現在我只想linux102的域名收發信件,而另外一個域名不收發信件,則只需將linux103的域名寫入local-host-names即可,如果我想要兩個域名都可以收發信件則需將兩個域名都寫入local-host-names中:
[root@linux102 mail]# vi local-host-names //編輯local_host_names
# local-host-names - include all aliases for your machine here
linux102.example.com //添加主機名稱
linux103.example.com
[root@linux102 mail]# telnet 192.168.1.102 25
Trying 192.168.1.102...
。。。。。。。。。。。
mail from:dongliang@linux102.example.com //linux102的域名為寄信者
250 2.1.0 dongliang@linux102.example.com... Sender ok
rcpt to:lee@linux103.example.com //linux103的域名為收信者
250 2.1.5 lee@linux103.example.com... Recipient ok
data test1
354 Enter mail, end with "." on a line by itself
it is test1 //郵件正文
.
250 2.0.0 p8DF8o5g022116 Message accepted for delivery
quit
221 2.0.0 linux102.example.com closing connection
Connection closed by foreign host.
[root@linux102 mail]# mail -u lee
Mail version 8.1 6/6/93. Type ? for help.
"/var/mail/lee": 2 messages 1 new 2 unread
U 1 MAILER-DAEMON@163.co Mon Sep 5 05:56 66/2207 "Warning: could not se"
>N 2 dongliang@linux102.e Tue Sep 13 08:11 11/482
& 2
Message 2:
From dongliang@linux102.example.com Tue Sep 13 08:11:03 2011
Date: Tue, 13 Sep 2011 08:08:50 -0700
From: linux02 <dongliang@linux102.example.com>
it is test1 //郵件正文
&
看到沒,在local-host-names中添加上主機的兩個域名,則此兩個域名就都可以收發信了。如果我當時只加了linux102,而沒有添加linux103,則會出現如下錯誤:
mail from:dongliang@linux102.example.com
250 2.1.0 dongliang@linux102.example.com... Sender ok
rcpt to:lee@linux103.example.com
550 5.7.1 lee@linux103.example.com... Relaying denied. IP name possibly forged [192.168.1.102]
不過我發現,預設的主機名不受此影響,就是說預設的主機名稱,無論是否在此文件中,都是可以收發信的。
(3) 設定郵件服務器的訪問權限
前面我們提到access可以用來設置訪問控制,拒絕或允許的客戶端給我寄信或者通過我的MTA來發信。
語法:
規定的范圍 規定可以在sendmail上面的動作
IP/不完整IP/主機名稱/E-mail RELAY/DISCARD/REJECT
在『規定范圍』與『規定可以在 sendmail 上面的動作』兩項目之間最好以 <tab> 按鍵來隔開!『規定的范圍』還可以設定『來源』與『目的』喔!例如:
from:dongliang@linux102.example.com REJECT
to:dongliang@linux102.example.com REJECT
from:代表的是“來源”的意思,表示來自某郵箱的信如何處理。比如我上面舉的例子:from:dongliang@linux102.example.com REJECT 意思就是dongliang這個賬號的郵箱無法對外發信,但卻可以收到別人給他寄的信。(來自dongliang這個賬號的信是被拒絕的)
to:代表的是“目的”的意思,表示發送到某個郵箱的信如何處理。比如前面的例子:to:dongliang@linux102.example.com REJECT 意思是dongliang這個賬號可以對外發信,但卻無法收到其他郵箱發給其的信(發送到dongliang這個賬號的信都被拒絕)
如果既不寫from也不寫to的話,那么其收信發信都會收其控制
RELAY:允許該來源主機所傳送過來的郵件可以被接受,然后再進行 Relay的 動作。
REJECT:若來源主機的主機名稱或 IP 在 REJECT 的情況下,則我們 Mail Server 將不會接受對方的郵件內容( body 部分),『並且會回傳一個錯誤或警告訊息給原發信端』
DISCARD:與 REJECT 相似,亦即關閉規定范圍內的計算機主機的 RELAY 功能,不過, Sendmail 會直接將該信件『丟棄』而不會『退回』!(我試驗發現設置為DISCARD的時候,顯示的是郵件已經發送成功,但對方並沒有收到信,即是沒有報警信息)
基本流程:當信件想要使用我們的郵件主機來進行寄信或者是 Relay 的動作時,首先會傳送 mail header 到我們的 mail server 上面,這也就是一些郵件的基本數據(如認證信息、來源IP、目標的 MTA 等等),但並不包含郵件的內容(例如信件本體、附件夾帶等等的內容)。也就是說,一封郵件基本上可以分為兩大部分,分別是 Header 與 Body ,Header 僅記錄郵件基本信息,Body 才是真正的信件內容。當郵件想要進入 MTA 時,會先發送 Header 給 MTA ,MTA 判斷這個 Header 的信息是可接受的之后,才后繼續接受來源主機的郵件 Body 內容!如果這些基本訊息傳送過來的主機信息包括在 /etc/mail/access.db 里面所記錄到的主機(或IP)范圍時,就可以指定上面這些動作
舉例:
[root@test root]# vi /etc/mail/access
# 預設情況下有啟用的 IP
localhost.localdomain RELAY
localhost RELAY
127.0.0.1 RELAY
# 想要開放權限的 IP 與網域
192.168.0 RELAY //開放某個網段可以收發郵件
140.116.44.125 RELAY //運行某個IP可以收發郵件
# 擋掉的 IP、主機名稱與 E-mail
qq.com DISCARD //阻止某個域名的信件
192.168.1.100 DISCARD //阻止某個ip
dl@linux102.example.com REJECT //阻止一個具體的賬號
# 儲存后離開
[root@station47 mail]# make -C /etc/mail //將access數據轉換成數據庫文件
總結:
當 MTA 收到一封郵件,並且該郵件的『信件收件者』為 MTA 本身的用戶賬號時,此時將會以本機端 ( local ) 的收件規則來進行收件,如果 /etc/mail/access.db 沒有針對來源 IP 或者 host 或者 e-mail 抵擋時,則該封信會被我們的 MTA 收下來,並且儲存到 /var/spool/mail 里面。例如,當我的 linux102.example.com 收到一封給 dl@linux102.example.com 的郵件,並且 /etc/mail/access.db 沒有針對來源抵擋 ( 在不考慮 procmail 的情況下 ) ,那么我的 linux102.example.com 這部主機,會立刻將該封郵件存放到 /var/spool/mail/dl 里面去,而不必經由『認證』或者抵擋的機制。請注意,在這個情況中, Sendmail 並不會去檢查送件者是否來自於信任網域( 只要 /etc/mail/access 沒有擋到的主機或IP或其它的 e-mail 信息 )!
如果這封郵件的『信件收件者』並沒有 MTA 本身的用戶賬號時,那么 MTA 會以 SMTP 這個外送規則來傳信,此時 MTA 會開始去檢查 /etc/mail/access.db 這個數據庫里面,任何有關於送件者的 IP、E-mail 以及相關的動作等,如果該封郵件有相關的數據在 /etc/mail/access.db 里面時 ( 不論是 RELAY, REJECT 或是 DISCARD ) 那么該封郵件就會依照 /etc/mail/access.db 里面指定的行為進行郵件的動作(可能是 RELAY 或 DISCARD 等等)!
如果該封郵件經過上面兩道手續后,仍然找不到任何有關的動作訊息,那么這封郵件將會退回給原發信者!
前面那么說估不好理解,其實上面這段話可以這么理解,如果MUA給MTA發信其信的地址不是MTA本身的賬號時,其會檢查access中的所有規則,嚴格按照規則來辦事,也就是說默認對外發信是阻止的;如果其地址是本身的賬戶,那么也會檢查access中的設置,但若沒有專門的設置,則默認是允許的。
這就是我們最開始講“relay和認證機制”中說的,當然上面說的這些都是在沒有受到SMTP郵件認證時候的動作。
(4)群發郵件(別名)
其實我這里是想說是其賬號起個別名,也就是假名的意思,比如發送給admin這個賬號的郵件根據別名其實都發送給了dl這個賬號了。通過這個別名的機制可以實現群發功能
[root@linux102 mail]# vi /etc/aliases
# trap decode to catch security attacks
decode: root
admin: dongliang,lee,dl //給dongliang,lee,dl三個用戶起個別名admin,記得用逗號進行隔開哦
# Person who should get root's mail
#root: marc
[root@linux102 mail]# newaliases //讓更改后的aliases文件生效,將數據變成數據庫組,有點類似access
/etc/aliases: 77 aliases, longest 16 bytes, 786 bytes total
[root@linux102 mail]# service sendmail reload //重讀配置文件
reloading sendmail: [ OK ]
reloading sm-client: [ OK ]
不過這樣也有一個問題,雖然這樣可以實現群發功能,但如果需要群發的賬號很多,我總不能把所有的賬號都添加在/etc/aliases中吧,那樣豈不是亂套了。所以我們可以想別的辦法來對付這種需要群發賬號很多的情況:
[root@linux102 mail]# vi /etc/aliases
# trap decode to catch security attacks
decode: root
admin: :include:/etc/mail/users //users文件中包含的用戶名都可以接收到發送給admin的郵件
# Person who should get root's mail
#root: marc
[root@linux102 mail]# vi users //給users文件中添加所需群發的用戶名
dongliang
lee
dl
[root@linux102 mail]# newaliases //讓更改后的aliases文件生效,將數據變成數據庫組
/etc/aliases: 77 aliases, longest 24 bytes, 794 bytes total
[root@linux102 mail]# service sendmail reload //重讀配置文件
reloading sendmail: [ OK ]
reloading sm-client: [ OK ]
下來我來查看下是否可以繼續群發:
其實這個功能也可以用來做備份之用,比如lee賬號是我的備份賬號,凡是給dl賬號發信的都給lee也發一封,則可以這樣去做
[root@linux102 mail]# vi /etc/aliases
# trap decode to catch security attacks
decode: root
dl: dl,lee //凡是給dl發信的都給lee用戶也備份一份,當然也可以傳送給外部的MTA,比如寫成dl,dl@qq.com,那么就可以實現在給dl發信的同時也給dl@qq.com發信。
# Person who should get root's mail
#root: marc
[root@linux102 mail]# newaliases //讓更改后的aliases文件生效,將數據變成數據庫組
/etc/aliases: 77 aliases, longest 24 bytes, 794 bytes total
[root@linux102 mail]# service sendmail reload //重讀配置文件
reloading sendmail: [ OK ]
reloading sm-client: [ OK ]
關於aliases在多說點東東當我們查看/etc/aliases時,里面的那些文件都表示什么意思呢?
[root@test root]# vi /etc/mail/aliases
# 基礎 sendmail 資料!由於 sendmail 預設使用 mailer-daemon 與
# postmaster 做為數據發送者,或者是信件被退回時的賬號!但是我
# 們的系統並沒有這兩個賬號,因此,必需要使用 aliases 的功能!
# 如果是使用 sendmail ,那么底下這兩行『務必存在』才行!
mailer-daemon: postmaster
postmaster: root
# pseudo accounts. 也就是系統的賬號,這些賬號是給系統來使用的,
# 基本上,這些賬號並無法登入主機,但是偏偏某些程序進行時,產生
# 的錯誤訊息可能會寄給該系統賬號,但該賬號無法登入,所以會讓系統
# 無形之中遺失許多的信息,所以啰,這些賬號也需要來做 aliases
# 並且將收件者交給系統一定會有的人物! root 是耶!通常這些賬號
# 常見的有 bin, daemon, adm, lp, sync, shutdown, halt, mail, news
# uucp, operator, games, gopher, ftp, nobody, named, xfs, system,
# 等等等等!
bin: root
daemon: root
adm: root
lp: root
sync: root
shutdown: root
....(略).....
# trap decode to catch security attacks 有些攻擊者在攻擊你的主機時,
# 該相關的信息會寄給你的 decode 這個賬號,將他轉成 root 吧!
decode: root
# 這是 root 的收件信者! 由於預設狀況中, root 是不能在主機外部
# 的任何一部計算機收信的!如果您想要讓你的一般賬號可以接收 root 的
# 信件,以實時掌握主機信息,那么底下的 # 將他打開,后面接你的
# 賬號吧!
#root: your_account
(5) 偽裝郵箱域名
如果我想將我的dl@linux102.example.com偽裝成dl@163.com該如何做呢?
[root@station47 mail]# vi sendmail.mc //將配置文件中的如下幾行改為此設置,這里我們是將偽造成163的郵箱了
EXPOSED_USER(`root')dnl
FEATURE(masquerade_envelope)dnl
MASQUERADE_AS(`163.com')dnl //要偽裝成的域名
FEATURE(masquerade_entire_domain)dnl
[root@station47 mail]# make -C /etc/mail
make: Entering directory `/etc/mail'
make: Leaving directory `/etc/mail'
[root@station47 mail]# service sendmail reload
reloading sendmail: [ OK ]
reloading sm-client: [ OK ]
[root@station47 mail]# su – dl //超級用戶無法偽裝,所以我進入一個普通用戶
[dl@linux102 ~]$ mail dongliang //給dongliang這個用戶發信
Subject: test10
test10
.
Cc:
[root@linux102 mail]# mail -u dongliang //查看是否收到信
Mail version 8.1 6/6/93. Type ? for help.
"/var/mail/dongliang": 1 message 1 new
>N 1 dl@163.com Thu Sep 15 09:02 16/602 "test10" //域名已經變成163.com了
&
(6) 虛擬用戶 virtusertable
這是一種虛擬用戶方式,這種方式運行一台機器擁有多個虛擬域,這個在web服務器中是常常遇到的,就好比我們web服務器上的虛擬用戶一樣,這是通過FEATURE(virtusertable)功能實現的,而虛擬主機的文件缺省是/etc/mail/virtusertable.db,它用/etc/mail/virtusertable文件生成,這個文件的形式類似於aliases文件,即左地址右地址,中間用Tab鍵分開。例如:
someone@tonk.com dl //將給someone@tonk.com的用戶發給本地dl用戶
dl@tonk.com error:No such user //返回一條出錯信息
@tonk.com dl@linux102.example.com # 所有的郵件都給dl
@tonk.com %1@linux102.example.com # 給域名不同的同一用戶
用法大概就是上面這樣的例子,但要注意幾點:第一,你的DNS記錄中, 應該有tonk.com這個記錄,以便首先把郵件傳遞到正確的主機;第二,local-host-names應該包含tonk.com這個名字。因為這些數據映射左邊的所有主機關鍵字都必須 在/etc/mail/local-host-names中存在;否則,sendmail將嘗試在Internet上尋找該主機並把郵件投遞到那里。也就是說比如網上有tonk.com這個域名,如果不在/local-host-names中添加的話,那么郵件會投遞到tonk.com域名中的賬戶,而不會投遞給我上面設置的用戶。
我來舉例說明:
設置virtusertable
[root@linux102 mail]# vi local-host-names
dl@tonk.com dongliang //發送給dl@tonk.com的用戶發送給dongliang賬號
lee@tonk.com error:you are wrong //給lee@tonk.com發信的時候報錯誤信息
@pp.com dl@linux102.example.com //給@qq.com發的信都發到dl@linux102.example.com郵箱下
@tonk.com 1%@linux102.example.com //比如發送給test@tonk.com的信發送給了test@linux102.examplecom
[root@linux102 mail]# vi local-host-names //將域名添加進去
# local-host-names - include all aliases for your machine here
linux102.example.com //添加前面所述的幾個域名
tonk.com
qq.com
[root@linux102 mail]# make -C /etc/mail
make: Entering directory `/etc/mail'
make: Leaving directory `/etc/mail'
我們來發信試試我們的配置正確不
dl@tonk.com dongliang
@pp.com dl@linux102.example.com
aliases 文件同樣可以將本地用戶,映射到其它地址,那么和 virtusertable 的優先級如何?
★ 當接收者郵件地址的域部分在 /etc/mail/local-host-names 中又在/etc/mail/virtusertable中時,優先檢查virtusertable文件,應用該文件中的定義規則.
★ 要應用virtusertable規則,則接收者郵件地址的域部分必須在 /etc/mail/local-host-names 文件中存在
★ 若接收者郵件地址的域部分在 /etc/mail/local-host-names 文件中但不在 virtusertable 文件中有相應的定義,則先只應用 aliases 中的定義去擴展別名,一旦擴展出的別名接收者郵件的域部分在 virtusertable 中有定義行時則決不再別名下去,馬上運行virtusertable中的定義規則。
(7)genericstable
genericstable功能類似於給要發出的郵件起別名。例如,它可以把發給 trent@atrust.com的郵件映射到trent.hein@atrust.com。被重寫的是信頭而不是信封。郵件投遞不受影響,只有回復會受影響。用於映射主機名的機制有幾種,但只有genericstable可以在映射關鍵字中同時包括用戶名和主機名。下來我們來舉例說明
[root@station47 mail] # vi sendmail.mc //編輯配置文件
FEATURE(genericstable)dnl //我本機沒有自己添加
FEATURE(`always_add_domain')dnl
GENERICS_DOMAIN_FILE(`/etc/mail/local-host-names')dnl //本機沒有就自己添加
[root@station47 mail]# vi genericstable //新建此文件並編輯
lee@linux102.example.com dl@qq.com
test@linux102.example.com yangmei@tonk.com //將test@linux102.example.com地址發送的信偽裝成yangmei@tonk.com,這里的偽裝可以隨意去書寫,和前面偽裝域名中的MASQUERADE_AS(`163.com')dnl選項無關
[root@station47 mail]# vi local-host-names //給local-host-names中添加本機域名
# local-host-names - include all aliases for your machine here
linux102.example.com
tonk.com
qq.com
pp.com
重啟相關服務:
[root@linux102 mail]# make -C /etc/mail
make: Entering directory `/etc/mail'
make: Leaving directory `/etc/mail'
[root@linux102 mail]# service sendmail reload
Reloading sendmail: [ OK ]
reloading sm-client: [ OK ]
[root@linux102 mail]# su – lee //切換到lee用戶
[lee@linux102 ~]$ mail dongliang //給dongliang賬號發信
Subject: mail from lee
test
.
Cc:
從這個圖中,我們看出前面的設定都是ok的
(8) 其他一些設定
FEATURE(`blacklist_recipients')dnl允許使用黑名單 查禁收件人,然后用戶才可以用access文件 設定黑名單
FEATURE(`accept_unresolvable_domains')dnl 接受無法解析的域來的郵件
FEATURE(`promiscuous_relay')dnl 開啟轉發,默認是不允許的。
define(`confMAX_MESSAGE_SIZE',`15000000')dnl 限制最大發送字節define(confMAX_HOP,30) 設置轉發的地址不超過 30個
FEATURE (’relay_based_on_MX’ ) 自動接受DNS 中MX 記錄來源的郵件轉發
LOCAL_DOMAIN(`linux102.example.com')dnl 填寫的是自己的域名
基本上服務器端基本的就這些內容了吧,如果還有別的什么歡迎大家留言
- 客戶端的設定
(1)windows上的客戶端設定
前面都是服務器端的設定,但是我們在日常應用的時候,可不是直接登錄服務器的,而是通過客戶端來進行訪問的,比如foxmail或者outlook等。下來偶總結下客戶端的設定
在進行客戶端配置前,依舊需要在服務器上做些准備工作,那就是要安裝一個軟件:dovecot,其支持兩個協議:pop3和imap。
我們前面總結過,收信的時候是MUA經過POP協議來連接到MTA的mailbox,以讀取或者下載使用者當中的信件,也就是MUA經由MTA的110端口將信由MTA的mailbox中的信收到客戶端的MUA上,所以只要MUA和MTA都支持POP3協議即可,那么安裝了dovecot后,則服務器端也支持了pop了哦。
POP3協議適用於不能時時在線的郵件用戶。支持客戶在服務器上租用信箱,然后利用POP3協議向服務器請求下載,基於TCP/IP協議與客戶端/服務端模型,POP3的認證與郵件傳送都采用明文,使用110端口
IMAP:Internet Message Access Protocol/英特網信息存取協議
另一種從郵件服務器上獲取郵件的協議,與POP3相比,支持在下載郵件前先行下載郵件頭以預覽郵件的主題來源,基於TCP/IP,使用143端口 。
安裝好后,先開啟dovecot
然后客戶端的配置,我們以網易閃電郵為例子,看下如何設置:
是不是滿簡單的,只要將pop服務器和smtp服務器都填寫ok就好了
(2)linux服務器上客戶端設定
★ Mail功能
在linux上我們可以直接通過mail來收發郵件。直接輸入mail是查看root的郵件,mail –u 用戶名則是查看某個用戶的郵件。
Mail 會主動的捉取使用者在 /var/spool/mail 底下的郵件信箱 ( mailbox ),
如圖:
查看超級用戶的信,其字段的含義為:
★讀信:有看到『>』那個符號吧!那表示目前 mail 所在的郵件字段,
你可以直接輸入 Enter 即可看到該封信件的內容!另外,你也可以在『&』之后的光標位置輸入號碼,就可以看該封信件的內容了!(注:如果持續按 Enter ,則會自『 > 』符號所在的郵件逐次向后讀取每封信件內容!)
★顯示標題:如果要重新顯示每封信的標題,可以輸入 h 即可;
★回復郵件:如果要回復目前『 > 』符號所在的郵件,直接按下『R』即可進入剛剛前面介紹過的 mail 文字編輯畫面啰!你可以編輯信件后傳回去啰!
★刪除郵件:按下『 d## 』即可刪除郵件!例如我要刪除掉第 2 封郵件,可以輸入『d2』如果是要刪除第10-50封郵件,可以輸入『d10-50』來刪除喔!請記得,如果有刪除郵件的話,離開 mail box 時,要使用『q』才行!
★儲存郵件到檔案:如果要將郵件資料存下來,可以輸入『 s ## filename』,例如我要將上面第一封郵件存下來,可以輸入『 s 1 uuencode 』即可將第一封郵件內容存成 uuencode 這個檔案!
★離開 mail :要離開 mail 可以輸入 q 或者是 x ,請注意『輸入 x 可以在不更動 mail box 的情況下離開 mail 程序,不管你剛剛有沒有使用 d 刪除數據;使用 q 才會將刪除的數據移除,並且會將所有已讀過的信件內容轉存到你家目錄下的 mbox 檔案!』也就是說,如果你不想更動 mail box 那就使用 x 或 exit 離開,如果想要使剛剛移除的動作生效,就要使用 q 啦!不過,使用 q 之后,只有未讀的信件才會保留在 /var/spool/mail/里面,其它已讀的數據都會被存入 ~/mbox 當中!例如 /home/dl/mbox 為儲存dl已讀過的信件!
★請求協助:關於 mail 更詳細的用法可以輸入 help 就可以顯現目前的 mail 所有功能!
★ telnet的用法。
這個我們在一開始總結的時候提過,就不略過了
還有很多linux 的軟件 今天就先不總結了,這里不是重點
七.郵件主機的安全設定
1.sendmail本身的安全設定:
sendmail 本身已經提供相當多的安全項目建議,其中,大部分是在於『目錄與檔案權限』的設定要求上面!
(1)請確定 aliases 這個檔案的權限,僅能系統信任的 User 可以存取,通常其權限為 644 ;
(2)請確定 sendmail 讀取的數據庫 ( 多半在 /etc/mail 底下的 *.db 檔案 ),例如 mailertable, access, virtusertable 等等,僅能由系統信任的使用者讀取,其它一概不能讀取,通常權限為 640 ;
(3)系統的隊列目錄 ( /var/spool/mqueue ) 僅允許系統讀取,通常權限為 700 ;
(4)請確定 .forward 這個檔案的權限也不能設定成為任何人均可查閱的權限,否則您的 e-mail 數據可能會被竊取~
總之,一般用戶能夠不用 .forward 與 aliases 的功能,就不要使用!
2.smtp認證
記得前面總結的時候,已經提及了什么是relay與認證機制,這里簡單回顧下:
因為sendmail為了安全考慮,MTA服務器都不會對外完全開放relay功能,而是預設為僅針對主機開放relay功能(通過access),這樣的MTA是可以收到來自internet上面注明是本機賬戶的信件,所以MTA在收信上是OK的,但是在發信的時候,就比較麻煩了,凡是在access中沒設置的對外地址,則不能對外發信,而且如果通過access來設置一些規范內的ip的話,也很麻煩,萬一是adsl,那ip地址來回改變的豈不是很糟糕。所以就需要通過郵件認證機制來防范
目前SMTP認證機制主要是透過Cyrus SASL這個套件來達成郵件的認證動作的,其進行的步驟如下:
★ sendmail會去調取SASL的函數庫資料;
★ sendmail要去指定SASL的認證方式,一般而言,我們都會直接以 /etc/shadow 里面的賬號密碼來進行認證!至於針對 sendmail 的 SASL 認證方法則預設設定在 /usr/lib/sasl/Sendmail.conf 或 /usr/lib/sasl2/Sendmail.conf (根據 cyrus SASL 版本的不同而異!)
★ SASL 根據設定的方法去取用密碼與賬號內容,並且加以比對,響應給 sendmail 該次比對是否成功!
Cyrus SASL是Cyrus Simple Authentication and Security Layer的簡寫,它最大的功能是為應用程序提供了認證函數庫。應用程序可以通過函數庫所提供的功能定義認證方式,並讓SASL通過與郵件服務器主機的溝通從而提供認證的功能。
下面介紹使用Cyrus SASL包實現SMTP認證的具體方法。
(1) Cyrus-SASL認證包的安裝
默認情況下,Red Hat Enterprise Linux安裝程序會自動安裝Cyrus-SASL認證包。讀者可使用下面的命令檢查系統是否已經安裝了Cyrus-SASL認證包或查看已經安裝了何種版本。
rpm -qa | grep sasl
如果系統還沒有安裝Cyrus-SASL認證包,應將Red Hat Enterprise Linux 5第1、2和3張安裝光盤分別放入光驅,加載光驅后在光盤的Server目錄下找到與Cyrus-SASL認證包相關的RPM包文件,然后分別使用rpm -ivh命令安裝。例如,要安裝第1張光盤上的cyrus-sasl-2.1.22-4.i386.rpm包文件,可使用下面的命令。
rpm -ivh /mnt/Server/cyrus-sasl-2.1.22-4.i386.rpm
|
(2) Cyrus-SASL V2的密碼驗證機制
默認情況下,Cyrus-SASL V2版使用saslauthd這個守護進程進行密碼認證,而密碼認證的方法有多種,使用下面的命令可查看當前系統中的Cyrus-SASL V2所支持的密碼驗證機制。
saslauthd -v
當前可使用的密碼驗證方法有getwent、kerberos5、pam、rimap、shadow和ldap。為簡單起見,這里准備采用shadow驗證方法,也就是直接用/etc/shadow文件中的用戶賬戶及密碼進行驗證。因此,在配置文件/etc/sysconfig/saslauthd中,應修改當前系統所采用的密碼驗證機制為shadow,即:
由於Cyrus-SASL V2版默認使用saslauthd這個守護進程進行密碼認證,因此需要使用下面的命令來查看saslauthd進程是否已經運行。
ps aux | grep saslauthd
如果沒有發現saslauthd進程,則可用下面的命令啟動該進程並設置它開機自啟動
/etc/init.d/saslauthd start
chkconfig saslauthd on
然后,可用下面的命令測試saslauthd進程的認證功能
/usr/sbin/testsaslauthd –u dongliang –p ‘123456’
其中,dongliang為Linux系統中的用戶賬戶名,‘123456’為用戶lbt的密碼。該命令執行后,如果出現如圖所示的結果,則表示saslauthd的認證功能已起作用。
但這里我發現一個問題,當我用/etc/init.d/saslauthd start啟動saslauthd的時候,這個時候執行測試認證的命令(上面的命令)會發生如下圖所示錯誤,提示認證失敗。
但是如果我將saslauthd先關閉,用saslauthd –a shadow 進行手動啟動的話則測試驗證密碼是成功的,這個問題我還沒搞清楚,先列出來,回頭弄懂了再來補上。
(4)設置sendmail啟動smtp認證
在sendmail配置文件中找到以下的段落:
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl(第一段)
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl(第二段)
dnl #DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl(第三段)
第一段本身是注釋掉的,現在要把注釋去掉。TRUST_AUTH_MECH”的作用是使sendmail不管access文件中如何設置,都能 relay 那些通過EXTERNAL, LOGIN, PLAIN, CRAM-MD5或DIGEST-MD5等方式驗證的郵
件“(這就解決了前面一直考慮的access問題,特別是動態ip的情況)
第二段本身也是注釋掉的,現在也要把注釋去掉,confAUTH_MECHANISMS" 的作用是確定系統的認證方式。Outlook Express支持的認證方式是LOGIN。
第三段就不用多說了,沒有smtp認證也是要注釋掉的。
這里在補充一個地方:
dnl DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
將這段的內容改為:
DAEMON_OPTIONS(`Port=25, Name=MSA')dnl
意思是在smtp的默認端口(25)上進行認證,這樣就強制所有使用該郵件服務器進行郵件轉發的用戶在認證后才能發郵件了。
這樣做的原因是我在用outlook收發郵件的時候,盡管已經選擇了SMTP的認證方式,但收發信的時候,認不認證信都照樣照常收發,並不影響。這是因為smtp服務的默認端口是25,OutlookExpress上默認用的就是25,認不認證就無所謂了,都會通過,所以改為`Port=25, Name=MSA'則表示MSA收發郵件的時候,強制在默認25端口上進行身份認證。
都改好后,保存配置:
[root@linux102 ~]# make -C /etc/mail
make: Entering directory `/etc/mail'
make: Leaving directory `/etc/mail'
[root@linux102 ~]# service sendmail restart
Shutting down sm-client: [ OK ]
Shutting down sendmail: [ OK ]
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]
都ok后,可以通過telnet 本機IP 25來驗證sendmail服務是否已經正常啟動,若登陸成功,且在AUTH后面有LOGIN則說明sendmail服務已經成功啟動並且通過了SMTP認證,這樣就可以在你的MSA上比如outlook或者foxmail上設置需要通過認證。如此一來我們的MTA在對外發信的時候就不用在受限制與access了。豈不是很方便。
Ok,這就是如何繞過access通過SMTP認證的方式來收發郵件。
八.補充知識
1.信件隊列:當因為某些原因導致信件無法發送出去時,郵件將會放置到你的MTA主機的隊列中去,一般是在/var/spool/mqueue中,然后會每隔一段時間,sendmail會嘗試再次發送,一般sendmail 的預設是:
★如果該封信在五分鍾之內無法寄出,則系統會發出一封『警告信』給原發信者,告知該封郵件尚無法被寄送出去,不過,系統仍會持續的嘗試寄出該封郵件;
★如果在四小時候仍無法寄出,系統會再次的發出警告信給原發信者;
★如果持續進行五天都無法將信件送出,那么該封郵件就會退回給原發信者了!
在 Red Hat 的預設條件中,在 /var/spool/mqueue 當中的信件會每隔 60 分鍾由 Sendmail 嘗試重新傳送一次到目的地去!這個嘗試的時間是可以改變的!可以利用 sendmail 的指令或者直接修改 /etc/sysconfig/sendmail 里面的『QUEUE=時間』來修訂!例如,如果你想要讓 Sendmail 每隔 30 分鍾就幫你嘗試傳送 /var/spool/mqueue 里面的未寄出的信件時,那么就將 /etc/sysconfig/sendmail 這個檔案里面的『QUEUE=1h 』改成『QUEUE=30m 』即可!(選擇鳥哥私房菜)
下面介紹兩個命令:mailq 和mailstats
★ Mailq:是查詢發信隊列中的信的內容,如果有信沒有發出去正在隊列中的話,那么這個命令就可以查看。
Q-ID:表示此封郵件隊列的代表號 ( ID );
Size :這封信有多大容量 ( bytes )的意思;
Q-Time:這封信什么時候進入 /var/spool/mqueue 這個目錄的,並且說明無法立即傳送出去的原因 (例如上面的 Deferred );
Sender/Recipient:送信與收信者的電子郵件啰!
★mailstats:郵件在服務器中的狀態,記錄sendmail從開始到現在,收發郵件的總資料
M :只是一些郵件工作(Mailer)代號的標題!不過,重要的地方在第五行的 T ,那個是『Total 總和』的意思~
msgsfr:共有多少封信由這個郵件工作 ( mailer ) 所發出去的呢?以第四行最右邊看到的 local 為例,這表示由 local 發出的信件共有 249 封的意思~
bytes_from:表示的是信件數據容量,同樣以第四行 local 為例,他發出的 249 封信,共有 406K !
megsto:與 msgsfr 類似,只是 msgsfr 是寄出數據,而 megsto 則是『收到的信件封數』以上面的數據來看,則 local 收到的共有 223 封信!
bytes_to:收到信的容量
msgsrej:那個 rej 是 reject (拒絕) 的意思,這一列是信件被 deny 的次數;
msgsdis:那個 dis 是 discard 的意思,同樣是 deny ,只是經由 discard 的程序就是了!
Mailer :就是 sendmail 許多 mailers 當中的一個!那個 esmtp 主要用來對外,至於 local 則主要針對本機端的 mailbox 啰!