Я хочу проанализировать и вставить некоторую информацию из письма, которое только что пришло на почтовый сервер критически важного приложения.
У меня есть способ настроить мой почтовый сервер так, чтобы он запускал сценарий при получении почты.
Хотя у меня есть система 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 /.