$[image ,routine,argument ] 格式的替换用于查找并调用用户提供的例程。在 UNIX 上运行时,MTA 使用 dlopen 和 dlsym 动态地装入并调用从共享库映像中指定的例程。则该例程被称为函数,带有以下变量列表:
status := routine (argument, arglength, result, reslength)
argument 和 result 是 252 字节长的字符串缓冲区。在 UNIX 上,argument 和 result 将作为指针传递到字符串(例如,在 C 中,作为 char*),arglength 和 reslength 是由引用传递的有符号型长整数。输入时,argument 包含重写规则模板中的变量字符串,arglength 是该字符串的长度。返回时,结果字符串应放在 result 中,而其长度应放在 reslength 中。然后该结果字符串将替换重写规则模板中的 "$[ image,routine,argument]"。如果重写规则失败则例程将返回 0,如果重写规则成功则例程将返回 -1。
此机制允许重写过程以各种复杂的方式进行扩展。例如,可以执行对某种类型的名称服务的调用并使用调用的结果来按某种方式改变地址。对主机 siroe.com 的正向定位地址(例如 To: 地址)的目录服务查找,可以使用以下重写规则并按如下方式执行。11.6.12 特定于方向和位置的重写规则 ($B, $E, $F, $R)中介绍的 $F 导致此规则仅用于正向定位地址:
siroe.com $F$[LOOKUP_IMAGE,LOOKUP,$U]
正向定位地址 jdoe@siroe.com 与该重写规则匹配时,将导致 LOOKUP_IMAGE(UNIX 上的共享库)被装入内存,并导致例程 LOOKUP 被调用(使用 jdoe 作为变量参数)。然后,例程 LOOKUP 可能会在结果参数中返回一个不同的地址(如 John.Doe%eng.siroe.com)和值 -1,以表示重写规则成功。结果字符串中的百分比符号(请参见11.4.2 重复的重写模板 A%B)John.Doe@eng.siroe.com 将作为要被重写的地址。
在 UNIX 系统上,站点提供的共享库映像应该是全局可读的。