У меня есть почтовый сервер (Linux), состоящий из postfix
для получения почты, amavisd-new
для фильтрации содержимого (с использованием clamav
и SpamAssassin
), и dovecot
для доставки и IMAP.
Я хотел бы настроить все так, чтобы сценарий запускался каждый раз, когда электронное письмо доставляется в конкретный почтовый ящик. Сценарию не обязательно что-либо знать о содержании или заголовках сообщения. Я знаю как минимум пару вариантов:
Использовать postfix
встроенная фильтрация. Настройте проверку заголовка, чтобы перенаправить любые электронные письма, предназначенные для этого почтового ящика, в мой сценарий, который затем может передать их обратно в postfix
. Минус здесь в том, что все это происходит раньше amavis
фильтрация, поэтому мой скрипт будет отключен даже для писем, которые в конечном итоге блокируются до доставки. Также могут быть штрафы за производительность и риск потери электронных писем, если я не выполню передачу электронного письма обратно в postfix
должным образом.
Добавить мой скрипт в качестве фильтра содержимого в amavis
. Это может быть улучшением производительности по сравнению с предыдущим, и кажется, что это лучшее место для этого. К сожалению, он все еще страдает от того, что выполняется до того, как по сообщению будет принято решение «годен / не годен». Кроме того, мне не удалось найти amavis
документация, подробно описывающая, как это на самом деле должно быть сделано, а файлы conf не являются окончательными.
Похоже на финал dovecot
этап доставки был бы лучшим местом для получения только отфильтрованной почты, но я не уверен, есть ли способ заставить это работать.
Предложения? Я что-то не замечаю?
Редактировать: Забыл добавить, я бы хотел избежать решений типа опроса (просмотр журналов, клиентский скрипт IMAP и т. Д.)
Я нашел еще один вариант, который может оказаться достаточно хорошим решением: захват сообщения, когда оно передается из 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 = ('user1@mydomain.com',
'user2@mydomain.com')
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)
Постфикс pipe
процесс передает электронное письмо для окончательной доставки указанному выше сценарию, а не напрямую dovecot-lda
. Сценарий проверяет получателя (переданного в командной строке, поэтому ему вообще не нужно просматривать сообщение) по списку и запускает другой сценарий, если есть совпадение. Затем он передает сообщение dovecot-lda
, который не должен указывать, что он не получает его напрямую от Postfix, и передает статус выхода обратно на pipe
обработать.
Отлично работает при начальном тестировании. Это дает мне только сообщения электронной почты, отфильтрованные после пост-фильтрации, что я и собираюсь сделать.
я использую procmail
как мой местный агент доставки. Это позволяет выполнять обширную фильтрацию с использованием правил, применимых к пользователю. Должна быть возможность настроить postfix для использования procmail для фильтрации и, при желании, доставки электронной почты.
procmail
имеет широкие возможности для применения фильтров к заголовкам, контенту или к тому и другому. Вы можете использовать любую программу в качестве фильтра, поэтому вы должны иметь возможность запускать свой скрипт для каждого электронного письма, отправленного указанному пользователю.