Sun Java logo     上一页      目录      索引      下一页     

Sun logo
Sun Java System Messaging Server 6 2005Q1 管理指南 

第 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 程序接口控制。

reprocess
process

这两个通道用于延迟邮件处理和脱机邮件处理。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 实用程序的详细信息,请参见 Messaging Server Reference Manual

其他传送程序必须符合以下出口代码和命令行参数限制:

出口代码限制。pipe 通道调用的传送程序必须返回有意义的错误代码,以便通道了解是使邮件出队、传送邮件供日后处理还是返回邮件。

如果子进程使用出口代码 0 (EX_OK) 退出,则认为邮件已成功传送,并将其从 MTA 队列中删除。如果使用出口代码 71、74、75 或 79(EX_OSERREX_IOERREX_TEMPFAILEX_DB)退出,则认为出现临时错误,邮件的传送将被延迟。如果返回其他任何出口代码,邮件将被作为无法传送的邮件返回其创始者。系统标题文件 sysexits.h 中对这些出口代码进行了定义。

命令行参数。传送程序可以具有任意数量的固定参数和变量参数 %s;对于由用户执行的程序,变量参数 %s 代表用户名,对于由邮寄主管 ("inetmail") 执行的程序,变量参数 %s 代表用户名 + 域。例如,以下命令行使用 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(整数)
SLEEP_TIME(整数)

当 MTA 试图传送新邮件时,如果用户的新邮件文件被其他进程锁定,这些选项将提供一种方法,用来控制本地通道程序尝试重试的次数和频率。如果在指定的重试次数之后仍不能打开文件,邮件将保留在本地队列中,下次运行本地通道时将再次尝试传送新邮件。

REPEAT_COUNT 选项控制通道程序在放弃之前尝试打开邮件文件的次数。REPEAT_COUNT 默认值为 30(尝试 30 次)。

SLEEP_TIME 选项控制通道程序在两次尝试之间等待的秒数。SLEEP_TIME 默认值为 2(两次重试之间等待 2 秒)。

SHELL_TIMEOUT(整数)

控制通道等待用户的 shell 命令在 .forward 中完成的时间长度(以秒为单位)。出现这种超时后,邮件将被返回原始发件人,并返回类似“等待用户的 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 目录中的 hold 通道队列。这可以防止作业控制器看到这些邮件,从而“保留”这些邮件。使用 imsimta qm dir -held 命令可以查看 .HELD 文件列表。使用 imsimta qm release 命令可以选择和释放这些邮件。释放邮件时,将其名称更改为 ZZxxx.00,并通知作业控制器。然后,与 hold 通道关联的主程序 reprocess.exe 将处理这些邮件。因此,将使用正常的重写机制处理邮件(以及 To: 地址)。

有关 imsimta qm 命令的详细信息,请参见 Sun Java System Messaging Server Administration Reference。


转换通道

转换通道使您可以对流经 MTA 的指定邮件执行任意的主体部分处理。(请注意,主体部分不同于邮件,邮件可以包含多个主体部分,例如附件中的主体部分。此外,主体部分是由 MIME 标题指定和描述的。)该处理可以由站点提供的任何程序或命令过程进行,并可以进行诸如文本或图像的格式转换、病毒扫描、语言转换等操作。可以选择 MTA 通信的各种邮件类型用于转换,并且可以为每种类型的邮件主体部分指定特定的进程和程序。

使用本章的前提是了解通道的概念(请参见通道)。有关使用转换通道进行病毒扫描的补充信息,请参阅 Messaging Server 文档 Web 站点 http://docs.sun.com/db/coll/S1_MsgTechNotes 底部的 Messaging Server 技术说明。

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


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


本节包含以下几部分:

MIME 概述

转换通道大量使用 MIME(通用 Internet 邮件扩展服务)标题行。您需要了解邮件结构和 MIME 标题字段。有关 MIME 的完整信息,请参阅 RFC 1806、RFC 2045-2049 和 RFC 2183。为方便起见,本文对 MIME 做了简要概述。

邮件结构

