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

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

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

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

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

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

Связанный контент