短篇故事
我有一个使用 .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 图片。
其他尝试/实验:
删除了shebang行 (
#!/usr/bin/php
) 并将第一.qmail
行更改为|php -q /var/my/qmailfilter/qmailfilter
检查脚本的最后一行是否有空格
阅读 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