Sun Java System Messaging Server MTA 可透過 LMTP (本機郵件傳輸協定,定義於 RFC 2033 中),在使用多層級郵件傳送伺服器部署情況下,將郵件遞送至郵件儲存。在這些情況下,您使用內送轉送器和後端郵件儲存時,轉送器將負責位址延伸和遞送方法,如自動回覆和轉寄以及郵遞清單的延伸。以前,遞送至後端儲存的作業使用 SMTP,這需要後端系統在 LDAP 目錄中再次查詢收件者位址,從而使用 MTA 的整個機制。為了提昇速度和效率,MTA 可以使用 LMTP (而不是 SMTP) 將郵件遞送至後端儲存。Sun Java System Messaging Server 的 LMTP 伺服器非一般用途 LMTP 伺服器,而是用做轉送器和後端郵件儲存之間的專用協定。為簡化論述,將使用涉及兩層部署的範例。
依設計,LMTP 適合在多層部署中使用。不可能將 LMTP 與單一系統部署配合使用。此外,已實作的 Messaging Server LMTP 服務不適於與其他 LMTP 伺服器或其他 LMTP 用戶端配合使用。
本章包含以下各節:
MTA 的 LMTP 伺服器能夠更有效率地將郵件傳送至後端郵件儲存,因為該伺服器:
減少了後端儲存的負載。
因為轉送器可水平延伸,但後端儲存不可以,因此將儘可能多的處理推向轉送器是很好的方法。
減少了 LDAP 伺服器的負載。
LDAP 基礎架構通常是大型郵件傳送部署的限制因素。
減少了郵件佇列的數目。
對於郵件傳送部署的管理員來說,在轉送器和後端儲存上均存在佇列將使查找遺失的郵件更困難。
圖 16–1 以圖形說明不使用 LMTP 的兩層式部署方案中如何郵件處理。
若未使用 LMTP,則在轉送器位於儲存系統前端的兩層式部署中,對內寄郵件的處理將從 SMTP 連接埠上的連線 (由轉送機器上的派送程式選取,並傳送至 tcp_smtp_server 程序) 開始。此程序對內送郵件執行一系列處理,包括:
在目錄中查詢使用者
決定使用者是否在該電子郵件部署托管的網域中
決定使用者是否為網域中的有效使用者
將訊息封位址重寫為 @mailhost:user@domain
將郵件排入佇列以遞送至郵件主機
接著,smtp_client 程序從佇列中選取電子郵件,並將其傳送至郵件主機。在郵件主機上,將發生某些非常類似的處理。派送程式將選取 SMTP 連接埠上的連線並將其傳送至 tcp_smtp_server 程序。此程序對郵件執行一系列處理,包括:
在目錄中查詢使用者
決定使用者是否在該電子郵件部署托管的網域中
決定使用者是否為網域中的有效使用者
重寫訊息封位址,以將郵件導向至 ims_ms 通道
將郵件排入佇列以遞送至儲存
然後,ims_ms 程序將選取郵件並嘗試將其傳送至儲存。在這種情況下,排入佇列處理會執行兩次,並且每個 MTA 均執行一次 LDAP 查詢。
16.3 使用 LMTP 的兩層部署中的郵件傳送處理以圖形形式展示了使用 LMTP 的兩層部署方案中郵件處理的以下說明。
在 LMTP 就位的情況下,派送程式將選取轉送器 SMTP 連接埠上的連線並將其傳送至 tcp_smtp_server 程序。此程序對內送郵件執行一系列處理,包括:
在目錄中查詢使用者
決定使用者是否在該電子郵件部署托管的網域中
決定使用者是否為網域中的有效使用者
決定託管使用者電子信箱的後端郵件儲存機器
將郵件排入佇列以遞送至郵件主機
在儲存器上,派送程式將接收與 LMTP 連接埠的連線,並且其被傳送至 lmtp_server 程序。然後,LMTP 伺服器將郵件插入使用者的電子信箱或 UNIX 的本機電子信箱。如果郵件遞送成功,將從轉送器上被移出佇列。如果失敗,郵件將保留在轉送器上。請注意,郵件儲存上的 LMTP 程序不使用任何 MTA 工具處理位址或郵件。
大多數情況下,MTA 本身可以不在後端伺服器上。唯一需要的 MTA 元件是:
派送程式
libimta
LMTP 伺服器
imta.cnf 檔案
mappings 檔案
imta.tailor 檔案
當派送程式需要 MTA 配置檔案時,這些檔案可以非常短。派送程式必須在後端伺服器上執行,以便可以啟動在其下執行的 LMTP 伺服器。因為派送程式和 LMTP 伺服器使用 libimta 的各種功能,所以也需要顯示在後端伺服器上。
LMTP 伺服器不執行任何一般的 MTA 排入佇列或移出佇列功能、標頭處理或位址轉換。轉送器系統執行郵件和位址內容的所有處理,然後將這些郵件和位址顯示給 LMTP 伺服器,郵件格式應與要遞送至郵件儲存的郵件格式相同,並且遞送位址已是儲存所需的格式。通常在郵件傳送至儲存時可獲得的附加收件者資訊 (如使用者的配額) 將與收件者位址一起顯示為 LMTP 參數。如果遞送嘗試失敗,郵件將保留在轉送器系統的 LMTP 佇列中。
配置 LMTP 遞送機制時,必須對轉送機器與後端儲存進行配置。在轉送器上,必須變更 DELIVERY_OPTIONS MTA 選項 (在 option.dat 中),以便將要遞送至儲存區的郵件傳送至 LMTP 通道。必須使用派送程式 (但不需要工作控制器) 配置後端儲存。必須配置派送程式以執行 LMTP 伺服器。
在典型的多層部署中,使用者佈建在不同的後端郵件儲存機器上。這些後端機器中的一台或多台可能並未開啟 LMTP,因此前端轉送需要瞭解哪些儲存機器可識別 LMTP。您可以使用一般資料庫功能明確命名那些配置為接受 LMTP 遞送的郵件儲存,以實現此目的。
若要配置內送 MTA 轉送以使用 LMTP,請執行以下作業:
修改 imta.cnf 檔案並變更 LMTP 重寫規則,以讀取:
! lmtp .lmtp $E$F$U%$H.lmtp@lmtpcs-daemon .lmtp $B$F$U%$H@$H@lmtpcs-daemon ! ! lmtp native .lmtpn $E$F$U%$H.lmtpn@lmtpcn-daemon .lmtpn $B$F$U%$H@$H@lmtpcn-daemon ! |
將電子信箱 DELIVERY_OPTIONS 設為:
#*mailbox=@$X.LMTP:$M%$\$2I$_+$2S@lmtpcs-daemon |
將本機 DELIVERY_OPTIONS 陳述式設為:
#*native=@$X.LMTPN:$M+$2S@native-daemon |
將通道關鍵字 multigate connectcanonical 增加到每個 tcp_lmtp* 通道區塊中。
將下列通道關鍵字增加至 tcp_lmtpcs 通道:
fileinto @$4O:$U+$S@$D |
請注意,上述關鍵字的 O 為大寫字母 O,不是零。
內送 MTA 轉送配置設定應如下所示:
DELIVERY_OPTIONS 的 option.dat 項目應如下所示:
!------------------------------------------ ! Modified DELIVERY_OPTIONS to activate LMTP ! delivery from a frontend to the backend store !-------------------------------------------- ! DELIVERY_OPTIONS=\ #*mailbox=@$X.LMTP:$M%$\$2I$_+$2S@lmtpcs-daemon,\ #&members=*,\ #*native=@$X.LMTPN:$M+$2S@native-daemon,\ #*unix=@$X.LMTPN:$M,\ #*file=@$X.LMTPN:+$F,\ #&@members_offline=*,\ #/hold=@hold-daemon:$A,\ #program=$M%$P@pipe-daemon,\ #forward=**,\ #*^!autoreply=$M+$D@bitbucket ! |
變更修改的 imta.cnf 重寫規則之後,應如下所示:
! lmtp .lmtp $E$F$U%$H.lmtp@lmtpcs-daemon .lmtp $B$F$U%$H@$H@lmtpcs-daemon ! ! lmtp native .lmtpn $E$F$U%$H.lmtpn@lmtpcn-daemon .lmtpn $B$F$U%$H@$H@lmtpcn-daemon ! |
變更後的通道區塊應如下所示:
! ! tcp_lmtpcs (LMTP client - store) tcp_lmtpcs defragment lmtp multigate connectcanonical \ fileinto @$4O:$U+$S@$D port 225 nodns single_sys \ subdirs 20 maxjobs 7 pool SMTP_POOL dequeue_removeroute lmtpcs-daemon ! ! tcp_lmtpcn (LMTP client - native) tcp_lmtpcn defragment lmtp multigate connectcanonical port 226 \ nodns single_sys subdirs 20 maxjobs 7 pool SMTP_POOL \ dequeue_removeroute lmtpcn-daemon |
如果後端儲存經由 LMTP 接收郵件,則只需要最小 MTA。其需要派送程序、工作控制器和簡單的 MTA 配置。尤其是,它們需要 dispatcher.cnf、job_controller.cnf 和 mappings 檔案,這些檔案將構成 MTA 配置唯一的重要部分。
dispatcher.cnf 檔案必須包含以下內容:
! VERSION=1.1 ! IMTA default dispatcher configuration file ! ! Global defaults ! MIN_PROCS=1 MAX_PROCS=10 MIN_CONNS=30 MAX_CONNS=50 MAX_SHUTDOWN=2 MAX_LIFE_TIME=86400 MAX_LIFE_CONNS=10000 MAX_IDLE_TIME=600 HISTORICAL_TIME=0 ! ! rfc 2033 LMTP server - store ! [SERVICE=LMTPSS] PORT=225 IMAGE=IMTA_BIN:tcp_lmtp_server LOGFILE=IMTA_LOG:tcp_lmtpss_server.log PARAMETER=CHANNEL=tcp_lmtpss STACKSIZE=2048000 ! Uncomment the following line and set INTERFACE_ADDRESS to an ! appropriate host IP (dotted quad) if the dispatcher needs to ! listen on a specific interface (e.g. in a HA environment). ! INTERFACE_ADDRESS=! ! rfc 2033 LMTP server - native ! [SERVICE=LMTPSN] PORT=226 IMAGE=IMTA_BIN:tcp_lmtpn_server LOGFILE=IMTA_LOG:tcp_lmtpsn_server.log PARAMETER=CHANNEL=tcp_lmtpsn STACKSIZE=2048000 |
請注意,依預設,對 dispatcher.cnf 檔案中的 LMTP 服務均已進行註釋。您必須取消註釋,才能使 LMTP 運作。
您也可以設定 MAX_CONNS、MAX_PROCS、MAX_LIFE_CONNS 與 MAX_LIFE_TIME 的一般派送程式選項,但設定時必須符合硬體要求。
PORT_ACCESS 對映是很重要的。後端伺服器的 LMTP 實作將用做 Sun Java System Messaging Server 轉送器和後端儲存之間的專用協定。必須使用 PORT_ACCESS 對映以確保僅此類轉送器可以連線至這些服務。您的對映檔案應類似於:
PORT_ACCESS TCP|*|225|192.18.74.206|* $Y TCP|*|226|192.18.74.206|* $Y TCP|*|225|192.18.74.129|* $Y TCP|*|226|192.18.74.129|* $Y TCP|*|*|*|* $N500$ Do$ not$ connect$ to$ this$ machine |
以上的 IP 位址是 LMTP 伺服器和用戶端 IP 位址。應使用網路上連線至後端儲存的轉送器 IP 位址替代此處 PORT_ACCESS 對映表中指定的範例 IP 位址。
必須有一個 imta.cnf 檔案,但它僅用於使配置完整。最小的 imta.cnf 檔案應包含以下通道定義:
! ! IMTA configuration file ! ! tcp_lmtpss (LMTP server - store) tcp_lmtpss lmtp tcp_lmtpss-daemon ! ! tcp_lmtpsn (LMTP server - native) tcp_lmtpsn lmtp tcp_lmtpsn-daemon
請注意,依預設,LMTP 通道定義已被註釋。如果您要 LMTP 運作,必須取消註釋。
您可以使用安裝時建立的預設 job_controller.cnf 檔案。此檔案不需要修改。
在某些情況下,您可能希望後端儲存具有 MTA 的完整功能,但仍具有使用 LMTP 的載入保存功能。例如,您可能需要後端儲存上的程式遞送。這種情況下,應按以上使用 LMTP 配置內送 MTA 轉送中的說明配置轉送器。
從後端儲存郵件傳送系統的配置到使用 LMTP 直接傳送至儲存的配置的唯一變更是,需要將以下行加入 dispatcher.cnf 檔案的結尾:
! rfc 2033 LMTP server - store ![SERVICE=LMTPSS] PORT=225 IMAGE=IMTA_BIN:tcp_lmtp_server LOGFILE=IMTA_LOG:tcp_lmtpss_server.log PARAMETER=CHANNEL=tcp_lmtpss STACKSIZE=2048000 ! Uncomment the following line and set INTERFACE_ADDRESS to an ! appropriate host IP (dotted quad) if the dispatcher needs to ! listen on a specific interface (e.g. in a HA environment). !INTERFACE_ADDRESS= ! ! rfc 2033 LMTP server - native ! [SERVICE=LMTPSN] PORT=226 IMAGE=IMTA_BIN:tcp_lmtpn_server LOGFILE=IMTA_LOG:tcp_lmtpsn_server.log PARAMETER=CHANNEL=tcp_lmtpsn STACKSIZE=2048000 ! Uncomment the following line and set INTERFACE_ADDRESS to an ! appropriate host IP (dotted quad) if the dispatcher needs to ! listen on a specific! interface (e.g. in a HA environment). !INTERFACE_ADDRESS= ! |
請注意,依預設,對 dispatcher.cnf 檔案中的 LMTP 服務均已進行註釋。您必須取消註釋,才能使 LMTP 運作。此外,這些 LMTP 連接埠號只是範例,您可以選擇任何號碼。
這與以上整個 dispatcher.cnf 檔案就何時為後端儲存僅配置 LMTP 所說明的內容相同。對映檔案還需要 PORT_ACCESS 對映,正如僅 LMTP 僅需要後端儲存一樣。
如果 LMTP 通道選項 MAILBOX_BUSY_FAST_RETRY 是設定為 1 (預設值),會處理回應 LMTP 郵件資料的 4.2.1 信箱忙碌錯誤,方法是在過一段任意的短暫間隔之後重試郵件;一般郵件 backoff 值不適用。將選項設定為 0 會停用此運作方式。
本節提供 LMTP 對話範例,並提供該對話中顯示的說明。轉送器上的 LMTP 用戶端使用標準 LMTP 協定與後端儲存上的 LMTP 伺服器對話。但是,該協定要以特定方式使用。例如:
---> LHLO <--- 250 OK |
對 LHLO 訊息沒有採取任何動作。回覆一律為 250 OK。
---> MAIL FROM: address size=messageSizeInBytes <--- 250 OK |
對創建者位址沒有進行任何檢查或轉換。size= 參數以位元組形式表示將要傳送的郵件的大小。此郵件大小與協定中顯示的郵件大小相同。郵件大小不必完全相同,但實際郵件大小不能超出此大小。LMTP 伺服器將按此大小分配記憶體緩衝區以接收郵件。
---> RCPT TO: uid+folder@domain xquota=size,number xdflg=xxx <--- 250 OK |
在收到收件者位址時不對其進行檢查,但是會建立一個收件者清單以便以後使用。請注意,對於主要網域中的 uids,位址的 @domain 部分可省略,+folder 部分是可選的。這與 MTA 中的郵件儲存通道所使用的位址格式相同。
xquota= 參數提供的是使用者郵件的配額,包含最大總計大小和最大郵件數目。MTA 提供在對使用者執行 LDAP 查詢以進行位址轉換時所擷取的資訊。此資訊用於使郵件儲存中的配額資訊與目錄保持同步。獲取配額資訊不會影響其他效能。
xdflg= 參數指定一個數字,該數字將被解譯為位元欄位。這些位元控制遞送郵件的方式。例如,值為 2 的位元 (如果設定) 將確保郵件的遞送,即使使用者超出配額。(請注意,xdflg 為內部參數,其中的位元會變更或增加,恕不另行通知。我們不支援使用此擴充的其他用戶端與我們的伺服器配合使用,也不支援將我們的用戶端與某些其他伺服器以及此參數配合使用。)
此互動作業可以重複多次,每個收件者一次。
--->DATA ---> <the message text> --->. |
然後,LMTP 用戶端將傳送整個郵件 (填滿點的),與 SMTP 的操作相同。郵件傳送完畢後,每行上將僅留有一個點 (.)。如果超出郵件大小,LMTP 伺服器將傳送:
<--- 500 message too big
並結束連線。
假設郵件已正確接收,則 LMTP 伺服器會將 RCPT TO: 行中指定的每個收件者之狀態傳回至 LMTP 用戶端。例如,如果郵件遞送成功,則回應是:
<--- 250 2.5.0 address OK
其中,address 與其在 RCPT TO: 行上的顯示完全相同。
對話既可以使用其他 MAIL FROM: 行重複,或使用以下互動作業結束:
---> quit <--- 221 OK |
表 16–1 顯示每位收件者的可能狀態代碼。在此三欄表格中,第一欄顯示短代碼,第二欄顯示等效的長代碼,第三欄顯示狀態文字。2.x.x 狀態代碼是成功代碼,4.x.x 代碼是可重試錯誤,5.x.x 代碼是不可重試錯誤。
表 16–1 收件者的 LMTP 狀態代碼
短代碼 |
長代碼 |
狀態文字 |
---|---|---|
250 |
2.5.0 |
確定 |
420 |
4.2.0 |
電子信箱被鎖定 |
422 |
4.2.2 |
超出配額 |
420 |
4.2.0 |
電子信箱格式錯誤 |
420 |
4.2.0 |
不支援的電子信箱 |
430 |
4.3.0 |
IMAP IOERROR |
522 |
5.2.2 |
超出永久配額 |
523 |
5.2.3 |
郵件太大 |
511 |
5.1.1 |
電子信箱不存在 |
560 |
5.6.0 |
郵件包含無效字符 |
560 |
5.6.0 |
郵件包含 nl |
560 |
5.6.0 |
郵件標頭錯誤 |
560 |
5.6.0 |
郵件無空行 |
否則,需要變更電子信箱、本機 (和 UNIX) 以及檔案的遞送選項。這些規則的目標是產生將導致郵件透過相應的 LMTP 通道被傳送至後端伺服器的位址。所產生的位址是以下格式的來源路由位址:
@sourceroute:localpart@domain |