
У меня есть почтовый сервер (Linux), который состоит изpostfix
для получения почты,amavisd-new
для фильтрации контента (с использованием clamav
и SpamAssassin
), иdovecot
для доставки и IMAP.
Я хотел бы настроить все так, чтобы скрипт запускался каждый раз, когда письмо доставляется на определенный почтовый ящик. Скрипту не обязательно знать что-либо о содержании или заголовках сообщения. Я знаю по крайней мере пару вариантов:
Использовать
postfix
встроенная фильтрация. Настройте проверку заголовка для перенаправления любых писем, предназначенных для этого почтового ящика, в мой скрипт, который затем может передать их обратно вpostfix
. Недостатком здесь является то, что все это происходит доamavis
фильтрации , поэтому мой скрипт будет запущен даже для писем, которые в конечном итоге будут заблокированы до доставки. Также могут возникнуть штрафы за производительность и риск потери писем, если я не выполню передачу письма обратно вpostfix
должным образом.Добавить мой скрипт в качестве фильтра контента в
amavis
. Это может быть улучшением производительности по сравнению с предыдущим, и просто кажется лучшим местом для этого. К сожалению, он все еще страдает от того, что выполняется до того, как будет принято решение о том, что сообщение можно или нельзя. Кроме того, я не смог найти документацию,amavis
подробно описывающую, как это должно быть сделано, и файлы conf не являются действительно окончательными.
Похоже, что на последнем dovecot
этапе доставки лучше всего получать только отфильтрованную почту, но я не уверен, есть ли способ это реализовать.
Предложения? Что-то, что я упускаю из виду?
Редактировать:Забыл добавить, я бы хотел избежать решений типа опроса (просмотр журналов, скрипт клиента IMAP и т. д.)
решение1
Я нашел еще один вариант, который может оказаться достаточно хорошим решением: перехват сообщения при его передаче postfix
от dovecot
.
Для postfix
я меняю следующие строки в master.cf
:
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/dovecot-lda -d $(user)@$(domain)
К:
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/scripts/emaildeliverycheck.py $(user)@$(domain)
Затем создайте /scripts/emaildeliverycheck.py
следующее (Python 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
.
Работает отлично при первоначальном тестировании. Это дает мне только отфильтрованные письма, что мне и нужно.
решение2
Я использую procmail
в качестве локального агента доставки. Это позволяет осуществлять обширную фильтрацию с использованием правил, применимых к пользователю. Должна быть возможность настроить postfix на использование procmail для фильтрации и, при желании, доставки электронной почты.
procmail
имеет обширные возможности для применения фильтров к заголовкам, контенту или и тому, и другому. Вы можете использовать любую программу в качестве фильтра, поэтому вы должны иметь возможность запускать свой скрипт для каждого письма, отправленного указанному пользователю.