简单邮件由标题和主体组成。标题位于邮件的顶部并包含特定的控制信息(例如日期、主题、发件人和收件人)。主体是标题后面第一个空行之后的所有内容。MIME 指定了构建更复杂的邮件的方法,邮件可以包含多个主体部分,甚至主体部分中还可以嵌套主体部分。这样的邮件称作多部分邮件,如前文中所述,转换通道对邮件按主体部分进行处理。

MIME 标题

MIME 规范为主体部分定义了一系列标题行。其中包括 MIME-VersionContent-typeContent-Transfer-EncodingContent-IDContent-disposition。转换通道最经常使用的是 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 标题的格式(带有示例):

type 说明主体部分内容的类型。类型包括 TextMultipartMessageApplicationImageAudioVideo

subtype 进一步说明内容类型。每个 Content-type 都有自己的一组子类型。例如:text/plainapplication/octet-streamimage/jpeg。MIME 邮件的内容子类型是由 IANA(Internet 编号授权机构)指定和列出的。在以下站点可以查看该列表:http://www.isi.edu/in-notes/iana/assignments/media-types/media-types

parameter 特定于各个 Content-type/subtype 对。例如,以下显示了 charsetname 参数:

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 指定)发送到转换通道的。该表的条目具有以下格式:

MTA 处理每个邮件时将探测 CONVERSIONS 映射表(如果存在)。如果 source-channel 是邮件所来自的通道,destination-channel 是邮件将要进入的通道,则执行 CONVERT 之后的操作(Yes 意味着 MTA 将邮件从其 destination-channel 转移到转换通道;如果未发现匹配,邮件将被排入常规目标通道)。


user@conversion.localhostname 格式或 user@conversion 格式的地址将通过转换通道进行路由,而不考虑 CONVERSIONS 映射表。


以下示例将所有非内部邮件(来自 Internet 或发送到 Internet 的邮件)路由到转换通道。

CONVERSIONS

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

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

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

控制转换处理

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

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

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

代码示例 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: 标题和其他标题的信息。然后将从头到尾按顺序扫描转换文件中的条目;将检查存在的所有 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 中的三个转换文件限定参数之后,接下来的两个参数(out-type=applicationout-subtype=msword)指定替换 MIME 标题行,这些标题行将被附加到“已处理”的主体部分。out-type=applicationout-subtype=msword 指定外发邮件的 MIME Content-type/subtypeapplication/msword

请注意,由于 in-typeout-type 参数相同,因此 out-type=application 是不必要的,因为转通道默认为外发主体部分原始的 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 文件,就必须重新编译配置(请参见 Sun Java System Messaging Server Administration Reference 中的 imsimta refresh 命令)。


转换通道信息流程

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

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

最后,转换通道按照输出参数的指定对输出主体部分的标题行进行替换。

使用转换通道环境变量

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

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

以下 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 指定转换通道从 OUTPUT_OPTIONS 环境变量命名的文件中读取转换通道选项。请参见使用转换通道输出选项

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 的邮件转换标记来设置选定的用户。然后,管理员将设置一个转换通道,在处理邮件时,该通道将检测是否存在该标记和 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 中。脚本完成对主体部分的处理后,转换通道将从 OUTPUT_OPTIONS 文件中读取选项。

OUTPUT_OPTION 变量是转换通道从中读取选项的文件的名称。通常,它被用作传递信息的应急临时文件。以下示例显示了一个脚本,该脚本使用输出选项向邮件中带有病毒的发件人返回错误消息。

/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í 行告诉转换通道将文本 Virus found and deleted 添加到邮件中。

178029946 是基于 pmdf_err.h 文件的 PMDF__FORCERETURN 状态,该文件位于 msg_svr_base/include/deprecated/pmdf_err.h 中。此状态代码指示转换通道将邮件返回发件人。(有关使用特殊指令的详细信息,请参见使用转换通道输出退回、删除或保留邮件。)

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

表 13-4 转换通道输出选项

选项

说明

OUTPUT_TYPE

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

OUTPUT_SUBTYPE

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

OUTPUT_DESCRIPTION

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

OUTPUT_DIAGNOSTIC

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

OUTPUT_DISPOSITION

输出邮件部分的 MIME content-disposition

OUTPUT_ENCODING

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

