postfix – hock – 从处理的电子邮件中提取信息

设置

Linux,Debian Wheezy,为大约1000个用户提供邮件服务。 Courier和Postfix安装在这个盒子里。

有关服务器的信息

这是一个后置设置,它将电子邮件放到/home/vmail/$domain/$user下的邮箱 – 这部分工作正常。

我打算做什么:

我想实现,当一个电子邮件通过服务器发送一个脚本( /home/vmail/mail_logger.sh )被触发,以便我可以login和采取行动。 为什么? 如果这样的帐户遭到黑客攻击,并且有人开始通过系统发送垃圾邮件,我希望对帐户实施放缓/禁用操作。

现在,我正在轮换日志文件,并提取哪些用户发送了一段时间内的电子邮件,并locking了每小时发送超过x封电子邮件(可configuration)的帐户。 这个日志旋转的实现并不好,所以我认为每次通过smtps发送一个邮件时都会触发一个hock可能是好事(现在只允许用户使用smtps,而不是smtp)。

我发现这本手册 ,它给了我一些想法如何实现不同的交付方式(smtp,smtpd,皮卡)的“hocks”

在main.cf中,我添加了以下几行

 hooksmtp unix - nn - - pipe flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} smtp hooksmtps unix - nn - - pipe flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} smtps hookpickup unix - nn - - pipe flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} pickup` 

并在main.cf中修改了以下几行

 smtp inet n - - - - smtpd -o content_filter=hooksmtp:dummy smtps inet n - - - - smtpd -o content_filter=hooksmtps:dummy -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smt pickup fifo n - - 60 1 pickup -o content_filter=hookpickup:dummy 

在具体的行动上调用窍门。

现在触发的脚本看起来像这样,我会改善以后…..

 cat /home/vmail/mail_logger.sh #!/bin/bash echo $(date +%Y.%m.%d_%H:%M:%S) $@ >> /home/vmail/mail_logger.log 

我现在有这个问题,现在所有的电子邮件都被“钩子”(这是很好的)处理,但没有交付到原来的目的地(这是不好的)。

我看了一下postfix手册,发现我可以实现所有的电子邮件都发送到本地电子邮件比处理,但我认为应该有另一种方法来处理这个。

所以问题是如何改变这些“窍门”得到通知和邮件仍然像以前一样处理,而不需要做BCC和处理BCC的线路。

处理上述问题的其他想法也是受欢迎的。 但请注意,我不希望在该框上运行垃圾邮件扫描程序,因为垃圾邮件扫描是由服务器前面的4个MX节点(运行debian和sa-exim)处理的。

更新1:我的第一个调查结果如下

我遵循了这些意见并做出了这些修改

在main.cf中,我添加了以下几行

 local_transport = hookpickup always_bcc = extract@localhost 

在master.cf中我确保hookpickup已经到位

 hookpickup unix - nn - - pipe flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} pickup 

我做了一些testing,发现了这一点

  • 如果我通过SMTP发送邮件,BCC会被发送到解压缩@ localhost,“钩子”会将其提取出来,脚本将处理内容。 – 好
  • 如果我在本地发送一封电子邮件到根目录,“钩子”将它接收到,脚本处理了内容,但电子邮件没有到达目的地 – 不好。

我现在需要设置local_transport = hookpickup只是得到“触发”,如果电子邮件来自邮箱提取@本地主机

更新2:我的下一个调查结果是答案

我已经遵循了第一个答案,并做出了这些改变

 transport_maps = hash:/etc/postfix/map_mytransport always_bcc = extract@localhost # removed: local_transport = hookpickup 

文件/ etc / postfix / map_mytransport有内容

 extract@localhost hookpickup: 

每次修改/ etc / postfix / map_mytransport的内容时,都必须运行postmap postmap /etc/postfix/map_mytransport ,它将生成postfix实际使用的文件/etc/postfix/map_mytransport.db。

请确保您之前没有定义transport_maps ,否则您将使用此设置覆盖它,并可能导致意外的行为。 我按照70%的手动设置了服务器,并没有设置,但我知道其他人有。

在master.cf中,我改变了hookpickup并添加了更多的debugging值

 hookpickup unix - nn - - pipe flags=F user=vmail argv=/home/vmail/mail_logger.sh client_address=${client_address} client_hostname=${client_hostname} client_port=${client_port} client_protocol=${client_protocol} domain=${domain} extension=${extension}mailbox=${mailbox} nexthop=${nexthop} original_recipient=${original_recipient} recipient=${recipient} sasl_method=${sasl_method} sasl_sender=${sasl_sender} sasl_username=${sasl_username} sender=${sender} size=${size} 

参数的完整描述可以在这里find。

为了使解决scheme工作,我将用户提取添加到系统并重新启动了后缀。

脚本/home/vmail/mail_logger.sh现在正在“实时”获取我需要locking帐户的信息(如果它发送给许多电子邮件(根据数据库中configuration的阈值定义))。

您可以设置transport_maps ,而不是使用hookpickup覆盖local_transport

 #main.cf transport_maps = hash:/etc/postfix/mytransport #/etc/postfix/mytransport extract@localhost hookpickup: 

在这种模式下,只需发送电子邮件提取@本地主机将被传递到hookpickup