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

第 13 章 使用預先定義的通道

首次安裝 Messaging Server 時,已經定義了數個通道 (請參閱表 13–1)。本章說明如何在 MTA 中使用預先定義的通道定義。

應先閱讀第 10 章, 關於 MTA 服務和配置,然後再閱讀本章。如需有關在 imta.cnf 檔案中配置重寫規則的資訊,請參閱第 11 章, 配置重寫規則

本章包含以下各節:

defaults 通道在配置通道預設中加以說明。

預先定義的通道

下表列出了一些預先定義的通道。

表 13–1 預先定義的通道

通道 

定義 

defaults

用於為各種通道指定預設關鍵字。請參閱配置通道預設

l

僅適用於 UNIX。用於決定路由方式以及使用 UNIX 郵件工具提交郵件。 

ims-ms

遞送郵件至本機儲存。 

native

僅適用於 UNIX將郵件傳送至 /var/mail。(請注意,Messaging Server 不支援 /var/mail 存取。使用者必須使用 UNIX 工具從 /var/mail 儲存存取郵件。)

pipe

用於透過站點提供的程式或程序檔執行遞送。管道通道執行的指令由管理員透過程式介面進行控制。 

reprocessprocess

這兩個通道用於延遲且離線之郵件的處理。reprocess 通道通常如同來源通道或目標通道,是隱藏的,process 通道則如同其他 MTA 通道,是可見的。

defragment

提供重新組合 MIME 分段郵件的方法。 

conversion

對經由 MTA 的郵件逐個執行內文部分的轉換。 

bitbucket

用於需要被捨棄的郵件。 

inactive/deleted

用於處理目錄中已被標記為非使用中/刪除的使用者的郵件。通常會退回郵件,並將自訂退回郵件傳回給郵件的寄件者。 

hold

用於保留使用者的郵件。例如,當使用者從一台郵件伺服器遷移至另一台郵件伺服器時。 

sms

支援對 SMS 閘道的單向電子郵件傳送。 


tcp_local
tcp_intranet
tcp_auth
tcp_submit
tcp_tas

實作經由 TCP/IP 的 SMTP。多重執行緒 TCP SMTP 通道包括在派送程式控制下執行的多重執行緒 SMTP 伺服器。外寄的 SMTP 郵件由通道程式 tcp_smtp_client 進行處理,並在工作控制器控制下依需要執行。 

tcp_local 接收來自遠端 SMTP 主機的內送郵件。根據您是否使用智慧主機/防火牆配置,將外寄郵件直接傳送至遠端 SMTP 主機,或將外寄郵件傳送至智慧主機/防火牆系統。

tcp_intranet 接收和傳送企業內部網路中的郵件。

tcp_auth 用做 tcp_local 的切換通道;經認證的使用者切換至 tcp_auth 通道,以避免轉送阻斷限制。

tcp_submit 在保留的提交連接埠 587 上接受通常來自使用者代理程式的郵件提交作業 (請參閱 RFC 2476)。

tcp_tas 是一種由執行統一郵件傳送的站點使用的特殊通道。

使用管道通道遞送郵件至程式

使用者可能想將內送郵件傳送至程式,而不是電子信箱。例如,使用者可能想將內送郵件傳送至郵件排序程式。pipe 通道使用針對使用者的站點提供的程式來執行郵件傳送。

若要方便程式傳送,必須先將程式註冊為可由 pipe 通道進行呼叫。使用 imsimta program 公用程式可執行此作業。此公用程式會為每個指令指定唯一名稱,這些指令是您註冊為可由 pipe 通道呼叫的指令。然後,一般使用者可以指定方法名稱,做為其 mailprogramdeliveryinfo LDAP 屬性的值。

例如,若要增加一個 UNIX 指令 myprocmail 做為可由使用者呼叫的程式,應先使 用 imsimta program 公用程式註冊該指令,如下例所示。此範例是要註冊名為 myprocmail 的程式,該程式用於執行帶有引數 -d username 的程式 procmail,而且是以使用者身份執行:

imsimta program -a -m myprocmail -p procmail -g "-d %s" -e user

確定可執行檔存在於 programs 目錄 msg_svr_base/data/site-programs 中。還要確定將執行權限設定為「others」。

若要讓使用者可存取此程式,使用者的 LDAP 項目中必須包含以下屬性和值:

maildeliveryoption: program 
mailprogramdeliveryinfo: myprocmail

如需有關 imsimta program 公用程式的更多資訊, 請參閱「Sun Java System Messaging Server 6 2005Q4 Administration Reference」

替代遞送程式必須遵循以下退出碼和指令行引數限制

結束碼限制。pipe 通道呼叫的傳送程式必須傳回有意義的錯誤碼,以使通道瞭解是否將郵件移出佇列、傳送以便以後處理或傳回郵件。

如果子程序結束,而結束碼為 0 (EX_OK),則表示郵件傳送成功,並已從 MTA 佇列中移除。如果子程序結束,而結束碼為 71、74、75 或 79 (EX_OSERREX_IOERREX_TEMPFAILEX_DB),則表示發生暫時性錯誤,將延遲傳送郵件。如果傳回任何其他退出碼,則郵件將被作為無法遞送的郵件傳回給創建者。這些結束碼均在系統標頭檔案 sysexits.h 中定義。

指令行引數。傳送程式可以帶有任意多個固定引數以及可變引數 %s,該可變引數表示使用者執行程式時所用的使用者名稱,或是 Postmaster (「inetmail」) 執行程式時所用的使用者名稱+網域。例如,以下指令行使用 procmail 程式來傳送收件者的郵件:

/usr/lib/procmail -d %s

配置原生 (/var/mail) 通道

選項檔案可以用於控制原生通道的各種特徵。此原生通道選項檔案必須儲存在 MTA 配置目錄中,並命名為 native_option (例如 msg_svr_base/config/native_option)。

選項檔案由多行組成。每行都包含一個選項設定。選項設定的形式為:

option=value

其中,value 可以是字串或整數,具體取決於選項的需求。

表 13–2 本機通道選項

選項 

說明 

FORCE_CONTENT_LENGTH

(0 或 1;僅適用於 UNIX) 

如果 FORCE_CONTENT_LENGTH=1,則 MTA 會在傳送至原生通道的郵件中增加 Content-length: 標頭行,並使通道在遇到行首出現「From」的情形時,不使用「>From」語法。這樣可讓本機 UNIX 郵件與 Sun 較新的郵件工具相容,但可能會與其他 UNIX 郵件工具不相容。

FORWARD_FORMAT (字串)

指定使用者的 .forward 檔案位置。字串 %u 表示它可以在每個使用者 ID 中被替換。字串 %h 表示它可以在每位使用者的主目錄中被替換。如果未明確指定此選項,則預設的運行方式對應為:

FORWARD_FORMAT=%h/.forward


REPEAT_COUNT (整數)
SLEEP_TIME (整數)

當 MTA 嘗試遞送新郵件時,避免使用者的新郵件檔案被另一程序鎖定,這些選項可用於控制應嘗試重試原生通道程式的次數與頻率。如果經過指定次數的重試後,仍然無法開啟檔案,郵件將保留在原生佇列中,原生通道下次執行時會再次嘗試遞送新郵件。 

REPEAT_COUNT 選項控制通道程式在放棄前嘗試開啟郵件檔案的次數。REPEAT_COUNT 預設為 30 (嘗試 30 次)。

SLEEP_TIME 選項控制通道程式在兩次嘗試之間等待的秒數。SLEEP_TIME 預設為 2 (重試間隔時間為 2 秒)。

SHELL_TIMEOUT (整數)

控制通道等待 .forward 中的使用者 shell 指令完成的時間 (以秒為單位)。逾時後,會將郵件傳回給原始寄件者,並隨附類似「等待 user shell 指令 command 完成逾時」的錯誤訊息。預設為 600 (10 分鐘)。

SHELL_TMPDIR (目錄特定)

控制在遞送至指令時本機通道建立其暫存檔時所在的位置。依預設,此類暫存檔建立在使用者的主目錄中。使用此選項,管理員可以選擇在其他 (單一) 目錄中建立暫存檔。例如: 

SHELL_TMPDIR=/tmp

使用保留通道暫時保留郵件

hold 通道用於保留暫時被阻止接收新郵件的收件者之郵件。保留郵件的原因有:使用者名稱已變更,或使用者的電子信箱已從一台郵件主機移至其他郵件主機,或已從一個網域移至其他網域。還可能有其他原因需要暫時保留郵件。

如果要保留郵件,則會使用與導向至 reprocess 通道相同的機制,將郵件導向至 hold 通道,即置於 msg_svr_base/queue/hold 目錄中。如此一來,訊息封的 To: 位址就不會變更。郵件會被寫入 hold 通道佇列,即做為 msg-server/queue/hold 目錄下的 ZZxxx.HELD 檔案。這樣即可避免被工作控制器察覺,因而得以「保留」。使用 imsimta qm dir -held 指令檢視 HELD 檔案清單。可以使用 imsimta qm release 指令選取並釋放這些郵件。釋放時會將郵件名稱變更為 ZZxxx .00,並通知工作控制器。然後與 hold 通道關聯的主要程式 reprocess.exe 便會處理這些郵件。因此,會使用一般重寫機制處理郵件 (以及 To: 位址)。

