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

转换通道

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