Sun Java System Messaging Server 6 2005Q4 管理指南

第 15 章 LMTP 遞送

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 用戶端配合使用。


本章包含以下各節:

LMTP 遞送功能

MTA 的 LMTP 伺服器能夠更有效率地將郵件傳送至後端郵件儲存,因為該伺服器:

不使用 LMTP 的兩層部署中的郵件傳送處理

圖 15–1 以圖形形式展示了不使用 LMTP 的兩層部署方案中郵件處理的以下說明。

圖 15–1 不使用 LMTP 的兩層部署

圖形顯示不使用 LMTP 的兩層部署方案中的郵件處理。

如果不使用 LMTP,則在轉送器位於儲存系統前端的兩層部署中,對內送郵件的處理將從 SMTP 連接埠上的連線 (由轉送器上的派送程式選取,並傳送至 tcp_smtp_server 程序) 開始。此程序對內送郵件執行一系列處理,包括:

然後,smtp_client 程序從佇列中選取電子郵件並將其傳送至郵件主機。在郵件主機上,將發生某些非常類似的處理。派送程式將選取 SMTP 連接埠上的連線並將其傳送至 tcp_smtp_server 程序。此程序對郵件執行一系列處理,包括:

然後,ims_ms 程序將選取郵件並嘗試將其傳送至儲存。在這種情況下,形成佇列處理會執行兩次,並且每個 MTA 均執行一次 LDAP 查詢。

使用 LMTP 的兩層部署中的郵件傳送處理

使用 LMTP 的兩層部署中的郵件傳送處理以圖形形式展示了使用 LMTP 的兩層部署方案中郵件處理的以下說明。

圖 15–2 帶有 LMTP 的兩層部署

圖形顯示使用 LMTP 的兩層部署方案中的郵件處理。

在 LMTP 就位的情況下,派送程式將選取轉送器 SMTP 連接埠上的連線並將其傳送至 tcp_smtp_server 程序。此程序對內送郵件執行一系列處理,包括:

在儲存器上,派送程式將接收與 LMTP 連接埠的連線,並且其被傳送至 lmtp_server 程序。然後,LMTP 伺服器將郵件插入使用者的電子信箱或 UNIX 的原生電子信箱。如果郵件遞送成功,將從轉送器上被移出佇列。如果失敗,郵件將保留在轉送器上。請注意,郵件儲存上的 LMTP 程序不使用任何 MTA 工具處理位址或郵件。

LMTP 簡介

大多數情況下,MTA 本身可以不在後端伺服器上。唯一需要的 MTA 元件是:

當派送程式需要 MTA 配置檔案時,這些檔案可以非常短。派送程式必須在後端伺服器上執行,以便可以啟動在其下執行的 LMTP 伺服器。因為派送程式和 LMTP 伺服器使用 libimta 的各種功能,所以也需要顯示在後端伺服器上。

LMTP 伺服器不執行任何一般的 MTA 形成佇列或移出佇列功能、標頭處理或位址轉換。轉送器系統執行郵件和位址內容的所有處理,然後將這些郵件和位址顯示給 LMTP 伺服器,郵件格式應與要遞送至郵件儲存的郵件格式相同,並且遞送位址已是儲存所需的格式。通常在郵件傳送至儲存時可獲得的附加收件者資訊 (如使用者的配額) 將與收件者位址一起顯示為 LMTP 參數。如果遞送嘗試失敗,郵件將保留在轉送器系統的 LMTP 佇列中。

配置 LMTP 傳送

配置 LMTP 傳送機制需要對轉送器和後端進行配置。在轉送器上,必須變更 DELIVERY_OPTIONS MTA 選項 (在 option.dat 中),以便將要傳送至儲存的郵件傳送至 LMTP 通道。必須使用派送程式 (但不需要工作控制器) 配置後端儲存。必須配置派送程式以執行 LMTP 伺服器。

