本节介绍由 MTA 在内部执行的字符集转换、格式化转换和标记转换。请注意,本节中的某些示例涉及已过时或已作废的技术(例如 DEC VMS 或 d 通道)。虽然这些技术已过时或已作废,但这些涉及 DEC 或 d 通道的示例仍具普遍意义。这些示例对于说明转换技术的工作原理仍然有效。我们将在以后的版本中更新这些示例。
字符集转换表是 Messaging Server 中一个非常基本的映射表。此表的名称为 CHARSET-CONVERSION。它用于指定所应进行的通道之间字符集转换的类型以及邮件重新格式化的类型。
在很多系统中,无需进行字符集转换或邮件重新格式化,因此无需使用此表。但是在某些情况下必须进行字符转换。例如,运行日文 OpenVMS 的站点可能就需要在 DEC Kanji 与在 Internet 上普遍使用的 ISO-2022 Kanji 之间进行转换。另外,大量使用多个国家的文字时也可能需要使用转换,因为在这种情况下,DEC 多国字符集 (DEC-MCS) 和指定用于 MIME 的 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 格式转换为 Applesingle 格式。 |
BASE64 | 将 MIME 编码转换为 BASE64。此关键字仅应用于已经编码的邮件部分。使用内容传送编码7BIT 或 8bit 的邮件不需要任何特殊编码,因此该 BASE64 选项对这些邮件无效。 |
Binhex | 将其他 MacMIME 格式(或包含 Macintosh 类型和 Mac 生成器信息的部分)转换为 Binhex 格式。 |
Block | 仅从 MacMIME 格式部分提取数据分叉。 |
Bottom | 将所有 message/rfc822 主体部分(转发的邮件)“转变”为邮件内容部分和标题部分。 |
Delete | 将所有 message/rfc822 主体部分(转发的邮件)“转变”为邮件内容部分,删除转发的标题。 |
Level | 从邮件中删除冗余的多部分级别。 |
Macbinary | 将其他 MacMIME 格式(或包含 Macintosh 类型和 Macintosh 生成器信息的部分)转换为 Macbinary 格式。 |
No | 禁用转换。 |
QUOTED-PRINTABLE | 将 MIME 编码转换为 QUOTED-PRINTABLE。 |
Record,Text | 按每行 80 个字符对文本/纯文本部分进行自动换行。 |
Record,Text= n | 按每行 n 个字符对文本/纯文本部分进行自动换行。 |
RFC1154 | 将邮件转换为 RFC 1154 格式。 |
Top | 将所有 message/rfc822 主体部分(转发的邮件)“转变”为标题部分和邮件内容部分。 |
UUENCODE | 将 MIME 编码转换为 X-UUENCODE。 |
Yes | 启用转换。 |
字符集转换
如果 MTA 探测并发现要对邮件重新格式化,它将接下去检查邮件的每个部分。如果找到任意文本部分,其字符集参数将被用于生成第二次探测。仅当 MTA 已经检查并发现可能需要转换时,才执行第二次探测。第二次探测中的输入字符串外观如下:
IN-CHAN=in-channel;OUT-CHAN=out-channel;IN-CHARSET=in-char-set
in-channel 和 out-channel 如上所述,in-char-set 是与前面提到的特定部分相关联的字符集的名称。如果第二次探测未出现匹配,将不执行字符集转换(尽管可能会根据第一次探测中匹配的关键字执行邮件的重新格式化 [例如,对 MIME 结构的更改])。如果出现匹配,将生成以下格式的字符串:
OUT-CHARSET=out-char-set
其中 out-char-set 指定应将 in-char-set 转换成的字符集的名称。请注意,这两个字符集都必须在位于 MTA 表格目录中的字符集定义表 charsets.txt 中进行定义。如果该文件中未对字符集进行正确定义,将不进行转换。这通常不成问题,因为该文件定义了几百个字符集;目前使用的大多数字符集在该文件中都有定义。有关 charsets.txt 文件的详细信息,请参见 imsimta chbuild(UNIX 和 NT)实用程序的说明。
如果满足所有条件,MTA 接下去将建立字符集映射并进行转换。将使用邮件部分转换成的字符集的名称对已转换的邮件部分进行重新标记。
字符集转换映射已扩展为可以提供以下几种附加功能:
-
可以在映射条目的输出模板中指定 IN-CHARSET 选项。如果指定此选项,则将覆盖编码词中指定的字符集。
-
可以指定接受整数 0 或 1 的 RELABEL-ONLY 选项。如果此选项的值为 1,则 OUT-CHARSET 只是替换 IN-CHARSET,而不会进行重新标记。
-
如果使用 IN-CHARSET 选项将输入字符集设置为 *,则将“依据”此字符集来确定合适的标签。
示例 13–2 在 ISO-8859-1 和 UTF-8 之间相互转换
假定在本地使用 ISO-8859-1,但需要将此字符集转换为 UTF-8 才能在 Internet 上使用。特别地,假定是通过 tcp_local 连接到 Internet,并且 tcp_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 和基于 JP 代码的 ISO 2022 之间的相互转换。
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 配置中的某个单独通道(例如 tcp_msmail)用于 Microsoft Mail SMTP 网关,然后将以下内容放入映射文件中:
CHARSET-CONVERSION IN-CHAN=*;OUT-CHAN=tcp_msmail;CONVERT RFC1154
重新标记 MIME 标题
某些用户代理或网关可能会发出 MIME 标题只包含很少信息的邮件,但是使用这些信息足以构建更精确的 MIME 标题。尽管最佳解决方案是正确配置这些用户代理或网关,但是如果它们不在您的控制范围之内,您可以要求 MTA 尝试重新构建更有用的 MIME 标题。
如果 CHARSET-CONVERSION 映射表的第一次探测产生了 Yes 或 Always 关键字,则 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,但文件名参数带有扩展名 ps 或 msw,则它们将分别被重新标记为 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 以使邮件路由器知道需要 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 附件标记降级为进入 mime_to_x400* 通道的所有邮件通用的 application/octet-stream 标记(从而可应用 convert_octet_stream)。
MacMIME 格式转换
Macintosh 文件包括两个部分,即包含 Macintosh 专用信息的资源分叉和包含可在其他平台上使用的数据的数据分叉。这使 Macintosh 文件的传输变得更为复杂,因为传输 Macintosh 文件部分有四种不同的常用格式。其中三种格式(Applesingle、Binhex 和 Macbinary)由在一个部分中共同编码的 Macintosh 资源分叉和 Macintosh 数据分叉组成。第四种格式(Appledouble)是多部分的格式,资源分叉和数据分叉位于不同的部分中。因此在非 Macintosh 平台上,Appledouble 可能是最有用的格式,因为在这种情况下可以忽略资源分叉部分,非 Macintosh 应用程序可以使用数据分叉部分。但是专门向 Macintoshe 进行发送时,其他格式可能会非常有用。
MTA 可以在这些不同的 Macintosh 格式之间进行转换。CHARSET-CONVERSION 关键字 Appledouble、Applesingle、Binhex 或 Macbinary 用于通知 MTA 将其他 MacMIME 结构化部分分别转换为 MIME 结构 multipart/appledouble、application/applefile、application/mac-binhex40 或 application/macbinary。此外,如果非 MacMIME 格式部分的 MIME Content-type: 标题中包含 X-MAC-TYPE 和 X-MAC-CREATOR 参数,则 Binhex 或 Macbinary 关键字还可以请求将该部分转换成指定的格式。CHARSET-CONVERSION 关键字 Block 通知 MTA 仅从 MacMIME 格式部分中提取数据部分,放弃资源部分(由于这样做会丢失信息,因此通常最好使用 Appledouble)。
例如,下面的 CHARSET-CONVERSION 表将通知 MTA 在传送到 VMS MAIL 邮箱或 GroupWise 邮局时转换为 Appledouble 格式,在传送到邮件路由器通道时转换为 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,并在转换时将特定的 MIME 标签用于从 MACBINARY 或 BINHEX 部分转换而来的所有 MS Word 或 PostScript 文档,则正确的表会是:
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 映射表的第一次探测产生了 Yes 或 Always 关键字,则 MTA 将检查 conversions 文件是否存在。如果 conversions 文件存在,MTA 将在其中查找指定 SERVICE-COMMAND 的条目,如果找到这样的条目,则予以执行。conversions 文件条目应具有以下格式:
in-chan=channel-pattern; in-type=type-pattern; in-subtype=subtype-pattern; service-command=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 通道的所有邮件均被压缩。
环境变量用于传递输入文件名称、输出文件名称以及包含邮件信封收件人地址列表的文件的名称。这些环境变量的名称如下:
-
INPUT_FILE—要处理的输入文件的名称
-
OUTPUT_FILE—要生成的输出文件的名称
-
INFO_FILE—包含收件人地址的文件的名称
通过使用标准命令行替换可以将这三个环境变量的值替换到命令行中:即在变量名称前加 UNIX 美元字符。例如,如果 INPUT_FILE 和 OUTPUT_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