将退回邮件记录到数据库(具有虚拟域/用户的Postfix)
我们有一个后缀安装,其中包含几个虚拟域,每个虚拟域都有虚拟用户.使用 mysql数据库映射这些域和用户.到目前为止,我一直在通过解析后缀日志文件来跟踪反弹.我怀疑必须有更好,更有效的方法.我想到了三个,但我不确定什么是最好的: >编写Postfix内容过滤器,记录退回并丢弃邮件 我希望从维护的角度来看哪个最好,从保存服务器资源的角度来看是有效的.谢谢 解决方法这一切都假定您要收集有关跳出的信息而不是退回的电子邮件本身:我有与postfix,mysql和虚拟主机几乎相同的设置.从硬件资源角度来看,跟踪此问题的最有效方法是在执行时解析日志文件.但是如果你认为解析是如何解决的,那么你可以使用像Logwatch这样的应用程序为你做所有的解析.然后设置Postfix为您抛弃退回的文件. 现在,如果您确定要在某处收集这些电子邮件,可以在main.cf文件中使用这些设置: bounce_notice_recipient = someone@nowhere.com error_notice_recipient = someone@nowhere.com 如果您希望完全销毁电子邮件,可以添加虚拟用户并调整别名文件以将其发送到dev / null someone: /dev/null 至于脚本和数据库,我现在使用PHP和MySQL很多,所以如果我使用这些工具,我可以创建一些PHP代码来读取日志文件,查找跳出,然后将它们放到数据库中.然后我会在mail.log被截断之前运行代码.事实上,在我写完它之后,我会在这里发布代码. 这里有一些代码,如果你想用php / mysql运行它(我敢肯定它可能更漂亮): <?php #parse_logs.php # load local file into array $val = file("mail.log"); $pattern = '/status=bounced/'; foreach ($val as &$value) { if (preg_match($pattern,$value)) { $a = split('[<>]',$value); //if you prefer you can also use: preg_match_all('/<(.*)>/','$value',$matches); #can be helpful to print the following to the screen during tests # echo $a[1]; // Make a MySQL Connection mysql_connect("localhost","username","password") or die(mysql_error()); mysql_select_db("postfix_db") or die(mysql_error()); // Insert a row of information into the table "example" mysql_query("INSERT INTO emails (emailaddress) VALUES('$a[1]') ") or die(mysql_error()); #again,if you want to see while running manually from cli #echo "Data Inserted!"; } #again,if you want to see while running manually from cli #echo "n"; } ?> 然后,您可以在mail.log设置为回收之前立即启动cron,或者在cron启动后清除日志. 似乎需要花费大量精力来跟踪退回电子邮件的电子邮件地址.您需要编写mysql查询然后才能访问此信息. 你也可以完全跳过mysql的东西,只需将结果传递给测试文件或电子邮件地址(也可以使用cron) php parse.php > results.txt 要么 php parse_logs.php | /usr/sbin/sendmail someemailaddress@nowhere.com (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |