跳轉到

郵件伺服器運作原理

郵件的傳送流程、MUA、MTA、MDA

約略瞭解了 DNS 與 mail server 之間的關係之後,在接下來我們要瞭解的是,那麼 mail 到底是如何傳送到目的郵件主機的呢?底下我們分成『寄信』與『收信』兩個主要的郵件主機使用方式來加以介紹囉!先說明一下關於『寄信』的部分好了,通常我們都是使用桌上型電腦來寄信的,舉個例子來說好了,如果你以 Netscape 或者 Kmail 或者 OutLook Express 來寄信的時候,那麼那封信到底是怎麼送出去的呢?可以參考一下底下的圖示來說明:

img
圖一、電子郵件以郵件主機寄送信件示意圖

先來說明一下什麼是 MUA, MTA 與 MDA 什麼的,再來說信件怎麼傳送的好了!

  • MUA ( Mail User Agent ):顧名思義, MUA 就是『郵件使用者代理人』,華特(what)?郵件還需要代理人,怎麼回事呢?喔!這是由於通常我們 Client 端的電腦都無法直接寄信的(不然幹嘛要郵件主機?),所以,需要透過 MUA 來幫我們傳達信件,不論是送信還是收信,Client 端的用戶都需要透過各個作業系統提供的 MUA 才能夠使用郵件系統。舉個例子來說, Windows 裡面的 OutLook Express, Netscape 裡面的 mail 功能與 KDE 裡面的 Kmail 都是 MUA 啦! MUA 主要的功能就是收受郵件主機的電子郵件,以及提供使用者瀏覽與編寫郵件的功能!

  • MTA ( Mail Transfer Agent ) : MUA 是用在 Client 端上面的軟體,那麼這個 MTA 就是用在郵件主機上面的軟體啦!他也是主要的郵件伺服器喔!這個 MTA 就是『郵件傳送代理人』的意思。也來顧名思義一下,既然是『傳送代理人』,那麼使用者寄出的信,與使用者要收信時,就是找他 ( MTA ) 就對啦!因為他要負責幫我們使用者傳送嘛!沒錯!基本上, MTA 的功能有這些:

  • 收受外部主機寄來的信件:既然是郵件主機,那麼『接收信件』想必就是主要的功能囉!呵呵,答對了!所以囉, MTA 最主要的功能就是收受外部來的信件,只要這個信件裡面有 MTA 內部的帳號時,那麼這封信就會被 MTA 收下來;

  • 幫使用者傳送 ( 寄出 ) 信件:既然可以收信,那麼自然也就可以發信囉!沒錯啦!只要使用者具有合法的使用 MTA 的權力,那麼該使用者就可以利用這部 MTA 將他把信傳送出去!不過需要注意的是, MTA 會將信件送給目的地的 MTA 而不是目的地的 MUA 喔!不要搞錯了!(註:曾經有個朋友跟我說,要我傳資料給他,而因為他要接收我的信件,所以他的電腦 "指的是 Windows 那個 Client 端的電腦" 得一直開著,真是不方便!聽到這句話時,害我嚇了一跳~這個觀念是不對的~因為使用者使用的是 MUA ,而信件『僅會送達到 MTA 主機上面』而已,收、發信件時,都需要透過 MTA 來幫忙處理的!所以,使用者在使用郵件編輯器"MUA"將資料編輯完畢之後,按下送出,並且成功的送到 MTA 之後,接下來的事情就是 MTA 的工作了,跟使用者的 Client 端這部電腦 "一點關係也沒有了" )
  • 讓使用者自己的信可以收回去:使用者可以將放置在郵件主機的信件收到自己的個人電腦上面收看。