如需有關 imsimta qm 指令的更多資訊,請參閱「Sun Java System Messaging Server 6 2005Q4 Administration Reference」中的「imsimta qm」

轉換通道

conversion 通道可讓您針對指定的、經由 MTA 的郵件,任意執行逐個內文部分的處理。(請注意,內文部分不同於郵件,一封郵件可包含多個內文部分,例如附件便如此。此外,內文部分由 MIME 標頭指定和描述。) 這項處理可由任何站點提供的程式或指令程序來完成,可處理諸如文字轉換或影像格式轉換、病毒掃描、語言翻譯等工作。可以選取 MTA 通訊流的各種郵件類型進行轉換,並可針對每種類型的郵件內文部分指定特定的程序和程式。

使用本章之前,必須先瞭解通道的概念 (請參閱通道)。如需有關使用 conversion 通道進行病毒掃描的補充資訊,請參閱 Messaging Server 文件網站 下方的最新版本的「Messaging Server Technical Notes」。

實作轉換通道包括 A) 選取要處理的郵件通訊流,B) 指定不同郵件的處理方式。這些程序將在以後詳細論述。


備註 –

預設 conversion 通道會在 MTA 配置檔案 (imta.cnf) 中自動建立。此通道可直接使用,無需進行任何修改。


本節包含以下小節:

MIME 簡介

轉換通道使 MIME (多重目的網際網路郵件延伸) 標頭行的使用更加廣泛。管理員需要具備郵件結構與 MIME 標頭欄位的有關知識。如需有關 MIME 的完整資訊,請參閱 RFCs 1806, 2045 through 2049, and 2183。方便起見,此處提供了一份簡短的 MIME 簡介。

郵件結構

一個簡單的郵件由標頭與內文組成。標頭位於郵件頂端其中包含特定控制資訊例如日期、主旨、寄件者及收件者。內文是指標頭下第一個空行之後的所有內容。MIME 指定了一種建構更複雜的郵件的方法,使郵件中可以包含多個內文部分,甚至在內文部分中嵌套內文部分。這類郵件稱為多部分郵件,而如前所述,可使用轉換通道逐個內文部分地執行郵件處理。

MIME 標頭

MIME 規格為內文部分定義了一組標頭行。包含 MIME-VersionContent-typeContent-Transfer-EncodingContent-IDContent-disposition。conversion 通道最常使用 Content-typeContent-disposition 兩個標頭。部分 MIME 標頭行的範例如下所示:


Content-type: APPLICATION/wordperfect5.1;name=Poem.wpc
Content-transfer-encoding: BASE64
Content-disposition: attachment; filename=Poem.wpc
Content-description: "Project documentation Draft1 wordperfect format"

備註 –

MIME 標頭行不同於一般的非 MIME 標頭行 (如 To:Subject:From:)。基本上,只要述及轉換通道,MIME 標頭行就會以字串 Content- 開頭。


Content-type 標頭

MIME Content-Type 標頭說明內文部分的內容。Content-Type 標頭格式舉例如下:

Content-type: type/subtype; parameter1=value; parameter2=value...

type 說明內文部分的內容類型。type 範例有 TextMultipartMessageApplicationImageAudioVideo

subtype 進一步說明內容類型。每個 Content-type 各自擁有一組 subtypes。例如:text/plainapplication/octet-streamimage/jpeg。MIME 郵件的內容子類型由 IANA (網際網路指定號碼授權中心) 指定並列出。清單位於 http://www.iana.org/assignments/media-types

parameter 特定於Content-type/subtype 對。例如,如下所示的 charsetname 參數:


Content-type: text/plain; charset=us-ascii
Content-type: application/msword; name=temp.doc

charset 參數指定文字郵件的字元集。name 參數在將資料寫入檔案時,為其指定建議使用的檔案名稱。


備註 –

Content-Type 值、subtypes 和參數名稱都不區分大小寫。


Content-disposition 標頭

MIME Content-disposition 標頭提供內文部分的展示資訊。它通常被增加到附件中,指定附件內文部分應顯示 (inline) 還是表示為檔案名稱以供複製 (attachment)。Content-disposition 標頭的格式如下:

Content-disposition: disposition_type; parameter1=value;parameter2=value...

disposition_type 通常為 inline (顯示內文部分) 或 attachment (表示為要儲存的檔案)。Attachment 通常具有參數 filename,值用於指定建議儲存檔案使用的名稱。

如需有關 Content-disposition 標頭的詳細資訊,請參閱 RFC2183。

選取通訊流以進行轉換處理

與其他 MTA 通道不同,轉換通道通常不在位址或 MTA 重寫規則中指定。使用 CONVERSIONS 對映表 (由 imta_tailor 檔案中的 IMTA_MAPPING_FILE 參數指定) 將郵件傳送至 conversion 通道。表格中的項目格式如下:

IN-CHAN=source-channel;OUT-CHAN=destination-channel;CONVERT Yes/No

MTA 處理每封郵件時,都會探測 CONVERSIONS 對映表 (如果存在)。如果 source-channel 是發出郵件的通道,而 destination-channel 是郵件發往的通道,則執行 CONVERT 之後的動作 (Yes 表示 MTA 將郵件從其 destination-channel 轉移到 conversion 通道;如果找不到相符項目,則郵件將在常規目標通道中形成佇列)。


備註 –

形式為 user@conversion.localhostnameuser@conversion 的位址將透過 conversion 通道路由,而不考量 CONVERSIONS 對映表。


下例將所有非內部郵件 (源自網際網路或發往網際網路的郵件) 路由至 conversion 通道。

CONVERSIONS

   IN-CHAN=tcp_local;OUT-CHAN=*;CONVERT   Yes
   IN-CHAN=*;OUT-CHAN=tcp_local;CONVERT   Yes

第一行指定將處理來自 tcp_local 通道的郵件。第二行指定還將處理發往 tcp_local 通道的郵件。tcp_local 通道處理所有發往網際網路與來自網際網路的郵件。由於預設為不通過 conversion 通道,因此其他任何郵件都不會通過 conversion 通道。

請注意,這是非常基本的表格,可能不滿足使用更多自訂配置的站點 (例如,使用多個外寄至網際網路 tcp_* 通道或多個自網際網路內送 tcp_* 通道的站點) 的要求。

控制轉換處理

當郵件傳送到轉換通道時會被逐個內文部分地進行處理。處理由 MTA conversions 檔案進行控制,該檔案由 imta_tailor 檔案中的 IMTA_CONVERSION_FILE 選項指定 (預設: msg_svr_base/conversions)。conversions 檔案包含以行分隔的項目,這些項目用於限定:1) 要處理的內文部分的類型,以及 2) 處理方式。

每個項目由一行或多行組成,各行包含一個或多個 name=value 參數陳述式。參數子句中的值符合 MIME 慣例。除最後一行外,每行都必須以分號 (;) 結尾。此檔案中的實體行不能超過 252 個字元。可以使用反斜線 (\) 延續字元,將一個邏輯行分割成多個實體行。若要終止項目,只需在一行結尾不加分號,或者加入一個或多個空行,或兩者併用。

下面是 conversions 檔案項目的簡單範例:


範例 13–1 conversions 檔案項目


out-chan=ims-ms; in-type=application; in-subtype=wordperfect5.1;
  out-type=application; out-subtype=msword; out-mode=block;
  command="/usr/bin/convert -in=wordp -out=msword 'INPUT_FILE' 'OUTPUT_FILE’"

使用 out-chan=ims-ms; in-type=application; in-subtype=wordperfect5.1 陳述式來限定內文部分。即指定將要轉換的部分之類型。系統會讀取各部分的標頭,並擷取其 Content-Type: 及其他標頭資訊。然後從頭至尾掃描 conversion 檔案中的項目,檢查其中所有的 in-* 參數以及 OUT-CHAN 參數 (如果有)。如果所有這些參數都符合將要處理的內文部分之對應資訊,則執行 command= delete= 陳述式所指定的轉換,並設定 out-* 參數。

如果不符合,則將該部分與下一個 conversions 檔案項目進行比對。完成所有內文部分的掃描與處理 (假定存在完全合格的相符項目) 後,將郵件傳送至下一個通道。如果沒有相符項目,則不進行任何處理,並將郵件傳送至下一個通道。

out-chan=ims-ms 指定只轉換目標為 ims-ms 通道的郵件部分。in-type=applicationin-subtype=wordperfect5.1 指定郵件部分的 MIME Content-type 標頭必須為 application/wordperfect5.1

可透過其他 in-* 參數進一步限定郵件部分。(請參閱表 13–6。)上述項目會對具有以下 MIME 標頭行的郵件部分,觸發轉換動作:


Content-type: APPLICATION/wordperfect5.1;name=Draft1.wpc
Content-transfer-encoding: BASE64
Content-disposition: attachment; filename=Draft1.wpc
Content-description: "Project documentation Draft1 wordperfect format"

範例 13–1 中的三個 conversion 檔案限定參數之後,接下來的兩個參數 out-type=applicationout-subtype=msword 指定替代 MIME 標頭行將會附加至「已處理」內文部分。out-type=applicationout-subtype=msword 指定外寄郵件的 MIME Content-type/subtypeapplication/msword

請注意,由於 in-typeout-type 參數相同,則無需設定 out-type=application,因為 conversion 通道預設為外寄內文部分的原始 MIME 標籤。可以透過其他輸出參數為外寄內文部分指定其他 MIME 標籤。

out-mode=block (範例 13–1) 指定網站提供的程式將傳回的檔案類型。換言之,它指定檔案的儲存方式,以及轉換通道讀回傳回之檔案的方式。例如,html 檔案以文字模式儲存,而 .exe 程式或 zip 檔案則以區塊/二進位模式儲存。模式是一種描述要讀取之檔案使用特定儲存格式的方式。

範例 13–1 中的最後一個參數指定要對內文部分執行的動作:


command="/usr/bin/convert -in=wordp -out=msword 'INPUT_FILE’ 'OUTPUT_FILE’"

command= 參數指定將對內文部分執行某個程式。/usr/bin/convert 是假設的指令名稱;-in=wordp-out=msword 是假設的指令行引數,指定輸入文字和輸出文字的格式; INPUT_FILEOUTPUT_FILE 是轉換通道環境參數 (請參閱使用轉換通道環境變數)。程式應儲存其轉換的內文部分。


備註 –

當常規轉換項目請求包含外層郵件標頭的檔案時,訊息封創建者和收件者資訊現在分別作為 x-envelope-from 和 x-envelope-to 欄位提供。


無需對內文部分執行指令,只需將 command 參數替換為 DELETE=1,即可刪除該郵件部分。


備註 –

conversions 檔案遭修改時,必須重新編譯配置 (請參閱編譯 MTA 配置)。


轉換通道資訊流

資訊流程如下:包含內文部分的郵件進入轉換通道。轉換通道剖析郵件,逐一處理各部分。然後,conversion 通道將會限定內文部分,即透過將其 MIME 標頭行與限定參數進行比較,以決定是否應處理該內文部分。如果內文部分通過判定,則開始進行轉換處理。如果 MIME 或內文部分資訊將會傳送到轉換程序檔,則會儲存在資訊傳送參數所指定的環境變數 (使用轉換通道環境變數) 中。

此時會對內文部分執行由動作參數指定的動作。此動作通常是將內文部分刪除或將其傳送至程序檔內含的程式。程序檔處理完該內文部分後,會將其傳回轉換通道,以重新組合成處理後的郵件。程序檔也可使用 conversion 通道輸出選項,將資訊傳送至 conversion 通道。資訊可以是要加入輸出內文部分的 MIME 標頭行、要傳回給郵件寄件者的錯誤文字,或指示 MTA 啟動某些動作 (例如退回、刪除或保留郵件) 的特殊指令。

最後,conversion 通道會依輸出參數的指定來替代輸出內文部分的標頭行。

使用轉換通道環境變數

對郵件內文部分作業時,環境變數通常用於將 MIME 標頭行資訊或整個內文部分傳送至站點提供的程式或從站點提供的程式傳送 MIME 標頭行資訊或整個內文部分。例如,程式可能需要 Content-typeContent-disposition 標頭行資訊以及郵件內文部分。站點提供的程式之主要輸入內容,通常是從檔案中讀取的郵件內文部分。處理完內文部分後,程式需要將其寫入檔案,以供轉換通道讀取。此種資訊傳送方式就透過轉換通道環境變數來實現。

使用 parameter-symbol-* 參數或一組預先定義的 conversion 通道環境變數 (請參閱使用轉換通道輸出選項),即可在 conversions 檔案中建立環境變數。

以下 conversions 檔案項目和內送標頭顯示如何使用環境變數將 MIME 資訊傳送至站點提供的程式。

conversions 檔案項目:


in-channel=*; in-type=application; in-subtype=*;
  parameter-symbol-0=NAME; parameter-copy-0=*;
  dparameter-symbol-0=FILENAME; dparameter-copy-0=*;
  message-header-file=2; original-header-file=1;
  override-header-file=1; override-option-file=1;
  command="/bin/viro-scan500.sh ”INPUT_FILE’ ”OUTPUT_FILE’"
 

送進的標頭:


Content-type: APPLICATION/msword; name=Draft1.doc
Content-transfer-encoding: BASE64
Content-disposition: attachment; filename=Draft1.doc
Content-description: "Project documentation Draft1 msword format"

in-channel=*; in-type=application; in-subtype=* 指定將會處理來自任何 application 類型的輸入通道之郵件內文部分。

parameter-symbol-0=NAME 指定第一個 Content-type 參數值 (在範例中為 Draft1.doc) 儲存在名為 NAME 的環境變數中。

parameter-copy-0=* 指定輸入內文部分的所有 Content-type 參數均複製到輸出內文部分。

dparameter-symbol-0=FILENAME 指定第一個 Content-disposition 參數值 (範例中為 Draft1.doc) 儲存在名為 FILENAME 的環境變數中。

dparameter-copy-0=* 指定輸入內文部分的所有 Content-disposition 參數均複製到輸出內文部分。

message-header-file=2 指定將郵件的原始標頭作為一個整體 (最外層的郵件標頭) 寫入由環境變數 MESSAGE_HEADERS 指定的檔案中。

original-header-file=1 指定將含括 MESSAGE/RFC822 的部分之原始標頭寫入由環境變數 ORIGINAL_HEADERS 指定的檔案中。

override-header-file=1 指定從由環境變數 OUTPUT_HEADERS 指定的檔案中讀取 MIME 標頭,以置換含括 MIME 的部分中的原始 MIME 標頭行。$OUTPUT_HEADERS 是執行轉換時建立的即時暫存檔。站點提供的程式會使用此檔案在轉換過程中儲存變更的 MIME 標頭行。而轉換通道會在重新組合內文部分時,從此檔案中讀取 MIME 標頭行。請注意,只有 MIME 標頭行可以修改。其他一般的非 MIME 標頭行無法由轉換通道變更。

override-option-file=1 指定 conversion 通道將會從 OUTPUT_OPTIONS 環境變數命名的檔案中讀取 conversion 通道選項。請參閱使用轉換通道輸出選項

command="msg_svr_base/bin/viro-scan500.sh" 指定要對郵件內文部分執行的指令。

表 13–3 轉換通道環境變數

環境變數 

說明 

ATTACHMENT_NUMBER

目前部分的附件編號。其格式與 ATTACHMENT-NUMBER 轉換匹配參數的格式相同。 

CONVERSION_TAG

目前使用中的轉換標記之清單。對應於TAG 轉換匹配參數。 

INPUT_CHANNEL

使郵件在轉換通道上形成佇列的通道。對應於 IN-CHANNEL 轉換匹配參數。 

INPUT_ENCODING

內文部分原始具備的編碼。 

INPUT_FILE

包含原始內文部分的檔案之名稱。站點提供的程式應讀取此檔案。 

INPUT_HEADERS

包含內文部分原始標頭行的檔案之名稱。站點提供的程式應讀取此檔案。 

INPUT_TYPE

輸入郵件部分的 MIME Content-type

INPUT_SUBTYPE

輸入郵件部分的 MIME 內容子類型。 

INPUT_DESCRIPTION

輸入郵件部分的 MIME content-description

INPUT_DISPOSITION

輸入郵件部分的 MIME content-disposition

MESSAGE_HEADERS

檔案名稱,該檔案包含含括郵件 (不只是內文部分) 最外層的原始標頭或是最直接含括 MESSAGE/RFC822 部分的內文部分之標頭。站點提供的程式應讀取此檔案。 

OUTPUT_CHANNEL

郵件輸出的通道。對應於 OUT-CHANNEL 轉換匹配參數。 

OUTPUT_FILE

站點提供的程式用於儲存其輸出的檔案之名稱。站點提供的程式應建立並寫入此檔案。 

OUTPUT_HEADERS

站點提供的程式用於儲存含括部分的 MIME 標頭行的檔案之名稱。站點提供的程式應建立並寫入此檔案。請注意,檔案應包含實際 MIME 標頭行 (而非 option=value 行),後接一空行做為最後一行。另請注意,只有 MIME 標頭行可以修改。其他一般的非 MIME 標頭行無法由轉換通道變更。

OUTPUT_OPTIONS

站點提供的程式讀取轉換通道選項時所用的檔案之名稱。請參閱使用轉換通道輸出選項

PART_NUMBER

目前部分的部分編號。其格式與 PART-NUMBER 轉換匹配參數的格式相同。 

PART_SIZE

正在處理的部分之大小以位元組為單位。 

郵件轉換標記

