我在 /etc/procmailrc 中有以下代码:
DROPPRIVS=yes
DEFAULT=$HOME/Maildir/
:0
* ? /usr/bin/test -d $DEFAULT || /bin/mkdir $DEFAULT
{ }
:0 E
{
# Bail out if directory could not be created
EXITCODE=127
HOST=bail.out
}
MAILDIR=$HOME/Maildir/
但是,当目录已经存在时,有时它会发送一封包含此错误的返回电子邮件:554 5.3.0 unknown mailer error 127
。请注意,电子邮件仍会被发送,但它也会向发送用户返回一个错误代码。
我通过注释掉EXITCODE
和HOST
行暂时解决了这个问题,但我想知道是否有更好的解决方案。
我在网上的多个地方找到了这段代码,但找不到为什么这个错误会再次出现。当我向本地用户发送电子邮件时,似乎会发生这种情况。有时用户有一个.forward
文件要发送给其他用户,有时没有,但结果是一样的。我还尝试删除DROPPRIVS
,以防它弄乱了转发,但似乎没有影响。
- 这条线路一开始就出现
* ? /usr/bin/test
问题了吗? - 表示
*
正则表达式,但?
使其返回整数值,对吗? - 匹配的整数是什么?还是只是比较整数返回值?
- 两个块之间需要留有空间吗?
谢谢您的帮助。
答案1
我敢打赌会出现某种竞争条件。将 /usr/bin/test 行包装成一个小的 shell 脚本有关系吗?例如:
* ? /usr/local/bin/make-sure-exists-dir $DEFAULT
使用 make-sure-exists-dir 执行下列操作:
/usr/bin/test -d "$1" || mkdir "$1"
另外,查看 mkdir 的手册页时,-p 不会因存在而出错,因此您可以这样做:
* ? mkdir -p $DEFAULT
答案2
事实上procmail 的 dovecot 说明正是我所寻找的。
# file: /etc/procmailrc
# system-wide settings for procmail
SHELL="/bin/bash"
SENDMAIL="/usr/sbin/sendmail -oi -t"
LOGFILE="/var/log/procmail.log"
DROPPRIVS="yes"
DELIVER="/usr/lib/dovecot/deliver"
# fallback:
DEFAULT="$HOME/Maildir/"
MAILDIR="$HOME/Maildir/"
:0 w
* ^X-Spam-Status: Yes
| $DELIVER -m spam
:0 w
| $DELIVER
谢谢您的帮助。