Запустить скрипт при получении письма

8

Я использую почтовый сервер Postfix / Dovecot для личного использования. Есть только несколько настоящих почтовых ящиков, по сути только postmaster@domain.comи username@domain.com.

Я часто использую этот virtualфайл для создания виртуальных почтовых ящиков для пересылки username@domain.com. У меня есть несколько таких для одноразовых учетных записей, таких как разовые покупки в интернет-магазинах, онлайн-игры, которые я хочу попробовать, не беспокоясь о спаме и т. Д. Для этого я выполняю SSH и выполняю следующие команды:

sudo vim /etc/postfix/virtual
# add a line that looks like:
# # username_servicename@domain.com      username@domain.com
sudo postmap virtual
sudo service postfix restart

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

Я хотел бы иметь возможность отправить электронное письмо username@domain.comна другой почтовый ящик на сервере с именем виртуального почтового ящика в качестве тела сообщения. Проблема заключалась бы в sudoвызовах, но я могу создать нового пользователя, чья единственная ответственность - справиться с этим, который должен справиться с этим.

Главным образом вопрос заключается в следующем: как я могу создать событие, которое будет вызвано по электронной почте? Есть ли где-нибудь сервис, который делает это? Могу ли я настроить Postfix или Dovecot для прослушивания этого письма и запуска команд для этого события?

Адам Смит
источник
Вы проверили эту ссылку ?
Кирилл-а
@ kirill-нет, я не имел. Похоже, что это может быть предназначено для решения этой проблемы, и теперь у меня наконец есть веская причина изучать PHP
Адам Смит
Вам не нужно изучать PHP: просто замените свой собственный скрипт на скрипт PHP, и все готово.
MariusMatutiae
@MariusMatutiae, если вы или kirill-a захотите написать ответ по этой теме, тогда (при условии, что это сработает) я с радостью присужду награду
Адам Смит
@ kirill-пинг вежливости за мой комментарий выше.
Адам Смит

Ответы:

8

Правильная процедура для выполнения сценария (я использую сценарий оболочки) при получении почтового сообщения заключается в следующем. Он включает в себя изменение файла конфигурации postfix , master.cf (который в моем Debian находится в / etc / postfix ) путем добавления следующей строки:

 my_shell_script unix - n n - - pipe flags=F user=MY_USERNAME argv=/path/to/my/shell/script ${sender} ${size} ${recipient}

который инструктирует postfix запускать скрипт (вам нужно сделать его исполняемым), когда происходит какое-то событие.

Чтобы указать, когда выполнять скрипт, вы должны сделать следующее: предположим, что вы хотите, чтобы он выполнялся, когда username@domain.com получает сообщение. Поместите следующую строку

 username@domain.com FILTER my_shell_script:dummy

внутри файла /etc/postfix/address.txt ; вам нужно будет создать соответствующую базу данных для постфикса, чтобы использовать этот файл, что вы делаете с помощью

  postmap /etc/postfix/address.txt

который выводит файл с именем /etc/postfix/address.db . Теперь вернитесь к файлу /etc/postfix/main.cf и добавьте следующую строку:

 smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination

Теперь перезапустите постфикс ,

  postfix reload

и тебе должно быть хорошо идти.

MariusMatutiae
источник
2
Разве вы не имеете в виду 'хеш check_recipient_access: / etc / postfix / address' здесь? Вы использовали «доступ», где я думаю, что вы имели в виду «адрес», основываясь на ваших инструкциях.
Ли Фуллер
3
Это то же самое, если вы используете virtual_mailboxes для различных виртуальных доменов? Я дословно следовал этим инструкциям - и если я не объявляю virtual_alias, я получаю отскок. Если я это сделаю, он доставляет сообщение в почтовый ящик, но не запускает сценарий.
Ли Фуллер
Я не получил это на работу. Этот ответ сработал: serverfault.com/questions/322657/…
JLH
Из того, что я понимаю, это решение также имеет проблему, что оно будет запускаться только для сообщений, полученных через SMTP. sendmailпрямое на сервере не сработает.
Филипп Коулинг
@PhilipCouling Смотрите этот ответ: unix.stackexchange.com/a/179407 . Вы можете использовать pickupопцию.
Стефан
4

Я вижу два очевидных решения.