郵件轉換標記是與特定收件者或寄件者相關的特殊標記。投遞郵件時,標記對轉換通道程式可見,後者可利用此標記進行特殊處理。轉換標記儲存在 LDAP 目錄中。

可按如下方法使用郵件轉換標記:管理員可使用 harmonica 的郵件轉換標記值設置選取的使用者。這樣,管理員就擁有了一個 conversion 通道設置,它將在處理郵件時偵測標記是否存在以及 harmonica 的值。上述情況發生時,該程式會執行某一任意功能。

郵件轉換標記可根據使用者或網域進行設定。網域層級的收件者 LDAP 屬性為 MailDomainConversionTag (可使用 MTA 選項 LDAP_DOMAIN_ATTR_CONVERSION_TAG 進行修改)。使用者層級的收件者 LDAP 屬性為 MailConversionTag (可使用 MTA 選項 LDAP_CONVERSION_TAG 進行修改)。兩個屬性均可以有多個值,且每個值均指定一個不同的標記。與給定收件者相關的標記組是可累積的,即在網域層級設置的標記可與在使用者層級設置的標記進行合併。

基於寄件者的轉換標記可使用 MTA 選項 LDAP_SOURCE_CONVERSION_TAGLDAP_DOMAIN_ATTR_SOURCE_CONVERSION_TAG, 進行設定,這兩個選項分別為與這些來源位址相關的轉換標記指定使用者層級和網域層級的 LDAP 屬性。這些選項均沒有預設屬性。

使用轉換通道輸出選項

轉換通道輸出選項 (表 13–4) 是動態變數,用於將資訊與特殊指令從轉換程序檔傳送至轉換通道。例如,在內文部分處理期間,程序檔可能會傳送特殊指令,要求轉換通道退回郵件,並在傳回的郵件中加入一些錯誤文字,表明郵件帶有病毒。

輸出選項透過在所需的轉換項目中設定 OVERRIDE-OPTION-FILE=1 來啟動。然後,輸出選項由程序檔依需要設定,並儲存在環境變數檔案 OUTPUT_OPTIONS 中。程序檔處理完內文部分後,conversion 通道會從 OUTPUT_OPTIONS 檔案中讀取這些選項。

OUTPUT_OPTION 變數是 conversion 通道讀取選項時所用的檔案之名稱。通常會用作即時暫存檔來傳送資訊。以下範例顯示程序檔使用輸出選項將錯誤訊息傳回給寄出病毒郵件的寄件者。


/usr/local/bin/viro_screen2k $INPUT_FILE   # run the virus screener

if [ $? -eq 1 ]; then
   echo "OUTPUT_DIAGNOSTIC=’Virus found and deleted.’" > $OUTPUT_OPTIONS
   echo "STATUS=178029946" >> $OUTPUT_OPTIONS
else
   cp $INPUT_FILE $OUTPUT_FILE # Message part is OK
fi

            

在此範例中,會將系統診斷訊息與狀態碼增加至由 $OUTPUT_OPTIONS 定義的檔案中。讀取完 $OUTPUT_OPTIONS 暫存檔後,會看到如下內容:


OUTPUT_DIAGNOSTIC="Virus found and deleted."
STATUS=178029946

其中,OUTPUT_DIAGNOSTIC='Virus found and deleted’ 一行告知 conversion 通道將 Virus found and deleted 文字增加至郵件中。

