天天看點

郵件投遞過程

user--Email Server--Email server--user

Email Server——Email server

  SMTP (Simple Message Transfer Protocol)

user——Email Server

  POP3 (Post Office Protocol)

  IMAP (Internet Message Access Protocol)

   sendmail是最重要的郵件傳輸代理程式。了解電子郵件的工作模式

是非常重要的。一般情況下,我們把電子郵件程式分解成使用者代理

(MUA),傳輸代理(MTA)和投遞代理(MDA)。

MTA (Mail  Transport  Agents)

sendmail, postfix, qmail etc.

MDA (Mail  Delivery  Agents)

sendmail(mail), deliver, and procmail

MUA (Mail User Agents)

elm, pine, /bin/mail, mh, Eudora, and Pegasus

    使用者代理用來接受使用者輸入的指令,将使用者給出的信件封包傳送

至信件傳輸代理。而投遞代理則從信件傳輸代理取得信件傳送至最終

使用者的郵箱。顯然,最終使用者隻能看到使用者投遞代理。

   當使用者試圖發送一封電子郵件的時候,他并不能直接将信件發送到

對方的機器上,使用者代理必須試圖去尋找一個信件傳輸代理,把郵件

送出給它。

    信件傳輸代理得到了郵件後,首先将它儲存在自身的緩沖隊列中,

然後,根據郵件的目标位址,信件傳輸代理程式将找到應該對這個目

标位址負責的郵件傳輸代理伺服器,并且通過網絡将郵件傳送給它。

對方的伺服器接收到郵件之後,将其緩沖存儲在本地,直到電子郵件

的接收者察看自己的電子信箱。

    顯然,郵件傳輸是從伺服器到伺服器的,而且每個使用者必須擁有服

務器上存儲資訊的空間(稱為信箱)才能接受郵件。(發送郵件不受

這個限制)

   可以看到,一個郵件傳輸代理的主要工作是監視使用者代理的請求,

根據電子郵件的目标位址找出對應的郵件伺服器,将信件在伺服器之

間傳輸并且将接收到的郵件緩沖或者送出給最終投遞程式。

   有許多的程式可以作為信件傳輸代理,但是sendmail是其中最重要

的一個,事實證明它可以支援數千甚至更多的使用者,而且占用的系統

資源相當少。不過,sendmail的配置十分複雜,是以,也有人使用另外

的一些工具,如qmail。當然,基于Windows NT的Exchange Server和

NetScape Message Server也是這種産品的例子。

   無論什麼産品,它們必須支援同樣的規範,如信件傳輸的封包格式,

監聽的端口等等。一般來說,系統管理者并不需要了解信件傳輸的命

令标準,使用者代理會生成正确的指令。但是,了解其他一些資訊是重

要的。

   信件傳輸代理運作在25端口接受請求,當接受使用者的請求時,它不

需要了解使用者的真實身份,或者說不需要身份驗證。是以使用者不需要

送出使用者密碼就可以發出電子郵件,這意味着任何使用者都可以冒充成

另外一個使用者發出假的電子郵件,這是電子郵件設計的一個基礎,無

法消除。

   當sendmail程式得到一封待發送的郵件的時候,它需要根據目标地

址确定将信件投遞給那一個伺服器,這是通過DNS服務實作的。例如,

有一封郵件的目标位址是[email protected],那麼,sendmail首先确

定這個位址是使用者名(someone)+機器名(yahoo.com)的格式,然後,

通過查詢DNS來确定需要把信件投遞給某個伺服器。

   DNS資料中,與電子郵件相關的是MX記錄,這可以在查詢DNS時設定

查詢類型為mx來得到:

[[email protected] gmwu]$ nslookup

Default Server:  shg.hnit.edu.cn

Address:  210.45.144.18

> set q=mx

> yahoo.com

Server:  shg.hnit.edu.cn

Address:  210.45.144.18

yahoo.com preference = 9, mail exchanger = mx1.mail.yahoo.com

yahoo.com  preference = 1, mail exchanger = mx2.mail.yahoo.com

  顯然,在DNS中說明yahoo.com有兩個信件交換(MX)伺服器,于是,

sendmail試圖将郵件發送給兩者之一。preference 值小的MX伺服器的優

先級别比較高,是以伺服器将試圖連接配接mx2.mail.yahoo.com的25端口,

試圖将信件封包轉發給它。如果成功,你的smtp伺服器的任務就完成

了,在這以後的任務,将由mx2.mail.yahoo.com來完成。在一般的情

況下,mx交換器會自動把信件内容轉交給目标主機,不過,也存在這

樣的情況,目标主機(比如yahoo.com)可能并不存在,或者不執行smtp

服務,而是由其mx交換器來執行信件的管理,這時候,最終的信件将

儲存在mx機器上,直到使用者來察看它。  

  sendmail發送郵件時,如果經過設定的時間後仍然未能将信件投遞

到目的主機,它将傳回一個錯誤資訊并且休息一段時間,然後重新試

圖投遞,如果連續多次失敗,sendmail最終将放棄投遞并将錯誤資訊

投遞給postmaster使用者。在許多機器上,postmaster使用者是root使用者

的一個别名(參考下面關于别名的内容),你應該将它設定為郵件的

實際管理者的使用者名。

  上面說的基本就是sendmail的工作方式,然而仍然有一個很讓人迷

惑的東西,就是所謂"信封位址"。簡單地說,當sendmail向目标位址發

信的時候,它并不是直接用你的信件内容發送,相反,它依賴于你給

它的指令。例如,你可能會用mail程式向某個位址這樣發信:

  $mail [email protected]

  To:[email protected]

  Subject:test mail

  test

.

  那麼,當sendmail發信的時候,它是向[email protected]發

信而不是[email protected]。相應地,如果你想向兩個人發信,

例如你在outlook裡面寫上:"投遞給[email protected],抄送[email protected]",

那麼sendmail應該怎麼做?直接同時向兩個位址發信嗎?否,它試圖

構造兩個包裝(稱為信封),每個包裝上隻列出一個投遞位址,各投

遞一次。雖然郵件正文的頭部仍然包含兩個位址,但是sendmail不會

看它。

Email服務的工作流程小結:

-MTA接受MUA送來的的郵件資訊,生成信封和信體;

-檢查目的地是否為本地,如果是則立即交給MDA投遞;

-SMTP隻支援ASCII方式傳輸,對于二進制的資料要借助于軟體編、

  解碼(如UNIX的uuencode、uudecode),sendmail不會自動進行

  編、解碼;

-利用SMTP,進行路由,達到DNS中MX記錄所指定的目的地;

-在目的地進行MDA的投遞;

-使用者使用MUA閱讀郵件;

繼續閱讀