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

用于通过站点提供的程序或脚本执行传送。pipe 通道执行的命令由管理员通过 imsimta 程序接口控制。 

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 通道使用站点提供的基于用户的程序执行邮件传送。

为了便于程序传送,必须首先将程序注册为能够通过 pipe 通道调用。可以使用 imsimta program 实用程序完成此操作。该实用程序为每个命令(注册为能够通过 pipe 通道调用)赋予唯一的名称。然后最终用户可以将方法名称指定为其 mailprogramdeliveryinfo LDAP 属性的值。

例如,要将 UNIX 命令 myprocmail 添加为用户可以调用的程序,应该首先使用 imsimta program 实用程序注册该命令,如以下示例所示。此示例注册了称作 myprocmail 的程序,该程序以用户身份执行带有参数 -d usernameprocmail 程序:

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

请确保可执行程序存在于 programs 目录 msg_svr_base/data/site-programs 中。还要确保将执行权限设置为“其他”。

要使用户能够访问程序,用户的 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。对于由用户执行的程序,该变量参数代表用户名;对于由邮寄主管 ("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 (integer)
SLEEP_TIME (integer)

当 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 命令进行传送时本地通道创建临时文件的位置。默认情况下,这种临时文件是在用户的主目录中创建的。使用此选项,管理员可以选择在其他(单个)目录中创建临时文件。例如: 

SHELL_TMPDIR=/tmp

使用 Hold 通道临时保留邮件

hold 通道用于保留暂时无法接收新邮件的收件人的邮件。邮件被保留可能是由于正在更改用户名,或者由于正在将用户的邮箱从一个邮件主机或域移动到另一个邮件主机或域。可能还有其他原因要临时保留邮件。

保留邮件时,这些邮件将被定位到 msg_svr_base/queue/hold 目录中的 hold 通道,使用的机制与将邮件定位到 reprocess 通道时所使用的机制相同。使用这种方法,将不更改信封 To: 地址。邮件将作为 ZZxxx.HELD 文件写入到 msg-server/queue/hold directory 目录中的 hold 通道队列。这可以防止作业控制器找到这些邮件,从而“保留”这些邮件。使用 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 文档 Web 站点 http://docs.sun.com/db/coll/S1_MsgTechNotes 底部的当前版本 Messaging Server 技术说明。

转换通道的实现由以下部分组成:A) 选择邮件通信用于处理,B) 指定处理不同邮件的方式。将对这些过程作进一步详细介绍。


注 –

MTA 配置文件 (imta.cnf) 中将自动创建默认的 conversion 通道。此通道可以原样使用,无需修改。


本节包含以下几个部分:

MIME 概述

转换通道大量使用 MIME(通用 Internet 邮件扩展服务)标题行。您需要了解邮件结构和 MIME 标题字段。有关 MIME 的完整信息,请参见 RFC 1806、2045 至 2049 和 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 说明主体部分内容的类型。类型包括 TextMultipartMessageApplicationImage AudioVideo 等。

subtype 进一步说明内容类型。每个 Content-type 都有自己的一组子类型。例如:text/plainapplication/octet-streamimage/jpeg。MIME 邮件的内容子类型是由 IANA(Internet 编号授权机构)指定和列出的。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.localhostname 格式或 user@conversion 格式的地址将通过 conversion 通道进行路由,而不考虑 CONVERSIONS 映射表。


在以下示例中,将所有非内部邮件(来自或发送到 Internet 的邮件)都路由到 conversion 通道。

CONVERSIONS

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

第一行指定将处理来自 tcp_local 通道的邮件。第二行指定也将处理进入 tcp_local 通道的邮件。tcp_local 通道处理进入和来自 Internet 的所有邮件。由于默认设置是不经过 conversion 通道,因此任何其他邮件都将不经过 conversion 通道。

请注意,这是一个非常基本的表,对于具有更多自定义配置的站点(例如,使用多个出站到 Internet 的 tcp_* 通道的站点,或使用多个从 Internet 入站的 tcp_* 通道的站点)可能不够用。

控制转换处理

当邮件被发送到转换通道时,将按主体部分对其进行处理。处理是由 MTA conversions 文件控制的,该文件由 imta_tailor 文件中的 IMTA_CONVERSION_FILE 选项指定(默认设置:msg_svr_base/conversions)。conversions 文件由以行分隔的条目组成,这些条目控制要处理的主体部分的类型和处理方式。