大致的功能就是這些啦!通常我們所說的 Mail server ( 郵件伺服器 ) 就是指 MTA!

  • MDA ( Mail Delivery Agent ) : 『郵件遞送代理人』主要的功能就是將 MTA 所收受的信件,依照信件的流向 ( 送到哪裡去 ) 來將該信件放置到本機帳戶下的郵件檔案中 ( Mailbox )!或者是再經由 MTA 將這個信件送到下個 MTA 去!而如果信件的流向是到本機當中時,這個郵件代理人的功能可不止是將由 MTA 傳來的郵件放置到每個使用者的 Mailbox 而已,他還可以具有郵件分析 ( filtering ) 與其他相關的功能呢!這個功能很了不起喔!怎麼說呢?具兩個例子來說好了:

  • 如果你知道某個廣告信件的主旨都是固定的,例如『AV 情色 XXX』,你想將這種信件直接給他丟掉垃圾桶,可以嗎?當然可以囉!透過 MDA 郵件分析的功能,就可以將信件丟棄啦!

  • 如果有一天你要出差去,看樣子可能一個星期碰不到電子郵件了,但是你又不想讓一些朋友認為你在耍大牌都不回信的....這個時候你就可以利用 MDA 的功能,讓郵件主機分析到,當要送給你這個使用者的帳號的信出現時,就自動回覆一封回信,讓寄件者知道你在忙碌中....呵呵!這樣的功能是否很不錯呢?還不止這樣喔!其他的等一下後面再提吧!

  • Mailbox :『郵件信箱』說穿了,就是在你主機上面的一個目錄下的,某個人『專用』的信件收受檔案啦!舉個例子來說,系統管理員 root ,在預設的情況下,他會有個信箱,預設的檔案是在 /var/spool/mail/root 這個檔案就是了,一個帳號都會有一個自己的信箱喔!然後,當 MTA 收到 root 的信時,就會將該封信件存到 /var/spool/mail/root 這個檔案中囉!使用者可以透過程式來將這個檔案裡面的信件資料讀取回去喔!

好了,瞭解了 MUA, MTA 與 MDA 之後,再來說到那麼如何將信寄出去呢?可以分為底下幾個步驟:

  1. Step 1 使用者利用 MUA 寄信到 MTA 上面:通常我們使用 MUA ( 例如 Outlook express ) 寫信的時候,你總是要定義出幾個咚咚:

  2. 發信人與發信網站:對啦,總是要有這個資訊才行的嘛!這個發信網站就是等一下 Step 2 接收信件的那個 MTA 啦;

  3. 收信人與收信網站:是的,就是 account@e-mai.server 的樣式啦!那個 account 就是該 e-mail.server 裡面的帳號啦!

好了,你在圖一左上角的那部機器上面,也就是『本地端用戶使用電腦』利用 MUA 的功能 ( 例如 Outlook express 好了 ) 寫好了信之後,按下 MUA 的那個『傳送』的按鍵,MUA 就會依據你所定義的主機位址將信發送到 MTA 上面;
  5. Step 2 MTA 收到自己的信件,交由 MDA 發送到該帳號的 MailBox 當中:如果在 Step 1 所收到的信件中,那個 e-mail.server 就是 MTA 自己,此時 MTA 會將該信件交由 MDA 去處理,將信件放置在收進者的信箱中;

  1. Step 3 MTA 將信再轉送出去:如果由 Step 1 來的信件的收件人並不是 MTA 的內部帳號,那麼該封信將會被再轉送出去!由 Step 1 及 Step 3 的動作,我們也稱為 Relay (郵件轉遞) 的功能喔!

  2. Step 4 遠端 MTA 收受本地的 MTA 所發出的郵件:遠端的 MTA 會收受我們這部 MTA 的信件,並將該信件交給他的 MDA 來處理 ( Step 5 ) ,此時,信件會存放在遠端的 MTA 上面,等待使用者登錄讀取或者下載回去!

整個流程大致上就是這樣。這個時候,你由左上角的 MUA 將信件寄出之後,最後信件將會存放在右邊那部 MTA 主機裡面喔還沒有到達你的朋友的電腦 ( 就是右邊的 MUA 那部電腦 ) !這個時候,就要繼續談到收信的動作了!收信的動作有點像這樣:

