将退回的邮件logging到数据库(具有虚拟域/用户的后缀)

我们有一个postfix安装,有几个虚拟域,每个虚拟域都有虚拟用户。 这些域和用户使用mysql数据库进行映射。 我一直在parsing后缀日志文件跟踪反弹。 我怀疑必须有更好更有效的方法来做到这一点。 我想到了三,但我不知道什么是最好的:

  1. 编写一个Postfix内容filter,logging反弹并丢弃邮件
  2. 使用procmail – 但我不知道procmail如何与没有定义$ HOME的虚拟用户一起工作
  3. 编写一个从邮箱中POP邮件的脚本; parsing并logging它们并删除退回的电子邮件

我将不胜感激地build议,从维护的angular度来看哪个最好,从节约服务器资源的angular度来看是有效的。 谢谢

  • 在一个接口上禁用rp_filter
  • Cisco ASA 5505(8.05):L2L IPSec隧道上的非对称组策略filter
  • 在dovecot + sieve中手动调用过滤
  • Postfix,为每个用户独立进行基于规则的过滤
  • IIS只能用主机名来提供请求
  • 在Windows Server上closures基本过滤系统有什么风险?
  • 2 Solutions collect form web for “将退回的邮件logging到数据库(具有虚拟域/用户的后缀)”

    这一切都假设你想收集反弹的信息,而不是反弹的电子邮件本身:

    我有几乎相同的设置后缀,MySQL和虚拟主机。 从n硬件资源的angular度来看,跟踪这个最有效的方法是parsing日志文件。 但是如果你认为如何parsing是一个负载很大,你可以使用像Logwatch这样的应用程序来为你做所有的parsing。 然后设置Postfix来为你抛弃退回的文件。

    现在,如果您决定实际上想要收集这些电子邮件,您可以在main.cf文件中使用这些设置:

    bounce_notice_recipient = someone@nowhere.com error_notice_recipient = someone@nowhere.com 

    如果你想要完全销毁邮件,你可以添加一个虚拟用户,并调整你的别名文件,将它们发送到dev / null

     someone: /dev/null 

    至于脚本和数据库,我现在使用PHP和MySQL很多,所以如果我要使用这些工具,我可以创build一些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启动之后清除日志。

    看起来像很多努力来跟踪反弹电子邮件的电子邮件地址。 你需要编写mysql查询,然后访问这个信息。

    您也可以完全跳过mysql的东西,只是将结果传送给testing文件或电子邮件地址(也可以使用cron)

     php parse.php > results.txt 

    要么

     php parse_logs.php | /usr/sbin/sendmail someemailaddress@nowhere.com 

    我没有一个例子,因为我从来没有尝试过,但是你可以使用syslog-ng(取决于你的平台),并创build一个filter。 filter可以select在消息本身上执行正则expression式匹配。 所有你需要做的就是把它发送到一个特定的目的地,该目的地将是MySQL。 快速search会告诉你如何设置syslog-ng到mysql,一些调整可能会让你filter发送到目的地。

    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.