每个条目由一个或多个行组成,行中包含一个或多个 name=value 参数子句。参数子句中的值符合 MIME 约定。除最后一行外,每一行必须以分号 (;) 结尾。此文件中的一个物理行最多可包含 252 个字符。可以使用反斜杠 (\\) 继续字符将一个逻辑行分为多个物理行。将通过不以分号结束的行、一个或多个空行或者两者的结合来终止条目。

以下是 conversion 文件条目的简单示例:


示例 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/subtype 必须为 application/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 字段提供。


DELETE=1 替换 command 参数即可删除邮件部分,而不是对主体部分执行命令。


注 –

只要修改了 conversions 文件,就必须重新编译配置(请参见编译 MTA 配置)。


转换通道信息流程

信息的流程如下:包含主体部分的邮件进入转换通道。转换通道分析邮件,并逐一处理各部分。然后 conversion 通道对主体部分进行限定,即通过将主体部分的 MIME 标题行与限定参数进行比较来确定是否对其进行处理。如果主体部分合格,则开始转换处理。如果要将 MIME 或主体部分信息传递到转换脚本,该信息将存储在由信息传递参数指定的环境变量中(请参见使用转换通道环境变量)。

这时,将对主体部分执行由操作参数指定的操作。通常,该操作为删除主体部分或将其传递给脚本中包含的程序。脚本将处理主体部分,然后将其重新发送给转换通道,以重新组合成处理后的邮件。脚本还可以使用 conversion 通道输出选项将信息发送给 conversion 通道。这些信息可能是要添加到输出主体部分的新的 MIME 标题行、要返回给邮件发件人的错误文本或者指示 MTA 启动某些操作(例如退回、删除或保留邮件)的特殊指令。

最后,conversion 通道将替换由输出参数指定的输出主体部分的标题行。

使用转换通道环境变量

对邮件主体部分进行操作时,在通道和站点提供的程序之间来回传递 MIME 标题行信息(或整个主体部分)通常是很有用的。例如,程序可能需要 Content-typeContent-disposition 标题行信息以及邮件主体部分。通常,站点提供的程序的主要输入部分是从文件读取的邮件主体部分。对主体部分进行处理后,程序需要将其写入一个文件,转换通道可以从该文件中进行读取。这种类型的信息传递是通过使用转换通道环境变量进行的。

可以使用 parameter-symbol-* 参数在 conversions 文件中创建环境变量,或通过使用一组预定义的 conversion 通道环境变量进行创建(请参见使用转换通道输出选项)。

以下 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 属性。这些选项都没有默认属性。

使用转换通道输出选项

conversion 通道输出选项(表 13–4)是动态变量,用于将信息和特殊指令从转换脚本传递到 conversion 通道。例如,在主体部分处理期间,脚本可能要发送一个特殊指令,要求转换通道退回邮件,并向返回的邮件添加错误文本,说明邮件中带有病毒。

输出选项是通过在所需的转换条目中设置 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 是基于 pmdf_err.h 文件的 PMDF__FORCERETURN 状态,该文件位于 msg_svr_base/include/deprecated/pmdf_err.h 中。此状态代码指示转换通道将邮件返回发件人。(有关使用特殊指令的更多信息,请参阅使用转换通道输出退回、删除或保留邮件

以下显示了输出选项的完整列表。

表 13–4 Conversion 通道输出选项

选项 

说明 

OUTPUT_TYPE

输出邮件部分的 MIME 内容类型。 

OUTPUT_SUBTYPE

输出邮件部分的 MIME 内容子类型。 

OUTPUT_DESCRIPTION

输出邮件部分的 MIME 内容说明。 

OUTPUT_DIAGNOSTIC

转换通道强制退回邮件时,作为发送给发件人的邮件的一部分的文本。 

OUTPUT_DISPOSITION

输出邮件部分的 MIME content-disposition

OUTPUT_ENCODING

在输出邮件部分中使用的 MIME 内容传送编码

OUTPUT_MODE

conversion 通道编写输出邮件部分所用的 MIME 模式,因此也是收件人读取输出邮件部分使用的模式。

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)发送所有附件,不管附件是属于 postscriptmswordtext 还其他任何类型,上述功能对于重命名客户端发送的附件很有用。这是重新标记邮件部分,以便其他客户机(例如 Outlook)能够通过读取扩展名来打开邮件部分的普通方法。

从映射表检索参数值的语法如下:

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