img
圖二、用戶端收受郵件主機的電子郵件示意圖

遠端用戶使用的電腦直接連接到他的 MTA ,跟 MTA 要求察看自己的 mailbox 是否有信件,而 MTA 透過 MDA 去檢查之後,如果有信件的話,就會將他傳送回使用者的 MUA 中!同時,根據 MUA 的不同設定, MTA 會選擇將該 mailbox 清除掉,或者繼續保留!若繼續保留的話,那麼下次使用者再次的接收信件時,保留的信件會再次的被下載,因此,通常使用者 MUA 都是預設刪除掉 MTA 上面的 Mailbox 內容的!接下來我們得談一談,那麼寄信與收信使用的是什麼協定呢?


使用的協定

總是得瞭解一下使用的協定吶!我們在寄信的時候,亦即由 MUA 將信件發送到 MTA 的過程中,以及 MTA 將信轉遞到下一個 MTA 的功能,目前絕大部分的郵件主機都是使用 SMTP ( Simple Mail Transfer Protocol ) 這個協定,port number 為 25 啦!在寄信的時候,你的 MUA 會主動的連接 MTA 的 port 25 ,然後將信經由 MTA 的 smtp 協定 ( port 25 ) 而送出去!而郵件主機 MTA 在轉遞的時候,也是經由下一部 MTA 的 port 25 來將信送出去的!所以囉,不論你是使用什麼 MUA 或 MTA 郵件架設軟體,只要大家都支援 smtp ,那麼信件就可以順利的流傳囉!

收信呢?收信則是 MUA 經由 POP ( Post Office Protocol ) 協定來連接到 MTA 的使用者 Mailbox,以讀取或者下載使用者在 Mailbox 當中的信件。,目前常用的 POP 協定為 POP3 ( Post Office Protocol version 3 ),這個協定產生的 port number 為 110 ,所以,你的 MUA 經由 MTA 的 port 110 將信件由 MTA 的 mailbox 當中將信件收到本地端的 MUA 上面供你瀏覽!同樣的,只要 MTA 與 MUA 同時支援 POP3 這個協定,那麼信件就可以自由的收受了!此外,目前也很流行使用 IMAP 這個協定來收受信件。在 pop3 的收信協定中,一般來說,當 client 端收完了主機端的信件之後,則該信件會主動的被主機端所刪除!不過, IMAP 則可以避免這個問題! IMAP 具有讓使用者 ( client 用戶端 ) 自行定義信件放置的目錄功能,以及是否要儲存下載的信件之後,原信件是否保留在主機上面的功能!目前我們常見的 Web 介面的電子郵件使用,大部分就是以 imap 來達成的!

所以我們知道了!通常一部提供收發信件的 MTA ( 不考慮 Web 介面的郵件主機 ) 至少需要兩個協定,分別是 SMTP 與 POP3 !而且,只要你的 MUA 與 MTA 同時均支援 SMTP 與 POP3 ,那麼彼此就可以溝通囉!這也是為什麼你使用 Outlook express 寄出的信,但是你的朋友可以使用 Netscape 收下來的原因!總之,就是『網路協定』的溝通啦!


什麼是 Relay 與認證機制