OUTPUT_MODE

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

STATUS

转换器的退出状态。这通常是一个特殊指令,启动由转换通道进行的某些操作。在 msg_svr_base/include/deprecated/pmdf_err.h 中可以查看指令的完整列表。

封闭 MESSAGE/RFC822 部分中的标题

对邮件部分执行转换时,转换通道可以访问封闭 MESSAGE/RFC822 部分中的标题,或者访问邮件标题(如果没有封闭 MESSAGE/RFC822 部分)。标题中的信息对于站点提供的程序可能会很有用。

如果选择了带有 ORIGINAL-HEADER-FILE=1 的条目,则封闭 MESSAGE/RFC822 部分的所有原始标题行都将被写入由 ORIGINAL_HEADERS 环境变量所表示的文件。如果 OVERRIDE-HEADER-FILE=1,则转换通道将读取由 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í; 指定处理后主体部分的 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

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

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

  1. 在相应的转换文件条目中设置 OVERRIDE-OPTION-FILE=1。这将告诉转换通道从 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

我们将使用示例来说明这些指令的功能。

退回邮件

要使用转换通道退回邮件,请在相应的 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

这将请求转换通道将邮件保留为转换通道队列中的 .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'"

自动检测 Arabic 字符集

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

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

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

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

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

  1. 编辑 msg_svr_base/config 目录下的映射文件来启用您所选择的源通道和目标通道的转换通道。要为所有从 Internet 到本地用户的邮件启用转换通道,请在映射文件中增加如下部分:
  2. 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

  3. msg_svr_base/config 目录下创建转换文件,该文件归 Messaging Server 用户所有并可由该用户读取,其内容如下:
  4. !
    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"
    !

  5. 使用如下命令编译 MTA 配置:
  6. msg_svr_base/sbin/imsimta cnbuild

  7. 使用下面的命令重新启动:
  8. msg_svr_base/sbin/imsimta restart

表 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 分解、解码、重新编码和重新组合。请注意,此标志将使条目在转换通道处理期间被忽略;相反,将在字符集转换处理期间执行 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,转换通道将从环境变量 OUTPUT_HEADERS 中读取 MIME 标题行,这将覆盖封闭的 MIME 部分中的原始标题行。

OVERRIDE-OPTION-FILE

如果 OVERRIDE-OPTION-FILE=1,转换通道将从 OUTPUT_OPTIONS 环境变量中读取选项。

PART-NUMBER

以点分隔的整数:a. b. c...MIME 主体部分的编号。


字符集转换和邮件重新格式化

本节介绍由 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 之前先通过转换通道。

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 应转换成的字符集的名称。请注意,这两个字符集都必须在字符集定义表 charsets.txt(位于 MTA 表格目录中)中有所定义。如果该文件中未对字符集进行正确定义,将不进行转换。这通常不成问题,因为该文件定义了几百个字符集;目前使用的大多数字符集在该文件中都有定义。有关 charsets.txt 文件的详细信息,请参见 imsimta chbuild(UNIX 和 NT)实用程序的说明。

如果满足所有条件,MTA 接下去将建立字符集映射并进行转换。将使用邮件部分转换成的字符集的名称对已转换的邮件部分进行重新标记。

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

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

假定在本地使用 ISO-8859-1,但需要将此字符集转换为 UTF-8 才能在 Internet 上使用。而且,假定通过 tcp_localtcp_internalims-ms 与 Internet 相连接,内部邮件源自这些通道并通过其进行传送。以下显示的 CHARSET-CONVERSION 表是以上述假定为前提进行的转换。

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

示例:在 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 网关,然后将以下内容放入 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 转换文件条目

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 结构部分分别转换为 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 表将通知 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 操作或转换通道操作不同,转换服务需要自己进行 MIME 分解、解码、重新编码和重新组合。

与其他 CHARSET-CONVERSION 操作一样,转换服务通过 CHARSET-CONVERSION 映射表启用。如果 CHARSET-CONVESION 映射表的第一个探测产生了 YesAlways 关键字,则 MTA 将检查 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



上一页      目录      索引      下一页     


版权所有 2005 Sun Microsystems, Inc. 保留所有权利。