当前位置: 主页 > 服务器技术 > Mail服务器 > maildrop中文帮助手册

maildrop中文帮助手册

时间:2010-6-30来源:互联网 点击:

to - deliver message to a mailbox
=================================
to - 投递信件到一个邮箱。

 to expression

to语句将信件交付到一个邮箱。expression 的值必须是一个有效的mailbox。一个有效的mailbox或者是一个mailbox,一个maildir,或者一个外部的程序(该程序包括转寄到另一个地址)

to语句是最后的投递语句。maildrop投递邮件,然后产生一个返回码给EXITCODE变量并立即终止。如果当投递信件时有一个错,maildrop将伴随EX_TEMPFAIL退出码终止。一个编写得适当的邮件传送代理MTA应该重排邮件,并在一段时间之后再次尝试投递。

一个以”|”字符开始的expression 指定了一个外部程序来运行处理实际的投递。SHELL变量指定了shell来执行给定的命令。信件被通过标准输入提供给命令。maildrop的退出码将是该进程的退出码。

以一个感叹号”!”开始的 expression 指定了一个空格分隔的E-mail地址列表来将信件转寄出去。被SENDMAIL变量指定的程序被作为一个外部程序来运行,以及一个作为程序参数的 E-mail地址列表。

另外,expression 指定了maildrop将信件投递到的邮箱名。如果expression 是一个目录,maildrop假设目录是一个maildir目录。否则,maildrop将把信件以传统的mailbox格式投递到一个文件。maildrop在投递信件到一个文件时 将使用 点锁 或flock()锁 。

while - repeatedly execute a block of statements
================================================
while - 重复执行一个语句块

while (expression)
{
 …
}

expression被重复地求值。若每次它的求值到一个逻辑真,括号里的语句将被执行。当expression 求值为一个逻辑假的时候,while循环完毕。注意避免无限循环。

xfilter - filter message through another program
================================================
xfilter - 通过其他程序过滤信件

 xfilter expression

expression 指定了一个maildrop运行的过滤当前信件的外部程序。当前信件将被作为标准输入pipe给过滤程序。过滤程序的标准输出替代了当前的信件来被投递。外部程序必须以结束码0终止。如果外部程序没有以结束码0终止,或者如果它没有从标准输入读信件,maildrop将随着一个EX_TEMPFAIL退出码而终止。

|| - logical or
===============
|| - 逻辑或

 expression1 || expression2

如果 expression1 求值为一个逻辑真,|| 的结果是expression1,否则是expression2的求值。

maildrop 使用下列的真/假概念:一个空的文本字面值,或者一个包含单独的字符”0″的文本字面值是一个逻辑假值。任何别的值是逻辑真值。

&& - logical and
================
&& - 逻辑与

 expression1 && expression2

如果expression1 求值为一个逻辑假,&& 的结果是expression1,否则是expression2的求值。

maildrop 使用下列的真/假概念:一个空的文本字面值,或者一个包含单独的字符”0″的文本字面值是一个逻辑假值。任何别的值是逻辑真值。

<, <=, >, >=, ==, != - numerical comparison
=============================================
<, <=, >, >=, ==, != - 数字比较

 expression1 < expression2
 expression1 <= expression2
 expression1 > expression2
 expression1 >= expression2
 expression1 == expression2
 expression1 != expression2
 
这些操作符比较他们的左手表达式和右手表达式。这些操作符作为浮点数比较每一边的数字值,如果数字像所说的那样比较,比较的结果是文本字符串”1″,否则是文本字符串 “0″.

注意: 比较操作不符合结合律:”a<b<c” 是错的。如果必须需要,使用 “(a<b)<c”.

lt, le, gt, ge, eq, ne - text comparison
========================================
lt, le, gt, ge, eq, ne - 文本比较

 expression1 lt expression2
 expression1 le expression2
 expression1 gt expression2
 expression1 ge expression2
 expression1 eq expression2
 expression1 ne expression2

这些操作符比较它们的左手表达式和右手表达式。这些操作符作为文本字符串来比较两边(按字母顺序,虽然文本里可以包括任何东西)。如果文本字符串像所说的那样比较,比较的结果是文本字符串”1″,否则是文本字符串 “0″.


注意: 比较操作不符合结合律:”a lt b lt c” 是错的。如果必须需要,使用 “(a lt b) lt c”.

| - bitwise or
==============
| - 比特或

 expression1 | expression2


