短篇小说
我有一个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 $code
,echo($code)
甚至file_put_contents("php://stdout", $code)
以及exit(chr($code))
。
dot-qmail
代码为:
0 - 成功(转到下一个.qmail行)
99 - 成功并中止(不执行下一行)
100 - 永久性错误(反弹)
111 - 软错误(稍后重试)
来源:Big Qmail图片。
其他尝试/实验:
删除 shebang 行(#!/usr/bin/php
)并将第一行.qmail
行更改为|php -q /var/my/qmailfilter/qmailfilter
选中了whitespacing
阅读dot-qmail man文件但未找到任何结论
加入.qmail行:
| / var / my / qmailfilter / qmailfilter | / usr / bin / deliverquota ./Maildir
在这种情况下,我收到的消息只有正确的返回代码,没有任何标题,主题或消息正文。
注释掉(#)第二条.qmail
行,但停止接收任何类型的消息。
编辑/var/qmail/control/defaultdelivery
添加第一行:
| php / var / my / qmailfilter / qmailfilter | / usr / bin / deliverquota ./Maildir
并将用户.qmail
文件重命名为_qmail
。相同的结果。
我应该通过PHP脚本传递消息并忘记退出代码吗?
如果是这样,是否足以将消息保存给用户Maildir / new?
如果是,消息文件名是否重要?
任何想法都将受到赞赏。非常感谢!
更新:对于那些需要它的人,我在icebex.com发布了最终脚本slash qmailfilter
答案 0 :(得分:1)
我只是快速查看代码,但看起来你正在使用字符串值。 exit('99')
和exit(99)
不一样。确保使用整数而不是字符串。
退出('99')将打印99并返回0.
退出(99)将返回99。