圖一的寄信流程圖裡面的第三步驟 ( step 3 ) 中,我們知道, MTA 在分析收到的郵件之後,如果收件者不是本身主機的帳號,則會將該信件再傳送到下一個 MTA 上面,這個由 MTA 幫忙轉信的功能就稱為 Relay 啦。那麼在這個功能當中,您有沒有發現一件奇怪的事情啊!那就是:『是否任何人都可以使用我的 MTA 郵件主機伺服器來傳送他的郵件呢?』這個問題涉及到 Mail Server 的設定技巧了!如果設定不良的話,例如早期的 Sendmail 版本中,他就沒有針對使用者來進行管制,也就是說,任何人都可以使用這樣的一部郵件主機來達到信件傳送的目的!這種主機我們稱為『Open Relay』的電子郵件主機喔!這裡請仔細的思考一下,如果我的 MTA 對於寄信的人沒有一個限制的話,結果會如何呢?呵呵!沒有錯,結果就是任何人都可以使用你的 MTA 來發信了!那有什麼好可怕的?我們在前言的地方就已經稍微說過了,那個所謂的『廣告信、垃圾信件』的問題,而如果你的 MTA 沒有對寄信的人作限制的話,由於任何人都可以使用你的 MTA 來發信,你的 MTA 將會變的『很笨重!』什麼意思?那就是,你的 MTA 將會幫任何人寄信,如此一來,你的『網路頻寬將會被廣告信件所用光!』結果將導致你的 MTA 變成『Open Relay 主機黑名單的一份子~』!!!

為了避免這個問題,所以,目前所有新版的郵件主機伺服器架設軟體 ( Mail server packages ) 預設的情況之下,都不會對外完全的開放 Relay 的功能的!預設通常僅『針對主機 ( localhost ) 開放 Relay 的功能!』,不過,這樣的 MTA 是可以收受來自 Internet 上面的,註明收件者是我們 MTA 主機內部帳號的信件的,因此, MTA 在『收信』上面是沒有問題的!

但是關閉了 Relay 之後,雖然可以避免掉我們 MTA 主機被當成廣告信發送站,不過如此一來又造成了一些困擾!何解?因為通常我們僅針對主機,或者一些規範的 IP 或者是網段等信任的主機來開放他們的 Relay 的功能,所以在這個設定的範圍內的 Client 端電腦可以自由的收發信件,至於沒有規範到的 IP 來源的寄信信件,將完全的擋掉。然而萬一您使用的是 ADSL 計時制的呢?又或者您是常常在外面出差的大老闆,則你的 IP 將『不會固定』,完蛋啦~怎麼辦?既不能完全開放 Relay ,又沒有固定 IP ,無解了嗎?呵呵!還好,有所謂的 郵件認證機制 來幫我們解決這個困境啦!

所謂的『郵件認證機制』就是在剛剛我們圖一的寄信流程圖中,在 MTA 當中加入需要檢查發信者的『帳號與密碼』比對的功能,當 MTA 接到來自 Client 端的傳信需求時,會檢查來自 Client 端的認證比對(帳號密碼),如果帳號與密碼比對正確,則開始接受信件並幫忙轉信,如果比對不正確則將該 MTA 並不會接受該封信件,直接在 Client 端顯示『不接受您的信件』之類的訊息喔!目前有相當多種的郵件認證機制,這裡我們偏向於介紹目前廣為使用的 SMTP 郵件認證這個機制。

所謂的 SMTP 郵件認證機制,顧名思義,就是在 smtp 這個協定上面動手腳的一個機制囉!亦即是在寄信的時候,(由 MUA 到 MTA 那個 step 1 的步驟中 ),我們的 MTA 主機『一定要求檢驗 MUA 發信者的帳號與密碼!』這樣的功能!果真能做到這一點的話,那麼你的 MTA 就可以在經過認證之後,提供認證者的 Relay 功能,而不需要針對某些信任網域或 IP 來分別設定開放 Relay 的功能啦!因為經由『認證』的機制,你的 MTA 會去分析寄信者的相關資訊,通過後才會接受信件並幫他們寄信,否則就不接受信件!呵呵!沒錯!就是這樣!透過這樣的機制,您將不需要規範 Relay 的 IP 或網段,直接交給 SMTP 郵件認證來幫你管理你寄件者的 Relay 功能,從此以後,你的 Clients 就不會常常向你抱怨說 MTA 不穩定囉!

Reference