这是比特或操作符。它的结果是一个32位的整数,该整数是左手值和右手值的比特或合并体。

& - bitwise and
===============
& - 比特与

 expression1 & expression2


这是比特与操作符。它的结果是一个32位的整数,该整数是左手值和右手值的比特与合并体。

+, -, *, / - numerical operations
=================================
+, -, *, / - 数字操作

 expression1 + expression2
 expression1 - expression2
 expression1 * expression2
 expression1 / expression2

These are numerical, floating point, operators.
这些是数值,浮点数操作符。

=~ /pattern/:options - pattern match against string
===================================================
=~ /pattern/:options - 字符串的模式匹配

 expression =~ /pattern:option

=~的左手值可以是任何表达式。右手值则始终是一个模式指定。该操作符的结果是左手值expression 的模式权重匹配(如果选项没指定任何权重打分,结果只是简单地在模式被发现时为1,没发现时则为0)。

请见”模式” 获取更多信息。

/pattern/:options - pattern match against message
=================================================
/pattern/:options - 信件的模式匹配

 expression =~ /pattern:option

该操作符的结果是当前信件的权重模式匹配(如果选项没有指定权重打分,如果发现了模式结果简单地被设为1,未发现则为0)

See “Patterns” for more information.

!, ~ - logical/bitwise not operator.
====================================
!, ~ - 逻辑/比特 非操作符

 ! expression
 ~ expression

!操作符的结果是它右手表达式的逻辑相反值。如果右手表达式求值为逻辑真,结果是逻辑假。如果它求值为逻辑假,结果为逻辑真。

maildrop 使用下列的真/假概念:一个空的文本字面值,或者一个包含单独的字符”0″的文本字面值是一个逻辑假值。任何别的值是逻辑真值。

~操作符的结果是它右手表达式的比特补码。右手表达式估值为一个32比特的整数,这个操作符的结果是这个值的比特补码。

escape(string) - escape special characters in a string.
=======================================================
escape(string) - 逸出字符串里的特殊字符

 escape(expression)

escape函数返回它唯一的参数以及每一个前面有反斜杠的特殊字符。特殊字符是指任何一个下列的字符:
|!$()[]\+*?.&;`’-~<>^{}”

当匹配模式分段的时候,这能被用到,然后取到一部分然后再匹配一次。比如:

 if ( /^From: *!.*/ )
 {
      MATCH2=escape($MATCH2)
      if ( /^Subject:.*$MATCH2/ )
      {
         …
      }
 }

该例子检验是否From:信头的内容也能够在Subject:信头中被发现。如果不使用escape函数,那么任何From:信头中的特殊字符也将被用在正则表达式中,比如 * 或 + ,将引发不可预知的行为,就像语法错误一样。

为什么这个特殊字符列表也包括那些不能被用在maildrop的正则表达式中的字符的原因是允许maildrop的变量被用在 shell命令的命令行中,这些shell命令被 xfilter 指令或`字符或to或cc指令所执行。

虽然从一个外部数据源使用数据是危险的,并且它可以导致疏忽的exploits,使用escape函数将有望更少导致的古怪问题。

gdbmopen, gdbmclose, gdbmfetch, gdbmstore - GDBM support in maildrop
====================================================================
gdbmopen, gdbmclose, gdbmfetch, gdbmstore - maildrop 对 GDBM 的支持。

这些函数提供了GDBM数据库文件的支持。请见 maildropgdbm(5)来获取更多信息。

注意: 系统管理员能够在maildrop中禁用GDBM支持,所以这些命令对你来说可能不可用。

getaddr(string) - extract RFC 2822 addresses from a header.
===========================================================
getaddr(string) - 从一个信头中萃取 RFC 2822 地址

 if ( /^From: *!.*/ )
 {
      ADDR=getaddr($MATCH2)
 }

该函数通常被应用到一个包含RFC2822地址的信头上。它从信头中抽取出实际的地址,不带任何注释和无关符号。每个地址跟随一个新行符。例如,如果字符串包含:joe@domain.com (Joe Brown), “Alex Smith” <alex@domain.com>, tom@domain.com
getaddr函数的结果是下列字符串:joe@domain.com<NL>alex@domain.com<NL>tom@domain.com<NL>