$Y 将返回一个参数值。如果未找到匹配,或者匹配返回 $N,将忽略转换文件条目中的此参数,或将其看作空字符串。缺少匹配或返回 $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=* 指定要处理的邮件必须来自 content-type 标题为 application/* (* 指定任何子类型都可以)的 tcp_local 通道。

in-parameter-name-0=name; in-parameter-value-0=* 进一步指定邮件必须具有参数类型 name=*(同样,* 指定任何参数值都可以。)

out-type=application; 指定邮件处理后的 MIME Content-type 参数为 application

out-subtype=’INPUT-SUBTYPE’; 指定主体部分处理后的 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 映射表中指定的新值。因此,如果参数类型为 msword,则 name 参数将为 temp.DOC

使用转换通道输出退回、删除或保留邮件

本节介绍如何使用转换通道选项退回、删除或保留邮件。基本过程如下:

  1. 在相应的 conversions 文件条目中设置 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

其中 text string 大致为:“The message sent from your machine contained a virus which has been removed. Be careful about executing email attachments.

有条件地删除邮件部分

根据邮件部分所包含的内容有条件地删除邮件部分可能会很有用。可以使用输出选项进行此操作。与之相反,DELETE=1 转换参数子句将无条件删除邮件部分。

要使用输出选项删除邮件部分,请在相应的 conversions 文件条目中设置 OVERRIDE-OPTION-FILE=1,并将以下行添加到转换脚本中:

echo "STATUS=178030178" >> $OUTPUT_OPTIONS

保留邮件

根据邮件包含的内容有条件地保留邮件可能会很有用。要使用输出选项删除邮件部分,请在相应的 conversions 文件条目中设置 OVERRIDE-OPTION-FILE=1,并将以下行添加到转换脚本中:

echo "STATUS=178030250" >> $OUTPUT_OPTIONS

这将请求 conversion 通道在 conversion 通道队列中将邮件保留为 .HELD 文件。

转换通道示例

以下示例中所示的 CONVERSIONS 映射和一组转换规则使 GIF、JPEG 和 BITMAP 文件被发送到假设的通道 tcp_docuprint 中,并被自动转换为 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

OUT-PARAMETER-NAME-n 相对应的输出 MIME Content-Type 参数值。

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

OUT-DPARAMETER-NAME-n 相对应的输出 MIME Content-Disposition 参数值。

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 主体部分的编号。

自动检测 Arabic 字符集

为自动检测 Arabic 字符集,新增了 auto_ef 程序。

您可以从 conversion 通道调用 auto_ef 程序来自动检测并标记多数未标记或未正确标记的文本邮件(以 Arabic 字符集显示)。这些未标记或未正确标记的邮件通常是从 Yahoo 或 Hotmail 以 Arabic 语言发送的。

如果没有正确标记字符集,许多邮件客户机就不能正确显示邮件。

如果邮件包含 MIME content-type 标题,则 auto_ef 程序将检测并处理仅具有文本/纯文本内容类型的邮件。如果邮件不是以 MIME content-type 标题标记的,则 auto_ef 将无条件地增加文本/纯文本内容类型。

要激活或启用此程序,必须:

Procedure自动检测 Arabic 字符集

步骤
  1. 编辑 msg_svr_base/config 目录下的映射文件来启用要用于您所选择的源通道和目标通道的 conversion 通道。要为所有从 Internet 到本地用户的邮件启用转换通道,请在映射文件中增加如下部分:

    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 与在 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-channelout-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 接下去将建立字符集映射并进行转换。将使用邮件部分转换成的字符集的名称对已转换的邮件部分进行重新标记。

字符集转换映射已扩展为可以提供以下几种附加功能:


示例 13–2 在 ISO-8859-1 和 UTF-8 之间相互转换

假定在本地使用 ISO-8859-1,但需要将此字符集转换为 UTF-8 才能在 Internet 上使用。特别地,假定是通过 tcp_local 连接到 Internet,并且 tcp_internalims-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 映射表的第一次探测产生了 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 以使邮件路由器知道需要 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 关键字 AppledoubleApplesingleBinhexMacbinary 用于通知 MTA 将其他 MacMIME 结构化部分分别转换为 MIME 结构 multipart/appledouble、application/applefile、application/mac-binhex40 或 application/macbinary。此外,如果非 MacMIME 格式部分的 MIME Content-type: 标题中包含 X-MAC-TYPEX-MAC-CREATOR 参数,则 BinhexMacbinary 关键字还可以请求将该部分转换成指定的格式。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 映射表的第一次探测产生了 YesAlways 关键字,则 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 通道的所有邮件均被压缩。

环境变量用于传递输入文件名称、输出文件名称以及包含邮件信封收件人地址列表的文件的名称。这些环境变量的名称如下:

通过使用标准命令行替换可以将这三个环境变量的值替换到命令行中:即在变量名称前加 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