在典型的多層部署中,使用者佈建在不同的後端郵件儲存機器上。這些後端機器中的一台或多台可能並未開啟 LMTP,因此前端轉送需要瞭解哪些儲存機器可識別 LMTP。您可以使用一般資料庫功能明確命名那些配置為接受 LMTP 遞送的郵件儲存,以實現此目的。

Procedure使用 LMTP 配置內送 MTA 轉送

若要配置內送 MTA 轉送以使用 LMTP,請執行以下作業:

步驟
  1. 修改您的 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
    !
  2. 將電子信箱 DELIVERY_OPTIONS 設定成:


    #*mailbox=@$X.LMTP:$M%$\$2I$_+$2S@lmtpcs-daemon
  3. 將原生 DELIVERY_OPTIONS 表示式設定成:


    #*native=@$X.LMTPN:$M+$2S@native-daemon
  4. 將通道關鍵字 multigate connectcanonical 增加至每個 tcp_lmtp* 通道區段。

  5. 將下列通道關鍵字增加至 tcp_lmtpcs 通道:


    fileinto @$4O:$U+$S@$D

    請注意,上述關鍵字的「O」為大寫字母 O,不是零。

  6. 內送 MTA 轉送配置設定應如下所示:

    DELIVERY_OPTIONSoption.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 的後端儲存

如果後端儲存經由 LMTP 接收郵件,則不需要 MTA。這表示它們沒有工作控制器,且沒有任何位址重寫工具與 MTA 關聯。但是,它們仍需要派送程式和簡單的 MTA 配置。特別是,它們需要 dispatcher.cnf 檔案和 mappings 檔案,這兩個檔案將構成 MTA 配置的唯一重要部分。

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 運作。

還可以設定 MAX_CONNSMAX_PROCSMAX_LIFE_CONNSMAX_LIFE_TIME 的一般派送程式選項,但設定必須符合硬體要求。

PORT_ACCESS 對映很重要。後端伺服器的 LMTP 實作將用做 Sun Java System Messaging Server 轉送器和後端儲存之間的專用協定。必須使用 PORT_ACCESS 對映以確保僅此類轉送器可以連線至這些服務。您的對映檔案應類似於:


PORT_ACCESS

  TCP|*|225|1.2.3.4|* $Y
  TCP|*|226|1.2.3.4|* $Y
  TCP|*|225|1.2.3.5|* $Y
  TCP|*|226|1.2.3.5|* $Y
  TCP|*|*|*|*   $N500$ Do$ not$ connect$ to$ this$ machine
         

應使用網路上連線至後端儲存的轉送器 IP 位址替代此處 PORT_ACCESS 對映表中指定的範例 IP 位址。

必須有一個 imta.cnf 檔案,但它僅用於使配置完整。最小的 imta.cnf 檔案應包含以下通道定義:

! tcp_lmtpss (LMTP server - store)
tcp_lmtpss lmtp 
tcp_lmtpss-daemon

!
! tcp_lmtpsn (LMTP server - native)
tcp_lmtpsn lmtp 
tcp_lmtpsn-daemon

請注意,依預設,LMTP 通道定義已被註釋。如果您要 LMTP 運作,必須取消註釋。

配置轉送以經由 LMTP 將郵件傳送至帶有郵件儲存和完整 MTA 的後端系統

在某些情況下,您可能希望後端儲存具有 MTA 的完整功能,但仍具有使用 LMTP 的載入保存功能。例如,您可能需要後端儲存上的程式遞送。這種情況下,應按以上使用 LMTP 配置內送 MTA 轉送中的說明配置轉送器。

在具有完整 MTA 的後端郵件儲存系統上配置 LMTP

從後端儲存郵件傳送系統的配置到使用 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 協定

本節提供 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

表 15–1 顯示每個收件者的可能狀態代碼。 在此三欄表格中,第一欄顯示短代碼,第二欄顯示等效的長代碼,第三欄顯示狀態文字。2.x.x 狀態代碼是成功代碼,4.x.x 代碼是可重試錯誤,5.x.x 代碼是不可重試錯誤。

表 15–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