我有一个(Linux)邮件服务器,包括用于接收邮件的postfix
,用于内容过滤的amavisd-new
(使用clamav
和SpamAssassin
),以及用于交付和IMAP的dovecot
。
我想设置一些东西,以便在每次将电子邮件发送到特定邮箱时触发脚本。 该脚本不一定需要知道关于消息的内容或标题的任何内容。 我知道至less有几个选项:
使用postfix
的内置过滤 。 设置一个标题检查重新路由到这个邮箱的任何电子邮件到我的脚本,然后可以将其传回到postfix
。 这里的缺点是,这一切都发生在amavis
的过滤之前,所以我的脚本也会被解雇,即使邮件在发送之前也会被封锁。 如果我没有正确地执行电子邮件回postfix
也可能会有性能的惩罚和丢失电子邮件的风险。
将我的脚本作为内容filter添加到amavis
。 与以前相比,这可能是性能上的一个提高,而且看起来像是一个更好的地方。 不幸的是,在对消息进行去/不去决定之前,它仍然受到执行。 另外,我还没有findamavis
文档,详细说明了实际上应该如何完成,而conf文件并不是真正的结论。
似乎最后的dovecot
交付步骤将是最好的地方,只有过滤邮件,但我不知道是否有办法做到这一点。
build议? 任何我忽略的东西?
编辑:忘了添加,我想避免轮询types的解决scheme(看日志,IMAP客户端脚本等)
我发现另一个可能被certificate是一个足够好的解决scheme:劫持邮件,因为它从postfix
传递给dovecot
。
对于postfix
,我更改master.cf
的以下行:
dovecot unix - nn - - pipe flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/dovecot-lda -d $(user)@$(domain)
至:
dovecot unix - nn - - pipe flags=DRhu user=vmail:mail argv=/scripts/emaildeliverycheck.py $(user)@$(domain)
然后像下面这样创build/scripts/emaildeliverycheck.py
3.4):
#!/usr/bin/python3 from sys import argv, stdin, exit from subprocess import Popen, check_call, CalledProcessError # Define recipients that should trigger the script here notifyusers = ('[email protected]', '[email protected]') recipient = argv[1] if recipient in notifyusers: # Run the script. Use Popen so that we don't have to wait for the # script to finish Popen(['/scripts/myscript.py', recipient]) try: # Now pass the email to dovecot-lda. Use check_call because we *do* # want to wait for it to finish check_call(['/usr/lib/dovecot/dovecot-lda', '-d', recipient], stdin=stdin) except CalledProcessError as error: # Propagate any error codes back to Postfix exit(error.returncode)
Postfix的pipe
进程将电子邮件传递给上面的脚本,而不是直接传递给dovecot-lda
。 脚本检查收件人(通过命令行传递,所以根本不需要查看邮件),如果匹配,则会触发另一个脚本。 然后它将信息传递给dovecot-lda
,它不应该能够告诉它不直接从Postfix获取它,并将退出状态传播回pipe
进程。
在初始testing中工作正常。 这只让我后过滤电子邮件,这是我要去的。
我使用procmail
作为我的本地交付代理。 这允许使用适用于用户的规则进行广泛的过滤。 应该可以configurationpostfix来使用procmail来进行过滤,如果需要,还可以发送邮件。
procmail
具有将filter应用到标题,内容或两者的广泛function。 你可以使用任何程序作为filter,所以你应该能够触发你的脚本发送给指定用户的每个电子邮件。