Назад | Перейти на главную страницу

Как я могу запускать скрипт каждый раз, когда конкретный пользователь получает электронное письмо?

У меня есть почтовый сервер (Linux), состоящий из postfix для получения почты, amavisd-new для фильтрации содержимого (с использованием clamav и SpamAssassin), и dovecot для доставки и IMAP.

Я хотел бы настроить все так, чтобы сценарий запускался каждый раз, когда электронное письмо доставляется в конкретный почтовый ящик. Сценарию не обязательно что-либо знать о содержании или заголовках сообщения. Я знаю как минимум пару вариантов:

  1. Использовать postfixвстроенная фильтрация. Настройте проверку заголовка, чтобы перенаправить любые электронные письма, предназначенные для этого почтового ящика, в мой сценарий, который затем может передать их обратно в postfix. Минус здесь в том, что все это происходит раньше amavisфильтрация, поэтому мой скрипт будет отключен даже для писем, которые в конечном итоге блокируются до доставки. Также могут быть штрафы за производительность и риск потери электронных писем, если я не выполню передачу электронного письма обратно в postfix должным образом.

  2. Добавить мой скрипт в качестве фильтра содержимого в 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 имеет широкие возможности для применения фильтров к заголовкам, контенту или к тому и другому. Вы можете использовать любую программу в качестве фильтра, поэтому вы должны иметь возможность запускать свой скрипт для каждого электронного письма, отправленного указанному пользователю.