178029946 是指在 msg_svr_base/include/deprecated/pmdf_err.h 中發現的每個 pmdf_err.h 檔案的 PMDF__FORCERETURN 狀態。此狀態碼指示轉換通道將郵件退回給寄件者。(如需有關使用特殊指令的更多資訊,請參閱使用轉換通道輸出退回、刪除或保留郵件

完整的輸出選項清單如下表所示。

表 13–4 conversion 通道輸出選項

選項 

說明 

OUTPUT_TYPE

輸出郵件部分的 MIME 內容類型。 

OUTPUT_SUBTYPE

輸出郵件部分的 MIME 內容子類型。 

OUTPUT_DESCRIPTION

輸出郵件部分的 MIME 內容描述。 

OUTPUT_DIAGNOSTIC

郵件被轉換通道強制退回給寄件者時,作為郵件的一部分納入的文字。 

OUTPUT_DISPOSITION

輸出郵件部分的 MIME content-disposition

OUTPUT_ENCODING

用於輸出郵件部分的 MIME 內容傳輸 encoding

OUTPUT_MODE

MIME Mode,conversion 通道會以此模式寫入輸出郵件部分,而收件者會以此模式讀取輸出郵件部分。

STATUS

轉換程式的結束狀態。通常是一個特殊的指令可讓轉換通道啟動某個動作。完整的指令清單位於 msg_svr_base/include/deprecated/pmdf_err.h 中。

含括的 MESSAGE/RFC822 部分中的標頭

對郵件部分執行轉換時,conversion 通道會存取含括 MESSAGE/RFC822 的部分中的標頭;如果沒有含括 MESSAGE/RFC822 的部分,則存取郵件標頭。站點提供的程式可能會用到此標頭內的資訊。

如果選取的項目具有 ORIGINAL-HEADER-FILE=1,則含括 MESSAGE/RFC822 的部分的所有原始標頭行會被寫入 ORIGINAL_HEADERS 環境變數所指定的檔案。如果 OVERRIDE-HEADER-FILE=1,則 conversion 通道會讀取含括部分的標頭並將其用做 ORIGINAL_HEADERS 環境變數所指定的檔案之內容。

從轉換項目呼叫對映表

out-parameter-* 值可以在任意命名的對映表中儲存和擷取。此功能用於重新命名用戶端傳送的附件,這些用戶端使用通用名稱 (如 att.dat) 來傳送所有附件,而不考量這些附件是 postscript mswordtext 還是其他格式。這是一種重新標示該部分的通用方法,可便於其他用戶端 (例如 Outlook) 透過讀取副檔名來開啟該部分。

從對映表擷取參數值的語法如下:

”mapping-table-name:mapping-input[$Y, $N]’

$Y 傳回參數值。如果找不到相符的項目或者傳回 $Y,則轉換檔案項目中的參數會被忽略或視為空白字串。缺少相符項目或 $N 不會導致轉換項目本身中斷。

請考量以下對映表:


X-ATT-NAMES

   postscript       temp.PS$Y
   wordperfect5.1   temp.WPC$Y
   msword           temp.DOC$Y

上述對映表的以下轉換項目會使附件的通用檔案名稱被替換為特定的檔案名稱:

out-chan=tcp_local; in-type=application; in-subtype=*; 
   in-parameter-name-0=name; in-parameter-value-0=*; 
   out-type=application; out-subtype=’INPUT-SUBTYPE’; 
   out-parameter-name-0=name; 
   out-parameter-value-0=”’X-ATT-NAMES:\\’INPUT_SUBTYPE\\''"; 
   command="cp  ”INPUT_FILE’  ”OUTPUT_FILE’"

在上述範例中,out-chan=tcp_local; in-type=application; in-subtype=* 指定要處理的郵件必須來自 tcp_local 通道,並且 content-type 標頭為 application/* (* 表示可以使用任何子類型)。

另外,in-parameter-name-0=name; in-parameter-value-0=* 還指定郵件必須具有參數類型 name=* (* 同樣表示可以使用任何參數值)

out-type=application; 指定處理後的郵件之 MIME Content-type 參數為 application

out-subtype=’INPUT-SUBTYPE’; 指定處理後的內文部分之 MIME subtype 參數為 INPUT-SUBTYPE 環境變數,即輸入 subtype 的原始值。因此,如果要將

Content-type: application/xxxx; name=foo.doc

變更為

Content-type: application/msword; name=foo.doc

可以使用

out-type=application; out-subtype=msword

out-parameter-name-0=name; 指定輸出內文部分的第一個 MIME Content-type 參數為 name= 類型。

out-parameter-value-0=’X-ATT-NAMES:\\’INPUT_SUBTYPE\\’’; 表示使用第一個 MIME subtype 參數值,並搜尋對映表 X-ATT-NAMES,以查看是否有相符的 subtype。如找到相符項,name 參數會接收 X-ATT-NAMES 對映表中指定的新值。因此,如果參數類型為 mswordname 參數將為 temp.DOC

使用轉換通道輸出退回、刪除或保留郵件

本節描述如何使用轉換通道選項來退回、刪除或保留郵件。基本程序如下:

  1. 在相應的轉換檔案項目中設定 OVERRIDE-OPTION-FILE=1。這會告知 conversion 通道從 OUTPUT_OPTIONS 檔案中讀取輸出選項。

  2. 使用轉換程序檔確定需要對特定郵件內文部分執行何種動作。

  3. 在程序檔中,透過寫入 OUTPUT_OPTIONS 檔案中的 STATUS=directive_code 選項,指定該動作的特殊指令。

完整的特殊指令清單位於 msg_svr_base/include/deprecated/pmdf_err.h 中。轉換通道常用的特殊指令如下:

表 13–5 轉換通道常用的特殊指令

名稱 

六進位值 

十進位值 

PMDF__FORCEHOLD

0x0A9C86AA

178030250

PMDF__FORCERETURN

0x0A9C857A

178029946

PMDF__FORCEDELETE

0x0A9C8662

178030178

以下透過範例詳細說明這些指令的功能。

退回郵件

若要使用 conversion 通道退回郵件,請在相應的 conversions 檔案項目中設定 OVERRIDE-OPTION-FILE=1,並將下行增加至轉換程序檔:

echo "STATUS=178029946" >> $OUTPUT_OPTIONS

如果要在退回的郵件中加入簡短的文字字串請將下行加入轉換程序檔:

echo OUTPUT_DIAGNOSTIC=text-string >> $OUTPUT_OPTIONS

其中文字字串如下:「The message sent from your machine contained a virus which has been removed. Be careful about executing email attachments.

有條件地刪除郵件部分

根據部分所包含的內容有條件地刪除部分可能很有用。這項功能可使用輸出選項實現。相對地,DELETE=1 轉換參數陳述式可無條件地刪除郵件部分。

若要使用輸出選項刪除郵件部分,請在相應的轉換檔案項目中設定 OVERRIDE-OPTION-FILE=1,並將下行增加至轉換程序檔:

echo "STATUS=178030178" >> $OUTPUT_OPTIONS

保留郵件

根據部分所包含的內容有條件地保留郵件可能很有用。若要使用輸出選項刪除郵件部分,請在相應的轉換檔案項目中設定 OVERRIDE-OPTION-FILE=1,並將下行增加至轉換程序檔:

echo "STATUS=178030250" >> $OUTPUT_OPTIONS

這會請求 conversion 通道將郵件做為 .HELD 檔案暫停在 conversion 通道佇列中。

轉換通道範例

以下範例中的 CONVERSIONS 對映與轉換規則集會將傳送到假定通道 tcp_docuprint 的 GIF、JPEG 與 BITMAP 檔案自動轉換成 PostScript。這些轉換中有些會使用假定的 /usr/bin/ps-converter.sh 進行變換。其中包含一項將 WordPerfect 5.1 檔案轉換成 Microsoft Word 檔案的附加規則。


CONVERSIONS  

    IN-CHAN=*;OUT-CHAN=tcp_docuprint;CONVERT    Yes

out-chan=ims-ms; in-type=application; in-subtype=wordperfect5.1; 
  out-type=application; out-subtype=msword; out-mode=block; 
  command="/bin/doc-convert -in=wp -out=msw   ’INPUT_FILE’  ’OUTPUT_FILE’"

out-chan=tcp_docuprint; in-type=image; in-subtype=gif; 
  out-type=application; out-subtype=postscript; out-mode=text; 
  command="/bin/ps-convert -in=gif -out=ps   ’INPUT_FILE’  ’OUTPUT_FILE’"

out-chan=tcp_docuprint; in-type=image; in-subtype=jpeg; 
  out-type=application; out-subtype=postscript; out-mode=text; 
  command="/bin/ps-convert -in=jpeg -out=ps  ’INPUT_FILE’  ’OUTPUT_FILE’"

out-chan=tcp_docuprint; in-type=image; in-subtype=bitmap; 
  out-type=application; out-subtype=postscript; out-mode=text; 
  command="/bin/ps-convert -in=bmp -out=ps   ’INPUT_FILE’  ’OUTPUT_FILE’"

轉換參數如下所示:

表 13–6 轉換參數

參數 

說明 

限定參數 (指定郵件在被轉換之前必須要匹配的參數)

OUT-CHAN,OUT-CHANNEL

轉換時必須符合的輸出通道 (允許使用萬用字元)。僅當郵件的目標為此指定通道時,此項目指定的轉換才會執行。 

IN-CHAN,IN-CHANNEL

轉換時必須符合的輸入通道 (允許使用萬用字元)。僅當郵件來自此指定通道時,此項目指定的轉換才會執行。 

IN-TYPE

轉換時必須符合的輸入 MIME 類型 (允許使用萬用字元)。僅當此欄位符合內文部分的 MIME 類型時,指定的轉換才會執行。 

IN-SUBTYPE

轉換時必須符合的 MIME 輸入子類型 (允許使用萬用字元)。僅當此欄位符合內文部分的 MIME 子類型時,此項目指定的轉換才會執行。 

IN-PARAMETER-NAME-n

轉換時必須匹配的輸入 MIME Content-Type 參數名稱;n = 0, 1, 2... 此參數可與 IN-PARAMETER-VALUE-n 配合使用,以用其保留的名稱及值明確標識參數。

IN-PARAMETER-VALUE-n

轉換時必須匹配的對應於 IN-PARAMETER-NAME 的輸入 MIME Content-Type 參數值。僅當此欄位符合內文部分的 Content-Type 參數清單中對應參數時,此項目指定的轉換才會執行。允許使用萬用字元。

IN-PARAMETER-DEFAULT-n

如果不存在相應參數,則使用預設的輸入 MIME Content-Type 參數值。內文部分中未指定此類參數時,使用此值做為 IN-PARAMETER-VALUE-n 測試的預設值。

IN-DISPOSITION

轉換時必須匹配的輸入 MIME Content-Disposition

IN-DPARAMETER-NAME-n

轉換時必須匹配的輸入 MIME Content-Disposition 參數名稱;n = 0, 1, 2... 此參數可與 IN-DPARAMETER-VALUE-n 配合使用,以用其保留的名稱及值明確標識參數。

IN-DPARAMETER-VALUE-n

轉換時必須匹配的對應於 IN-DPARAMETER-NAME 的輸入 MIME Content-Disposition 參數值。僅當此欄位匹配內文部分的 Content-Disposition: 參數清單中對應參數時,此項目指定的轉換才會執行。允許使用萬用字元。

IN-DPARAMETER-DEFAULT-n

如果不存在相應參數,則使用預設的輸入 MIME Content-Disposition 參數值。內文部分中未指定此類參數時,使用此值做為 IN-DPARAMETER-VALUE-n 測試的預設值。

IN-DESCRIPTION

轉換時必須匹配的輸入 MIME Content-Description

IN-SUBJECT

含括 MESSAGE/RFC822 的部分中的輸入 Subject

TAG

輸入標記,依郵件清單 CONVERSION_TAG 參數設定。

輸出參數 (指定內文部分轉換後的輸出設定)

OUT-TYPE

輸出 MIME 類型與輸入類型不同時使用。 

OUT-SUBTYPE

輸出 MIME 子類型與輸入子類型不同時使用。 

OUT-PARAMETER-NAME-n

輸出 MIME Content-Type 參數名稱;n = 0, 1, 2...

OUT-PARAMETER-VALUE-n

輸出 MIME Content-Type 參數值,對應於 OUT-PARAMETER-NAME-n

PARAMETER-COPY-n

Content-Type 參數清單,要從輸入內文部分的 Content-Type 參數清單複製到輸出內文部分的 Content-Type: 參數清單;n=0, 1, 2... 複製時使用相同的 MIME 參數名稱,必須匹配 IN-PARAMETER-NAME-n 陳述式。

OUT-DISPOSITION

輸出 MIME Content-Disposition,與輸入 MIME Content-Disposition 不同時使用。

OUT-DPARAMETER-NAME-n

輸出 MIME Content-Disposition 參數名稱;n = 0, 1, 2...

OUT-DPARAMETER-VALUE-n

輸出 MIME Content-Disposition 參數值,對應於 OUT-DPARAMETER-NAME-n

DPARAMETER-COPY-n

Content-Disposition: 參數清單,要從輸入內文部分的 Content-Disposition: 參數清單複製到輸出內文部分的 Content-Disposition: 參數清單;n =0, 1, 2... 複製時使用 MIME 參數的名稱做為引數,必須匹配 IN-PARAMETER-NAME-n 陳述。引數中可以使用萬用字元。尤其是引數 * 表示複製所有的原始 Content-Disposition: 參數。

OUT-DESCRIPTION

輸出 MIME Content-Description,與輸入 MIME Content-Description 不同時使用。

OUT-MODE

讀取並儲存轉換檔案時所使用的模式。應為 BLOCK (二進位且可執行) 或 TEXT

OUT-ENCODING

郵件重新組合時套用於轉換檔案的編碼。 

動作參數 (指定對郵件部分執行的動作)

COMMAND

為執行轉換而執行的指令。為執行轉換而執行的指令。此參數為必需參數;如果未指定指令,此項目會被忽略。使用 / 而非 \ 指定路徑。例如:command="D:/tmp/mybat.bat"

DELETE

0 或 1。如果有設定此旗標,則郵件部分會被刪除。(如果郵件中只有此部分,則以單一空白文字部分替換。) 

RELABEL

RELABEL=1 會將 MIME 標籤重新標示為由輸出參數指定的任何內容。Relabel=0 不執行任何動作。通常會對標示錯誤的部分進行重新標示 (例如:從 Content-type: application/octet-streamContent-type: application/msword) ,從而讓使用者可以「連按兩下」來開啟某個部分,而無需將此部分先儲存為一個檔案,然後再透過某個程式開啟它。

SERVICE-COMMAND

SERVICE-COMMAND=command 會執行站點提供的程序,該程序將對整個 MIME 郵 件 (MIME 標頭與內容內文部分) 運作。此外,不同於其他 CHARSET-CONVERSION 作業或轉換通道作業,service-command 會執行自己的 MIME 分解、解碼、重新編碼及重新組合。請注意,此旗標會導致在 conversion 通道處理期間忽略某個項目;而在字元集轉換處理期間則執行 SERVICE-COMMAND 項目。使用 / 而非 \ 指定路徑。例如:command="D:/tmp/mybat.bat"

資訊傳送參數 (用於將資訊傳送至站點提供的程式以及從站點提供的程式傳送資訊)

DPARAMETER-SYMBOL-n

環境變數,其中將儲存 Content-disposition 參數值 (如果有);n = 0, 1, 2,... 執行站點提供的程式之前,會依次從 Content-Disposition: 參數清單中擷取各個 DPARAMETER-SYMBOL-n (n=0 為第一個參數,n=2 為第二個參數,以此類推),並放置到指定的環境變數中。

PARAMETER-SYMBOL-n

環境變數,其中將儲存 Content-Type 參數值 (如果有);n = 0, 1, 2,... 執行站點提供的程式之前,會依次從 Content-Type 參數清單中擷取各個 PARAMETER-SYMBOL-n (n=0 為第一個參數,n=2 為第二個參數,以此類推),並放置到具有相同名稱的環境變數中。將 MIME 參數要轉換成的變數名稱用做引數,必須匹配 IN-PARAMETER-NAME-n 陳述式。

MESSAGE-HEADER-FILE

將郵件的原始標頭全部寫入、部分寫入或全不寫入由環境變數 MESSAGE_HEADERS 指定的檔案。如果設定為 1,直接含括內文部分的原始標頭會被寫入由環境變數 MESSAGE_HEADERS 指定的檔案。如果設定為 2,郵件的原始標頭會作為一個整體 (最外層的郵件標頭) 寫入檔案。

ORIGINAL-HEADER-FILE

0 或 1。如果設定為 1,含括 MESSAGE/RFC822 的部分 (不只是內文部分) 的原始標頭會被寫入由環境變數 ORIGINAL_HEADERS 指定的檔案

OVERRIDE-HEADER-FILE

0 或 1。如果設定為 1,conversion 通道會從環境變數 OUTPUT_HEADERS 中讀取 MIME 標頭行,以置換含括 MIME 的部分中的原始標頭行。

OVERRIDE-OPTION-FILE

如果 OVERRIDE-OPTION-FILE=1,conversion 通道會從環境變數 OUTPUT_OPTIONS 中讀取選項。

PART-NUMBER

帶點整數:a. b. c... MIME 內文部分的文件號碼。

自動偵測阿拉伯語字元集

增加了新的 auto_ef 程式以自動偵測阿拉伯語字元集。

可以從 conversion 通道呼叫 auto_ef 程式,以自動偵測並標記大多數未標記或未正確標記的採用阿拉伯語字元集的文字郵件。這些未標記或錯誤標記的郵件通常是從使用阿拉伯語的 Yahoo 或 Hotmail 傳送來的。

沒有正確的字元集標記,許多郵件用戶端便無法正確顯示這些郵件。

如果郵件包含 MIME 內容類型標頭,則 auto_ef 程式將僅檢查和處理這些包含文字/一般內容類型的郵件。如果郵件未標記有 MIME 內容類型標頭,則 auto_ef 將無條件地增加文字/一般內容類型。

若要啟動或啟用此程式,您必須:

Procedure自動偵測阿拉伯語字元集

步驟
  1. 編輯 msg_svr_base/config 目錄中的對映檔案,以為選擇的來源通道和目標通道啟用 conversion 通道。若要為從網際網路進入您本機使用者的所有郵件啟用轉換通道,請將與以下類似的部分加入您的對映檔案:

    CONVERSIONS
    
       IN-CHAN=tcp*;OUT-CHAN=ims-ms;CONVERT YES

    請注意,INOUT 通道取決於您的配置。如果您要在轉送 MTA 上進行部署,則必須修改通道以符合您的配置。例如,

    IN-CHAN=tcp*;OUT-CHAN=tcp*;CONVERT YES

    或者您可以按如下所示為所有通道開啟它:

    IN-CHAN=*;OUT-CHAN=*;CONVERT YES

  2. msg_svr_base/config 目錄中建立轉換檔案,該檔案由目前版本的 Messaging Server 使用者擁有並讀取,包含以下內容:

    !
    in-channel=*; out-channel=*;
      in-type=text; in-subtype=*;
      parameter-copy-0=*; dparameter-copy-0=*;
      original-header-file=1; override-header-file=1;
      command="msg_svr_base
    /lib/arabicdetect.sh"
    !
    
  3. 使用以下指令編譯您的 MTA 配置:

    msg_svr_base/sbin/imsimta cnbuild

  4. 使用以下指令重新啟動:

    msg_svr_base/sbin/imsimta restart

字元集轉換與郵件重新格式化

本節描述由 MTA 在內部執行的字元集、格式化和標籤轉換。請注意,本小節中的一些範例使用的是舊的或已淘汰的技術 (例如 DEC VMS 或者 d 通道)。雖然這些技術是舊的或已淘汰,但這並不是說這些範例是 DEC 或 d 通道特定的。這些範例在描述轉換技術的工作方式時仍然有效。我們將在以後的版次中更新這些範例。

Messaging Server 中一個相當基本的對映表就是字元集轉換表。此表格的名稱是 CHARSET-CONVERSION。它用於指定應執行哪些類型的通道至通道字元集轉換以及郵件重新格式化。

在許多系統中無需執行字元集轉換或郵件重新格式化,因此不需要此表。但在有些情況下,必須執行字元轉換。例如,執行日文 OpenVMS 的站點可能需要在目前網際網路上使用的 DEC Kanji 和 ISO-2022 Kanji 之間進行轉換。當使用的多國字元過多,以至於特定用於 MIME 中的 DEC 多國字元集 (DEC-MCS) 和 ISO-8859-1 字元集之間細微的差異都會成為問題時,可能也會使用轉換,因此可能需要在二者之間進行轉換。

CHARSET-CONVERSION 對映表還可用於變更郵件的格式。有多種工具可用於將大量非 MIME 格式轉換成 MIME。還可以變更 MIME 編碼與結構。如果要將郵件轉送到僅支援 MIME 或特定 MIME 子集的系統時,便需要使用這些選項。此外,在少數情況下,還可將 MIME 轉換成非 MIME 格式。

MTA 探測 CHARSET-CONVERSION 對映表的方式有兩種。第一種探測用於確定 MTA 是否應將郵件重新格式化,如果是,應使用哪些格式化選項。(如未指定重新格式化,MTA 便不會去檢查特定的字元集轉換。)第一種探測的輸入字串一般格式如下:

IN-CHAN=in-channel;OUT-CHAN=out-channel;CONVERT

其中,in-channel 是來源通道 (即傳來郵件的通道) 的名稱,而 out-channel 是目標通道 (即郵件發往的通道) 的名稱。如果存在相符項,則結果字串應為以逗號分隔的關鍵字清單。 表 13–7 列出了這些關鍵字。

表 13–7 CHARSET-CONVERSION 對映表關鍵字

關鍵字 

說明 

Always

即使郵件在發往 out-channel 之前會先通過 conversion 通道,仍然要強制轉換。

Appledouble

將其他 MacMIME 格式轉換成 Appledouble 格式。 

Applesingle

將其他 MacMIME 格式轉換成 Appledouble 格式。 

BASE64

將 MIME 編碼切換成 BASE64。此關鍵字僅適用於已編碼的郵件部分。包含 Content-transfer-encoding: 7BIT 或 8bit 的郵件無需任何特殊的編碼,因而此 BASE64 選項對它們無效。 

Binhex

將其他 MacMIME 格式或包含 Macintosh 類型與 Mac 建立者資訊的部分轉換成 Binhex 格式。 

Block

從 MacMIME 格式部分中只擷取資料分支。 

Bottom

將任一郵件/rfc822 內文部分 (已轉寄的郵件)「轉變」為郵件內容部分與標頭部分。 

Delete

將任一郵件/rfc822 內文部分 (已轉寄的郵件)「轉變」為郵件內容部分,並刪除轉寄的標頭。 

Level

移除郵件中冗餘的多重級別。 

Macbinary

將其他 MacMIME 格式或包含 Macintosh 類型與 Macintosh 建立者資訊的部分轉換成 Macbinary 格式。 

No

停用轉換。 

QUOTED-PRINTABLE

將 MIME 編碼切換成 QUOTED-PRINTABLE。 

Record,Text

文字/一般部分達到 80 個字元時換行。 

Record,Text= n

文字/一般部分達到 n 個字元時換行。 

RFC1154

將郵件轉換成 RFC 1154 格式。 

Top

將任一郵件/rfc822 內文部分 (已轉寄的郵件) 「轉變」為標頭部分與郵件內容部分。 

UUENCODE

將編碼切換成 X-UUENCODE。 

Yes

啟用轉換。 

字元集轉換

如果 MTA 探測並發現將要重新格式化的郵件,則會開始檢查郵件的各個部分。一旦發現任何文字部分,便使用其字元集參數產生第二種探測。僅當 MTA 檢查並發現可能需要進行轉換時,才會執行第二種探測。第二種探測中的輸入字串如下所示:

IN-CHAN=in-channel;OUT-CHAN=out-channel;IN-CHARSET=in-char-set

in-channelout-channel 均如前所述,而 in-char-set 為與特定問題部分關聯的字元集之名稱。如果第二種探測未發現相符項目,則不執行任何字元集轉換 (即使根據第一種探測中的相符關鍵字可以執行郵件重新格式化 [例如,變更 MIME 結構],亦不執行轉換)。如果存在相符項目,則產生以下形式的字串:

OUT-CHARSET=out-char-set

其中,out-char-set 指定 in-char-set 應轉換成的字元集之名稱。請注意,這兩種字元集均必須在字元集定義表 charsets.txt 中定義,該表位於 MTA 表格目錄中。如果此檔案中對該字元集的定義不正確,則不會執行任何轉換。但這通常不是問題,因為此檔案會定義數百種字元集,如今使用的大多數字元集都會在此檔案中定義。請參閱 imsimta chbuild (UNIX 和 NT) 公用程式的說明,以取得有關 charsets.txt 檔案的詳細資訊。

如果符合所有的條件,MTA 將開始建立字元集對映並執行轉換。轉換後的郵件部分會使用其轉換成的字元集名稱重新標示。

字元集轉換對映已進行了延伸,以提供數種其他功能:


範例 13–2 將 ISO-8859-1 和 UTF-8 互相轉換

假設在本機上使用 ISO-8859-1,但是在網際網路上使用時需要轉換為 UTF-8。具體來說,假定透過 tcp_localtcp_internal 連線網際網路,並且內部郵件在 ims-ms 中發出並被傳送。如下所示的 CHARSET-CONVERSION 表顯示了此類轉換。請注意,每個 IN-CHAN 項目都必須處於單個行中。使用反斜線 (\) 來把各行分開。


CHARSET-CONVERSION

 IN-CHAN=tcp_internal;OUT-CHAN=tcp_local;CONVERT               Yes
 IN-CHAN=tcp_local;OUT-CHAN=tcp_internal;CONVERT               Yes
 IN-CHAN=tcp_local;OUT-CHAN=ims-ms;CONVERT                     Yes
 IN-CHAN=*;OUT-CHAN=*;CONVERT                                  No
 IN-CHAN=tcp_internal;OUT-CHAN=tcp_local;IN-CHARSET=ISO-8859-1 OUT-CHARSET=UTF-8
 IN-CHAN=tcp_local;OUT-CHAN=tcp_internal;IN-CHARSET=UTF-8 OUT-CHARSET=ISO-8859-1
 IN-CHAN=tcp_local;OUT-CHAN=ims-ms;IN-CHARSET=UTF-8       OUT-CHARSET=ISO-8859-1


範例 13–3 EUC-JP 與 ISO-2022-JP 之間的相互轉換

如下所示的 CHARSET-CONVERSION 表指定了 EUC-JP 的本機使用和基於 ISO 2022 的 JP 碼之間的轉換。


CHARSET-CONVERSION

  IN-CHAN=ims-ms;OUT-CHAN=ims-ms;CONVERT                  No
  IN-CHAN=tcp_internal;OUT-CHAN=ims-ms;CONVERT            No
  IN-CHAN=tcp_internal;OUT-CHAN=tcp_internal;CONVERT      No
  IN-CHAN=tcp_internal;OUT-CHAN=*;CONVERT                 Yes
  IN-CHAN=*;OUT-CHAN=ims-ms;CONVERT                       Yes
  IN-CHAN=*;OUT-CHAN=tcp_internal;CONVERT                 Yes
  IN-CHAN=tcp_internal;OUT-CHAN=*;IN-CHARSET=EUC-JP      OUT-CHARSET=ISO-2022-JP
  IN-CHAN=*;OUT-CHAN=ims-ms;IN-CHARSET=ISO-2022-JP        OUT-CHARSET=EUC-JP
  IN-CHAN=*;OUT-CHAN=tcp_internal;IN-CHARSET=ISO-2022-JP  OUT-CHARSET=EUC-JP

郵件重新格式化

如上所述,CHARSET-CONVERSION 對映表還用於實現 MIME 附件與數種專用郵件格式附件之間的轉換。

以下各小節會舉例說明可以透過 CHARSET-CONVERSION 對映表實現的其他一些類型的郵件重新格式化。

非 MIME 二進位附件轉換

如果為與處理郵件相關的任一通道啟用 CHARSET-CONVERSION 時,使用某種非標準 (非 MIME) 格式的郵件 (例如,使用特定專用格式的郵件或來自 Microsoft Mail [MSMAIL] SMTP 閘道的郵件) 會自動轉換成 MIME 格式。如果有 tcp_local 通道,則通常是指來自 Microsoft Mail SMTP 閘道的郵件之內送通道,而以下參數會對傳送至本機使用者的郵件啟用轉換:

CHARSET-CONVERSION  

  IN-CHAN=tcp_local;OUT-CHAN=ims-ms;CONVERT         Yes

您可能還想新增通道項目至其他本機郵件系統。例如,tcp_internal 通道的項目:

CHARSET-CONVERSION

  IN-CHAN=tcp_local;OUT-CHAN=l;CONVERT              Yes
  IN-CHAN=tcp_local;OUT-CHAN=tcp_internal;CONVERT   Yes

或者,若要涵蓋所有的通道,只需指定 OUT-CHAN=* 而非 OUT-CHAN=ims-ms 即可。但是,這樣可能會造成郵件處理耗用時間增加,因為,進入 tcp_local 通道的所有郵件都會被詳細檢查,而不是只檢查那些連結至特定通道的郵件。

更重要的是,這種不加區分的轉換可能會使系統難以確定僅僅是通過系統的轉換郵件 (不一定屬於您自己的網站) 之位置。在這種情況下,只需進行傳輸,而不必進行任何變更 (除變更郵件訊息封和相關傳輸資訊)。

若要將 MIME 轉換成 Microsoft Mail SMTP 閘道可以識別的格式,請在 MTA 配置中對 Microsoft Mail SMTP 閘道使用單獨的通道,例如 tcp_msmail,並在 mappings. 檔案中加入以下內容:

CHARSET-CONVERSION  

  IN-CHAN=*;OUT-CHAN=tcp_msmail;CONVERT        RFC1154

重新標示 MIME 標頭

某些使用者代理程式或閘道可以傳送包含 MIME 標頭的郵件,這些標頭中所帶的資訊可能比它們能帶的資訊少,但足以建構更精確 MIME 標頭。儘管最好的解決方案是正確配置這類使用者代理程式或閘道,但如果它們不屬於您控制,您可以要求 MTA 嘗試重新建構更有用的 MIME 標頭。

如果 CHARSET-CONVERSION 對映表的第一種探測產生 YesAlways 關鍵字,則 MTA 將檢查 conversions 檔案是否存在。如果 conversions 檔案存在,則 MTA 會從中尋找包含 RELABEL=1 的項目,如果找到此項目,MTA 將執行該項目中指定的任一 MIME 重新標示。請參閱控制轉換處理,以取得有關 conversions 檔案項目的資訊。

例如,CHARSET-CONVERSION 表,如:


CHARSET-CONVERSION  

  IN-CHAN=tcp_local;OUT-CHAN=tcp_internal;CONVERT            Yes

與 MTA conversion 檔案項目


out-chan=ims-ms; in-type=application; in-subtype=octet-stream; 
  in-parameter-name-0=name; in-parameter-value-0=*.ps; 
  out-type=application; out-subtype=postscript;   
  parameter-copy-0=*; relabel=1 

out-chan=ims-ms; in-type=application; in-subtype=octet-stream; 
  in-parameter-name-0=name; in-parameter-value-0=*.msw; 
  out-type=application; out-subtype=msword; 
     parameter-copy-0=* relabel=1

的組合會使送達 tcp_local 通道並路由至 ims-ms 通道的郵件 (最初送達時包含 MIME 標示 application/octet-stream,但檔案名稱參數帶有副檔名 psmsw),被分別重新標示為 application/postscript 或application/msword。(請注意,這種更精確的標示是原始使用者代理程式或閘道應自行執行的。)此種重新標示與 MIME-CONTENT-TYPES-TO-MR 對映表一同使用時特別有用,可用於將此種結果 MIME 類型轉換回相應的 MRTYPE 標記,這需要精確的 MIME 標示以進行最佳化的作業﹔如果所有的內容類型都僅標示為 application/octet-stream,則 MIME-CONTENT-TYPES-TO-MR 對映表最多僅能無條件地將所有此種類型轉換為 MRTYPE 一種類型。

透過以上範例和 MIME-CONTENT-TYPES-TO-MR 對映表項目,包含

APPLICATION/POSTSCRIPT        PS 
APPLICATION/MSWORD              MW

例如,進來的標示

Content-type: application/octet-stream; name=stuff.ps

將被重新標示為

Content-type: application/postscript

然後再被轉換為 MRTYPE 標記 PS,以通知 Message Router 預期 PostScript。

有時,從相反的方向執行重新標示會很有用,即將特定的 MIME 附件標示「降級」 為 application/octet-stream (用於通用二進位資料的標示)。具體來說,「降級」的特定 MIME 標示通常與 mime_to_x400 通道 (PMDF-X400) 或 xapi_local 通道 (PMDF-MB400) 上的 convert_octet_stream 通道關鍵字一同使用,以強制將所有二進位 MIME 附件轉換為 X.400 bodypart 14 格式。

例如,CHARSET-CONVERSION 表,如:

CHARSET-CONVERSION

    IN-CHAN=*;OUT-CHAN=mime_to_x400*;CONVERT Yes

與 PMDF 轉換檔案項目

out-chan=mime_to_x400*; in-type=application; in-subtype=*;
   out-type=application; out-subtype=octet-stream; relabel=1
 
out-chan=mime_to_x400*; in-type=audio; in-subtype=*; 
   out-type=application; out-subtype=octet-stream; relabel=1 

out-chan=mime_to_x400*; in-type=image; in-subtype=*; 
   out-type=application; out-subtype=octet-stream; relabel=1 

out-chan=mime_to_x400*; in-type=video; in-subtype=*; 
   out-type=application; out-subtype=octet-stream; relabel=1

的組合將使發往 mime_to_x400* 通道的所有郵件的各種特定 MIME 附件標示「降級」為通用 application/octet-stream 標示 (以套用 convert_octet_stream)。

MacMIME 格式轉換

檔案包含兩個部分:一是包含特定資訊的資源分支,一是包含適用於其他平台的資料之資料分支。這使得 Macintosh 檔案的傳輸更為複雜,因為傳輸 Macintosh 檔案部分時通常需要使用四種不同的格式。其中 Applesingle、Binhex 以及 Macbinary 這三種格式都包含 Macintosh 資源分支與 Macintosh 資料分支的合併編碼。第四種格式 Appledouble 則是包含資源分支與資料分支兩個單獨部分的多重格式。因此 Appledouble 通常是最適用於非 Macintosh 平台的格式,因為在這種情況下,資源分支部分可以被忽略,而資料分支部分可供非 Macintosh 應用程式使用。但是,在特別針對 Macintosh 傳送時,可以使用其他格式。

MTA 可以在以上多種格式之間進行 Macintosh 轉換。CHARSET-CONVERSION 關鍵字 AppledoubleApplesingleBinhexMacbinary 會告知 MTA 將其他 MacMIME 結構化部分分別轉換成 multipart/appledouble、application/applefile、application/mac-binhex40 或 application/macbinary 等 MIME 結構。此外,BinhexMacbinary 關鍵字也會請求轉換成指定格式的非 MacMIME 格式部分,而其 MIME Content-type: 標頭中仍包含 X-MAC-TYPEX-MAC-CREATOR 參數。CHARSET-CONVERSION 關鍵字 Block 告知 MTA 從 MacMIME 格式部分中只擷取資料衍生,捨棄資源衍生 (由於這樣會遺失資訊,因此通常最好使用 Appledouble)。

例如,以下 CHARSET-CONVERSION 表將會在傳送到 VMS MAIL 電子信箱或 GroupWise 郵局時告知 MTA 轉換成 Appledouble 格式,以及在傳送到 Message Router 通道時轉換成 Macbinary 格式:

CHARSET-CONVERSION
   IN-CHAN=*;OUT-CHAN=l;CONVERT              Appledouble 
   IN-CHAN=*;OUT-CHAN=wpo_local;CONVERT      Appledouble 
   IN-CHAN=*;OUT-CHAN=tcp_internal;CONVERT   Macbinary

轉換至 Appledouble 格式僅適用於已使用 MacMIME 格式之一的部分。轉換至 Macbinary 格式僅適用於已是 MacMIME 格式之一的部分,或者 MIME Content-type: 標頭上包含 X-MAC-TYPE 和 X-MAC-CREATOR 參數的非 MacMIME 的 參數。

轉換至 Appledouble 或 Block 格式時,可以使用 MAC-TO-MIME-CONTENT-TYPES 對映表指示對 Appledouble 部分或 Block 部分的資料衍生應放置何種特定的 MIME 標籤,具體取決於原始 Macintosh 檔案中包含的是何種 Macintosh 建立者與 Macintosh 類型資訊。此表的探測形式為:format|type|creator|filename,其中,format 是指 SINGLE、BINHEX 或 MACBINARY 三者之一;type 與 creator 分別指十六進位形式的 Macintosh 類型與 Macintosh 建立者資訊;filename 指檔案名稱。

例如,傳送至 ims-ms 通道時若要轉換成 Appledouble,並且在這樣做時若要對轉換自 MACBINARY 或 BINHEX 部分的任何 MS Word 或 PostScript 文件使用特定 MIME 標籤,對應的表格可以是:


CHARSET-CONVERSION 

  IN-CHAN=*;OUT-CHAN=ims-ms;CONVERT     Appledouble


MAC-TO-MIME-CONTENT-TYPES 

! PostScript 
    MACBINARY|45505346|76677264|*     APPLICATION/POSTSCRIPT$Y 
    BINHEX|45505346|76677264|*        APPLICATION/POSTSCRIPT$Y 
! Microsoft Word 
    MACBINARY|5744424E|4D535744|*     APPLICATION/MSWORD$Y 
    BINHEX|5744424E|4D535744|*        APPLICATION/MSWORD$Y

請注意,對映項目的範本 (右側) 必須設定有 $Y 旗標以執行指定標示。附加附件類型的範例項目位於 MTA 表格目錄的 mac_mappings.sample 檔案中。

如果要將非 MacMIME 格式部分轉換成 Binhex 或 Macbinary 格式,則此類部分必須提供 X-MAC-TYPE 和 X-MAC-CREATOR MIME Content-type: 參數值。請注意,MIME 重新標示可用於將此類參數強制加入原本未包含它們的部分。

服務轉換

MTA 的轉換服務功能可用於透過站點提供的程序處理郵件,以便產生新的郵件形式。它既不同於以上說明的 CHARSET-CONVERSION 作業類型,又不同於 conversion 通道,這兩者均針對個別 MIME 郵件部分內容進行作業,而轉換服務是針對整個 MIME 郵件部分 (MIME 標頭與內容) 以及整個 MIME 郵件進行作業。此外,不同於其他 CHARSET-CONVERSION 作業或 conversion 通道作業,轉換服務會執行自己的 MIME 分解、解碼、重新編碼及重新組合。

如同其他 CHARSET-CONVERSION 作業一樣,轉換服務可以透過 CHARSET-CONVERSION 對映表啟用。如果 CHARSET-CONVESION 對映表的第一種探測產生 YesAlways 關鍵字,則 MTA 將檢查 conversions 檔案是否存在。如果 conversions 檔案存在,則 MTA 會從中尋找用於指定 SERVICE-COMMAND 的項目,如果找到此類項目,則執行該項目。conversions 檔案項目形式如下:


in-chan=channel-pattern; 
  in-type=type-pattern; in-subtype=subtype-pattern; 
  service-command=command

重點在於指令字串。這是執行服務轉換時應執行的指令 (例如呼叫文件轉換程式)。該指令必須處理包含要服務之郵件文字的輸入檔案,並產生包含新郵件文字的輸出檔案。在 UNIX 中,指令如果成功,則顯示 0 並結束,否則顯示非零值。

例如,CHARSET-CONVERSION 表,如

CHARSET-CONVERSION

IN-CHAN=bsout_*;OUT-CHAN=*;CONVERT Yes

和 UNIX 上的 MTA conversions 檔案項目


in-chan=bsout_*; in-type=*; in-subtype=*; 
service-command="/pmdf/bin/compress.sh compress $INPUT_FILE $OUTPUT_FILE"

的組合將導致來自 BSOUT 通道的所有郵件被壓縮。

環境變數用於轉送輸入檔案與輸出檔案的名稱,以及包含郵件訊息封收件者位址清單的檔案之名稱。這些環境變數的名稱如下:

可使用標準指令行替換將這三種環境變數的值替換到指令行中:即在 UNIX 中於變數名稱前放置字元。例如,如果 INPUT_FILEOUTPUT_FILE 的值分別為 a.in 和 a.out,則 UNIX 上的以下宣告:


in-chan=bsout_*; in-type=*; in-subtype=*; 
 service-command="/pmdf/bin/convert.sh $INPUT_FILE $OUTPUT_FILE"

將執行指令

/pmdf/bin/convert.sh a.in a.out