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

控制轉換處理

當郵件傳送到轉換通道時會被逐個內文部分地進行處理。處理由 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