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,发现了这一点
我现在需要设置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