반송된 메시지를 데이터베이스에 기록(가상 도메인/사용자가 있는 Postfix)

반송된 메시지를 데이터베이스에 기록(가상 도메인/사용자가 있는 Postfix)

각각 가상 사용자가 있는 두 개의 가상 도메인이 있는 postfix 설치가 있습니다. 이러한 도메인과 사용자는 mysql 데이터베이스를 사용하여 매핑됩니다. 나는 지금까지 postfix 로그 파일을 분석하여 바운스를 추적해 왔습니다. 나는 이를 수행하는 데 더 좋고 효율적인 방법이 있어야 한다고 생각합니다. 세 가지를 생각했는데 무엇이 가장 좋은지 잘 모르겠습니다.

  1. 반송 메일을 기록하고 메일을 버리는 Postfix 콘텐츠 필터를 작성하세요.
  2. procmail을 사용하세요. 하지만 $HOME이 정의되지 않은 가상 사용자에게 procmail이 어떻게 작동하는지 잘 모르겠습니다.
  3. 사서함에서 메일을 POP하는 스크립트를 작성하세요. 이를 분석 및 기록하고 반송된 이메일을 삭제합니다.

유지 관리 관점에서 가장 좋은 것과 서버 리소스 절약 관점에서 효율적인 것이 무엇인지 조언해 주시면 감사하겠습니다. 감사해요

답변1

이는 모두 반송된 이메일 자체가 아닌 반송에 대한 정보를 수집한다고 가정합니다.

나는 postfix, mysql 및 가상 호스트와 거의 동일한 설정을 가지고 있습니다. n 하드웨어 리소스 관점에서 이를 추적하는 가장 효율적인 방법은 수행 중인 로그 파일을 구문 분석하는 것입니다. 그러나 구문 분석 방법이 부하가 크다고 생각되면 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";
}

?>

그런 다음 mail.log가 재활용되도록 설정되기 직전에 크론을 실행하거나 크론이 실행된 후 로그를 지울 수 있습니다.

반송된 이메일의 이메일 주소를 추적하는 데 많은 노력이 필요한 것 같습니다. 물론 이 정보에 액세스하려면 mysql 쿼리를 작성해야 합니다.

mysql 항목을 완전히 건너뛰고 결과를 테스트 파일이나 이메일 주소로 파이프할 수도 있습니다(크론을 사용할 수도 있음).

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/transport

[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

관련 정보