注意:因为getaddr()宽松地解释RFC2822,在字符串传递给getaddr()之前去掉”To:”或”Cc:”信头是没有必要的。例如,下列代码片段获取信件中所有的地址,并把它们连接成一个以空白分隔的单独字符串。

 ADDRLIST=”"
 foreach /^(To|Cc): .*/
 {
   foreach (getaddr $MATCH) =~ /.+/
   {
        ADDRLIST=”$ADDRLIST $MATCH”
   }
 }

注意:在一定的罕见情况下,RFC2822允许空格被包含在E-mail地址中,所以该例只是作为教学而已。

hasaddr(string) - Search for an address.
========================================

 if ( hasaddr(string) )
 {
    …
 }

“string” 使用user@domain的格式。如果该地址被包含在任何 To:,Cc:,Resent-To:,或Resent-Cc:信头中,hasaddr函数返回1,否则该函数返回0。

这不仅只是一个简单的文本查找。每个信头根据RFC822被解析。信头中发现的地址被抽取出来,忽略掉所有的注释和名字。剩下的地址被检验,并且如果”string”是其中一个的话,hasaddr返回1,否则它返回0。

这个比较是大小写敏感的。这实际上有点违背RFC2822(以及其他),因为地址的用户部分可以是(但不是必需)大小写敏感的。

length (string) - length of a string
====================================

 if (length(string) > 80)
 {
    …
 }
 
length函数返回字符串里的字符数目。

lookup (expr, ‘filename’, ‘options’) - read file for patterns
=============================================================

 if (lookup(expr, file, “option”))
 {
    …
 }


expr是任何表达式。filename是一个包含模式列表的文件的名字。记住filename是相关于当前目录的,当maildrop运行在投递模式下,当前目录一般是用户的home目录。maildrop然后读取文件。空行被忽略,任何以#字符开始的行(注释)也是这样。


先导空格(但不是尾部的空格,注意)被移除,每行剩下的内容被解释为一个模式,用来匹配expr。一当匹配被发现,lookup返回”1″。如果读完整个文件后都没有发现匹配,lookup返回”0″。

if ( /^To: *!.*/ && lookup( $MATCH2, “badto.dat” ))
{
   exit
}

文件 badto.dat 包含下列两行:
friend@public
^[^@]*$
如果一封信件有一个包含文本 “friend@public” 的To:信头,或者一个@字符都不包括,那么信件将被静静地丢弃(maildrop将终止且不投递信件到任何地方)

options 就是用来模式匹配的选项。仅有的支持选项是”D”(在这种情况下,其余选项是无意义的)

注意:要当心这样丢弃信件。模式匹配可能是很诡异的,一个轻微的误算就可能导致邮件非故意地被丢弃。先将该信件投递到一个单独的文件夹或者邮箱会让人满意,一旦过滤被证明正确运行之后,再修改它以使得信件被完全丢弃。

substr(string,start [,count]) - return substring
================================================

 foo=substr($foo, 1, 10)

substr函数从字符串里获取从第start个开始的字符。如果count被指定,从位置start开始的最多count个字符被保持住,任何多余的都被删掉。

time - return current time
==========================

 foo=time

time函数返回以秒计算的自1970.1.1至今的当前时间,这个函数当使用GDBM文件时是有用的。请见maildrop(5)来得到一个使用此time函数的例子。

tolower(string) - Convert string to lowercase.
==============================================

 foo=tolower(string)

该函数返回大写字符被小写字符替换后的 string。

toupper(string) - Convert string to uppercase.
==============================================

 foo=toupper(string)

该函数返回小写字符被大写字符替换后的 string。

#####################################################
Statements
声明

过滤文件被maildrop读取,并且它包含了每行一个过滤指令。被maildrop所以用的过滤语言有一个宽松定义的语法结构。

语句被每个一行地列出来。多个语句可以通过用分号分隔来列出在同一行上。要在下一行继续一个长语句,终止本行的时候加上一个反斜杠符。

#####################################################
BUGS
如果getaddr() 或者 hasaddr() 函数被用在被破坏的信头上,结果是不可预知的。

hasaddr()完全是大小写敏感的。这实际上违背了一些RFC。因为一个地址的用户id部分可能是大小写敏感的,但这种情况不是很多,所以列在这里

站长资讯网
.
分页: [1] [2] [3]
TAG: maildrop 帮助手册
推荐内容最近更新人气排行
关于我们 | 友情链接 | 网址推荐 | 常用资讯 | 网站地图 | RSS | 留言