1

短篇故事

我有一个使用 .qmail 文件过滤传入邮件的 PHP 脚本。该脚本运行良好并记录了所有活动,但据我所知,当我的脚本返回应该停止处理更多 .qmail 行的 dot-qmail 退出代码 99 时,不应执行最后一个 .qmail 行。

很长的故事:

我在 Linux 2.6.18-4-686 下使用 Parallels Plesk Panel 版本 9.3.0。

我的 PHP CLI 版本是 5.2.0-8+etch16 (cli)(构建时间:2009 年 11 月 24 日 11:14:47)。

对 Spamassassin、Dr. Web 和 zen.spamhaus.org 及其结果不满意,我决定创建自己的 PHP 脚本来过滤所有传入的邮件。

(对于一些可能认为“这家伙正在重新发明轮子”的人来说:我了解我的客户个人及其具体需求,因此,经过数千次测试,这被证明是最佳选择,因为它避免了黑盒模型和让我以全面的方式控制流程,同时释放服务器资源并为其他很酷的功能打开大门)。

但是我很难在服务器上安装脚本。

qmailfilter 是我的脚本,你可以在http://titanpad.com/1IFDj1jvB0看到它

我将现有的 .qmail 文件编辑/var/qmail/mailnames/customerdomain.com/username/.qmail为:

|/var/my/qmailfilter/qmailfilter
|/usr/bin/deliverquota ./Maildir

当我向该用户帐户发送消息时,qmailfilter PHP 脚本执行并完美记录,返回退出代码(99 用于丢弃消息,0 用于继续传递消息的下一个 .qmail 行)。

事实证明,无论我已经尝试过多少退出代码,它都会传递消息。

该脚本(参见第 174 行)输出一个文本退出代码,前后没有任何空格。我试过了exit($code),,甚至print $code,还有。echo($code)file_put_contents("php://stdout", $code)exit(chr($code))

dot-qmail代码是:

0 - 成功(转到下一个 .qmail 行)

99 - 成功和中止(不执行下一行)

100 - 永久错误(反弹)

111 - 软错误(稍后重试)

资料来源:大 Qmail 图片。

其他尝试/实验:

  1. 删除了shebang行 ( #!/usr/bin/php) 并将第一.qmail行更改为|php -q /var/my/qmailfilter/qmailfilter

  2. 检查脚本的最后一行是否有空格

  3. 阅读 dot-qmail 的 man 文件,但没有找到任何结论

  4. 加入 .qmail 行:

    |/var/my/qmailfilter/qmailfilter |/usr/bin/deliverquota ./Maildir

在这种情况下,我收到的消息只有正确的返回码,没有任何标题、主题或消息正文。

  1. 注释掉 (#) 第二.qmail行,但停止接收任何类型的消息。

  2. 编辑/var/qmail/control/defaultdelivery添加第一行:

    |php /var/my/qmailfilter/qmailfilter |/usr/bin/deliverquota ./Maildir

并将用户.qmail文件重命名为_qmail. 结果相同。

我应该通过 PHP 脚本传递消息并忘记退出代码吗?

如果是这样,将消息保存到用户 Maildir/new 是否足够?

如果是这样,消息文件名重要吗?

任何想法将不胜感激。非常感谢!

更新:对于那些需要它的人,我在 icebex.com 上发布了最终脚本 slash qmailfilter

4

1 回答 1

1

我只是快速浏览了一下代码,但看起来您使用的是字符串值。exit('99')并且exit(99)不一样。确保使用整数而不是字符串。

  • exit('99') 将打印 99 并返回 0。

  • exit(99) 将返回 99。

于 2010-09-09T04:51:50.737 回答