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

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

本節描述由 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