Если вы используете procmail в качестве MDA на своем сервере или хотите перейти на его использование, вы можете запустить любой произвольный сценарий для любого произвольного электронного письма с помощью |действия рецепта procmail (pipe). Надеемся, что он не будет запущен от имени пользователя root, но должно быть легко создать сценарий, который выполняет требуемую магию и который может быть вызван без пароля соответствующим пользователем как root. Выходные данные сценария могут даже быть возвращены в одно и то же электронное письмо, а позднее доставлено по электронной почте, сделав рецепт действием фильтра.

Альтернатива (которая требует меньше практического обслуживания) - создать один почтовый ящик и настроить Postfix$recipient_delimiter для того, чтобы он обычно не использовался для этой цели; например, .или -. Обратите внимание, что receient_delimeter - это настройка для всего сервера. Допустим, вы настроили почтовый ящик dummy@example.comи настроили $recipient_delimeter = .. Это позволит затем dummy.<anything>@example.comдоставить на локальный почтовый ящик, соответствующий dummy@example.com. Чтобы отключить один из них, добавьтеdummy.<whatever>@example.comк соответствующей таблице получателей с действием отклонения. Недостатком является то, что это будет универсальный почтовый ящик для префикса, поэтому вы захотите сделать так, чтобы префикс трудно было натолкнуть на случайные или словарные атаки. Положительным моментом является то, что в обычном случае (отправитель уважает ваши пожелания и не перепродает ваш адрес электронной почты) этот подход не требует обслуживания, и вы всегда можете изменить свой префикс позже и явно перечислить те комбинации, которые вы хотите сохранить при получении почты для ,

CVn
источник
Я не привязан к Postfix по любой причине, кроме той, которая у меня есть в настоящее время. Однако я предпочел бы найти решение, которое будет работать с моим текущим MDA / MTA. Что касается разделителя: я вряд ли верю, что отправитель будет уважать мои пожелания и не перепродавать мой адрес электронной почты, или я бы дал им постоянный адрес :)
Адам Смит
@AdamSmith Разница в том, что с чем-то вроде моей второй альтернативы вы можете отключить адрес, который вы дали конкретному объекту, не вызывая проблем нигде, и адреса кажутся разумными даже для тупых автоматических верификаторов. Что касается хранения MDA / MTA, procmail можно использовать в качестве замены для MDA Postfix; не нужно заменять Postfix как ваш MTA.
CVN
procmail больше не поддерживается: см. lwn.net/Articles/416901 , статью с заголовком: Сообщения о смерти procmail не сильно преувеличены. Лучше не рисковать и следовать совету @ kirill-a.
MariusMatutiae
procmail все еще широко используется, и (IMHO) остается лучшим решением для специальной фильтрации. Примечание @ MariusMatutiae о том, что он действительно мертв, относится исключительно к его развитию. Я не могу вспомнить каких-либо ошибок в procmail, с которыми я когда- либо сталкивался, и я совершил нелепые вещи, такие как создание полноценных списков рассылки. Возможно, он не получил дальнейшего развития, потому что единственное направление, по которому он мог бы пойти, было бы вне его сферы действия (например, антиспам, лучше обслуживаемый SpamAssassin или, например, milter-greylist ).
Адам Кац
И вы говорите это мне, потому что ....?
MariusMatutiae
2

В случае, если ссылка не работает, вот краткое изложение.

Сначала зайдите master.cfи зарегистрируйте свой скрипт «myhook», добавив следующую строку:

myhook unix - n n - - pipe flags=F user=www-data argv=/path/to/script.sh ${sender} ${size} ${recipient}

Также отредактируйте строку smtp, чтобы Postfix запустил фильтр для любой почты, приходящей через SMTP-доставку:

smtp inet n - - - - smtpd -o content_filter=myhook:dummy

Обратите внимание, что если вы отправляете почту с помощью команды sendmail, фильтр не сработает. В этом случае добавьте опцию после «доставки»:

pickup fifo n - - 60 1 pickup -o content_filter=myhook:dummy

Перезапустите постфикс: postfix reload

Сделайте ваш скрипт доступным для чтения и исполнения любым пользователем: chmod +rx script.sh

Обратите внимание, что скрипт всегда запускается при получении любой почты. Чтобы указать точный адрес см. Ответ @MariusMatutiae.

кирилл-а
источник
это
привело