PHP邮件过滤脚本:.qmail文件中无法识别退出代码

时间:2010-09-09 04:46:00

标签: php filter email-spam qmail

短篇小说

我有一个PHP脚本使用.qmail文件过滤传入的邮件。该脚本运行良好并记录所有活动,但据我所知,当我的脚本返回一个dot-qmail退出代码99时,不应该执行最后一个.qmail行,该代码应该停止进一步处理.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,Web博士和zen.spamhaus.org及其结果不满意,我决定创建自己的PHP脚本来过滤所有收到的邮件。

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

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

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

看到它

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

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

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

原来它传递的信息与我已尝试过的许多退出代码无关。

脚本(参见第174行)输出文本退出代码,之前或之后没有任何空格。我尝试了exit($code)print $codeecho($code)甚至file_put_contents("php://stdout", $code)以及exit(chr($code))

dot-qmail代码为:

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

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

100 - 永久性错误(反弹)

111 - 软错误(稍后重试)

来源:Big Qmail图片。

其他尝试/实验:

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

  2. 选中了whitespacing

  3. 脚本的最后一行
  4. 阅读dot-qmail man文件但未找到任何结论

  5. 加入.qmail行:

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

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

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

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

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

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

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

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

      如果是,消息文件名是否重要?

      任何想法都将受到赞赏。非常感谢!

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

1 个答案:

答案 0 :(得分:1)

我只是快速查看代码,但看起来你正在使用字符串值。 exit('99')exit(99)不一样。确保使用整数而不是字符串。

  • 退出('99')将打印99并返回0.

  • 退出(99)将返回99。