Регистрация отклоненных сообщений в базе данных (Postfix с виртуальными доменами/пользователями)

Регистрация отклоненных сообщений в базе данных (Postfix с виртуальными доменами/пользователями)

У нас есть установка postfix с парой виртуальных доменов, каждый с виртуальными пользователями. Эти домены и пользователи сопоставляются с использованием базы данных mysql. До сих пор я отслеживал отказы, анализируя файл журнала postfix. Я подозреваю, что должны быть лучшие и более эффективные способы сделать это. Я думал о трех, но не уверен, какой из них лучше:

  1. Напишите фильтр контента Postfix, который регистрирует возврат и отбрасывает почту
  2. Используйте procmail, но я не уверен, как procmail будет работать с виртуальными пользователями, у которых не определен $HOME
  3. Напишите скрипт, который извлекает почту из почтовых ящиков, анализирует и регистрирует ее, а также удаляет возвращенные письма.

Я был бы признателен за совет, что будет лучше с точки зрения обслуживания и эффективнее с точки зрения экономии ресурсов сервера. Спасибо

решение1

Все это предполагает, что вы хотите собирать информацию о недоставленных письмах, а не сами возвращенные письма:

У меня примерно такая же настройка с postfix, mysql и виртуальными хостами. С точки зрения аппаратных ресурсов наиболее эффективным способом отслеживания этого является парсинг файлов журнала по мере их выполнения. Но если вы считаете, что парсинг слишком большой, вы можете использовать приложение вроде Logwatch, которое выполнит весь парсинг за вас. Затем настройте Postfix так, чтобы он избавлялся от возвращенных файлов.

Теперь, если вы решите, что действительно хотите где-то собирать эти электронные письма, вы можете использовать эти настройки в файле main.cf:

bounce_notice_recipient = [email protected]
error_notice_recipient = [email protected]

А если вы хотите, чтобы письма были полностью уничтожены, вы можете добавить виртуального пользователя и настроить файл псевдонимов, чтобы отправлять их в dev/null.

someone: /dev/null

Что касается скрипта и базы данных, то я сейчас много работаю с PHP и MySQL, так что если бы я использовал эти инструменты, я мог бы создать некоторый php-код для чтения файла журнала, поиска отказов, а затем отправить их в базу данных. Затем я бы запустил код до того, как mail.log будет обрезан. На самом деле, я выложу код здесь после того, как напишу его, ради интереса.

Вот код, если вы хотите запустить это с помощью php/mysql (я уверен, что он может быть красивее):

<?php
#parse_logs.php
# load local file into array
$val = file("mail.log");

$pattern = '/status=bounced/';

foreach ($val as &$value) {
if (preg_match($pattern,$value)) {
        $a = split('[<>]', $value);

       //if you prefer you can also use: preg_match_all('/<(.*)>/', '$value', $matches);
       #can be helpful to print the following to the screen during tests
       # echo $a[1];

        // Make a MySQL Connection
        mysql_connect("localhost", "username", "password") or die(mysql_error());
        mysql_select_db("postfix_db") or die(mysql_error());

        // Insert a row of information into the table "example"
        mysql_query("INSERT INTO emails (emailaddress) VALUES('$a[1]') ") 
        or die(mysql_error());  

        #again, if you want to see while running manually from cli
        #echo "Data Inserted!";

}
#again, if you want to see while running manually from cli
#echo "\n";
}

?>

Затем вы можете запустить cron непосредственно перед тем, как ваш mail.log будет настроен на очистку, или очистить журнал после запуска cron.

Похоже, что отслеживание адресов электронной почты возвращенных писем требует больших усилий. Конечно, вам придется писать запросы MySQL, чтобы получить доступ к этой информации.

Вы также можете полностью пропустить работу с MySQL и просто передать результаты в тестовый файл или на адрес электронной почты (а также использовать cron).

php parse.php > results.txt

или

php parse_logs.php | /usr/sbin/sendmail [email protected]

решение2

У меня нет примера, так как я никогда не пробовал это делать, но вы можете использовать syslog-ng (в зависимости от вашей платформы) и создать фильтр. Фильтр имеет опцию для выполнения сопоставления с регулярным выражением для самого сообщения. Все, что вам нужно сделать, это отправить его в определенное место назначения, этим местом назначения будет mysql. Быстрый поиск подскажет вам, как настроить syslog-ng для mysql, а некоторая настройка, вероятно, даст вам фильтр для отправки в это место назначения.

решение3

Вы можете передать уведомления о возврате в скрипт. Просто обзор того, как вы можете это реализовать:

/etc/postfix/main.cf

notify_classes = bounce, 2bounce, resource, software
[email protected]
[email protected]

/etc/postfix/транспорт

[email protected]     bouncepipe:

/etc/postfix/master.cf

bouncepipe   unix  -       n       n       -       -       pipe
      flags=DRhu user=list argv=/etc/postfix/bouncepipe.pl

/etc/postfix/bouncepipe.pl

#!/usr/bin/perl                                                                                                                                                                                                                                                                       

my $message = '';
my $sender = '';
my $recipient = '';

foreach $line ( <STDIN> )
{
    $message .= $line;
    chomp( $line );
    if ( $line =~ /Final-Recipient: /)
    {
        my $index = index($line, ';');
        $recipient = substr($line, $index+2);
    }
    if ( $line =~ /X-Postfix-Sender: /)
    {
        my $index = index($line, ';');
        $sender = substr($line, $index+2);
    }
}
# Do whatever you need to do with $sender and $recipient

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