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

Как запустить скрипт, когда письмо приходит на почтовый сервер? (Debian)

Я хочу проанализировать и вставить некоторую информацию из письма, которое только что пришло на почтовый сервер критически важного приложения.

У меня есть способ настроить мой почтовый сервер так, чтобы он запускал сценарий при получении почты.

Хотя у меня есть система debian, но подойдет любое универсальное решение (Linux).

Выглядит как кто-то еще уже ответил на этот вопрос, но подумал, что дам вам конкретный ответ.

Я бы использовал procmail и использовал рецепт в вашем .procmailrc, подобный этому:

#turn this off when you're finished testing :)
VERBOSE=on
LOGFILE=/home/user/procmail.log

:0 c #the c means continue on after this recipe is parsed
| /path/to/your/script

Вам также понадобится рецепт по умолчанию внизу, чтобы направить почту в ваш maildir.

Вы можете использовать / etc / aliases для передачи электронной почты непосредственно программе для обработки, поэтому, если вы хотите запустить сценарий для обработки всей электронной почты на test@domain.com, вы должны поместить эту строку в / etc / aliases (работает для postfix, sendmail и т. д.):

test:              "|/usr/local/bin/processtestemail.php"

Затем запустите «newaliases», чтобы обновить базу данных.

Затем убедитесь, что у вас есть рабочая программа в / usr / local / bin с именем processtestemail.php.

Его можно написать на php, bash, perl, python, на чем угодно и на чем угодно, что у вас есть для интерпретатора. Вы даже можете запустить скомпилированный двоичный файл, написанный на c / c ++ и т. Д.

Выше были предложения по использованию procmail, это отличный продукт, но, честно говоря, то, что я представил, является самым быстрым и простым решением, и оно работает в большем количестве версий * NIX с большим количеством почтовых программ, чем любые другие.

Кроме того, ни один из других ответов действительно не говорит вам, как обрабатывать входящее сообщение, и поэтому вы в своем сценарии читаете ввод из стандартного "in" (stdin), а затем анализируете эти данные, используя любые алгоритмы, которые вам могут потребоваться для их правильной обработки, как следует:

<?php

$fd = fopen('php://stdin','r');
if ($fd) then
    {
    $email = '';                         // initialize buffer
    while (!feof ($fd))                  // read as long as message
        {
        $rawemail .= fread($fd,1024);    // read up to 1K at a time
        ProcessTheMessageChunk($rawEmail);
        }
    fclose($fd);                         // done so close file handle
    $fd=NULL;                            // clear file handle
    }
else
    {
    print("ERROR:  Could could open stdin...");
    };

/* 
** Now write your code to fill in the function ProcessMessageChunk()
** and then process the data you have collected altogether using
** that function/subroutine.
*/

?>

Спасибо, что наняли экспертов SA: мы делаем все, большие или маленькие tekops.com

Вот хороший как обрабатывать входящую почту. Проще всего использовать .forward описанный выше механизм для передачи сообщения через сценарий. Создайте файл режима 600 .forward в домашнем каталоге пользователя и поместите в него канал для сценария:

"|$HOME/bin/your.program -and some arguments" 

Однако вместо этого вам следует рассмотреть возможность использования procmail, поскольку это подробное руководство. Procmail дает вам множество преимуществ, таких как более сложное ведение журнала и обработка почты. Вот простой пример .procmailrc (опять же из того же руководства):

:0
* !^FROM_DAEMON
* !^FROM_MAILER
* !^X-Loop: myaddress@myhost.mydomain.org
| $HOME/bin/my.script 

который имеет некоторые приятные функции, такие как способность обнаруживать и останавливать почтовые петли.

В postfix вы можете хранить все входящие сообщения (которые соответствуют некоторому шаблону или просто все), ваше приложение забирает их в каталог hold /, а затем помещает их обратно в каталог incoming / после завершения. Так работает антиспам-фильтр MailScanner при использовании с постфиксом.


В конфигурационном файле Postfix /etc/postfix/main.cf добавьте следующую строку:
header_checks = регулярное выражение: / etc / postfix / header_checks
В файле / etc / postfix / header_checks добавьте эту строку:
/ ^ Получено: / HOLD

Результатом этого является указание Postfix переместить все сообщения в очередь HOLD, когда ваше приложение будет завершено, я считаю, что вы должны поместить письма в каталог incoming /.