procmail 脚本使用 Maildir 格式时出错

procmail 脚本使用 Maildir 格式时出错

我在 /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。请注意,电子邮件仍会被发送,但它也会向发送用户返回一个错误代码。

我通过注释掉EXITCODEHOST行暂时解决了这个问题,但我想知道是否有更好的解决方案。

我在网上的多个地方找到了这段代码,但找不到为什么这个错误会再次出现。当我向本地用户发送电子邮件时,似乎会发生这种情况。有时用户有一个.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

谢谢您的帮助。

相关内容