URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 93304
[ Назад ]

Исходное сообщение
"Postfix - Добавить дату в поле Subject"

Отправлено Oleg , 27-Апр-12 15:29 
Добрый день коллеги!

Кто нибудь может подсказать как добавить в поле Subject сообщения отметку текущей даты и времени получения сообщения сервером. Я так понимаю надо копать в сторону header_checks.


Содержание

Сообщения в этом обсуждении
"Postfix - Добавить дату в поле Subject"
Отправлено Etch , 27-Апр-12 16:32 
Нет, копайте в сторону milter или контент-фильтров. Через контент-фильтр у меня было так:

---- master.cf:

smtp      inet  n       -       y       -       -       smtpd
                   -o content_filter=add-date:dummy

add-date    unix    -   n       n       -       20      pipe
    flags=Rq user=nobody argv=/usr/libexec/postfix/add-date.pl
    -f ${sender} -- ${recipient}


---- add-date.pl:

#!/usr/bin/perl -w

use POSIX qw(setlocale LC_ALL strftime);
POSIX::setlocale( LC_ALL, "C" );

my $SENDMAIL="/usr/sbin/sendmail -G -i @ARGV"; # NEVER NEVER NEVER use "-t" here.

my $line;
my $date_changed_flag=0;
my $blank_line_flag=0;
my $current_date=POSIX::strftime("%a, %d %b %Y %H:%M:%S %z", ( localtime(time()) ));

open (PIPE, " | $SENDMAIL");

while ($line=<STDIN>) {
    $blank_line_flag=1 if $line=~m/^\r?\n$/;
    if ($blank_line_flag==0 && $date_changed_flag==0) {
        if ( $line =~ s/^Date:( |\t)/X-Original-Date: / ) {
            $date_changed_flag=1; print PIPE "Date: $current_date\n";
        }
    }
    print PIPE $line;
}

--------------
Только у меня не в тему дата добавляется, а заголовок 'Date:' меняется на локальный (это оказалось легче, чем научить Thunderbird смотреть на дату сервера, а не в этот заголовок).


"Postfix - Добавить дату в поле Subject"
Отправлено Oleg , 16-Май-12 13:10 
Спасибо заработало. Есть еще вопрос применять правило к конкретным получателям.

То есть если получатель test@example.com то скрипт обрабатывать иначе нет

>[оверквотинг удален]
>            
> $date_changed_flag=1; print PIPE "Date: $current_date\n";
>         }
>     }
>     print PIPE $line;
> }
> --------------
> Только у меня не в тему дата добавляется, а заголовок 'Date:' меняется
> на локальный (это оказалось легче, чем научить Thunderbird смотреть на дату
> сервера, а не в этот заголовок).


"Postfix - Добавить дату в поле Subject"
Отправлено Oleg , 17-Май-12 10:03 
Вот так теперь стало
-----
#!/usr/bin/perl -w

use POSIX qw(setlocale LC_ALL strftime);
POSIX::setlocale( LC_ALL, "C" );

my $SENDMAIL="/usr/sbin/sendmail -G -i @ARGV"; # NEVER NEVER NEVER use "-t" here.

my $line;
my $subj_orig;
my $date_changed_flag=0;
my $blank_line_flag=0;
my $current_date=POSIX::strftime("%Y-%m-%d %H:%M:%S %z", ( localtime(time()) ));
open (PIPE, " | $SENDMAIL");

while ($line=<STDIN>)
{
    $blank_line_flag=1 if $line=~m/^\r?\n$/;
    if ($blank_line_flag==0 && $date_changed_flag==0)
        {
        if (  $line =~ s/^Subject:( |\t)/$subj_orig / )
            {
                $date_changed_flag=1; print PIPE "Subject: $current_date: $subj_orig \n";
            }
        }
    print PIPE $line;
}
-----


"Postfix - Добавить дату в поле Subject"
Отправлено Etch , 17-Май-12 15:08 
> Спасибо заработало. Есть еще вопрос применять правило к конкретным получателям.
> То есть если получатель test@example.com то скрипт обрабатывать иначе нет

Убираете из master.cf вызов вашего контент-фильтра, а в main.cf в параметре smtpd_recipient_restrictions определяете опцию:
check_recipient_access hash:$config_directory/filters/change-subject

Ну и в файле change-subject:
test@example.com   FILTER add-date:dummy
- ну или как там вы назвали свой фильтр вместо add-date

На практике не проверял, но судя по http://www.postfix.org/access.5.html - должно работать.


"Postfix - Добавить дату в поле Subject"
Отправлено Oleg , 17-Май-12 17:55 
Всем спасибо все работет

Сгруппировано получилось следующим образом

Чтобы добавить в поле Subject текущую дату и время сервера создаем скрипт (немного изменив предложенный Etch), размещаем, например, в /usr/local/bin/add-date.pl и выставляем права на исполнение
-----
#!/usr/bin/perl -w

use POSIX qw(setlocale LC_ALL strftime);
POSIX::setlocale( LC_ALL, "C" );

my $SENDMAIL="/usr/sbin/sendmail -G -i @ARGV"; # NEVER NEVER NEVER use "-t" here.

my $line;
my $addr;
my $subj_orig;
my $date_changed_flag=0;
my $blank_line_flag=0;
my $current_date=POSIX::strftime("%Y-%m-%d_%H:%M:%S %z", ( localtime(time()) ));
open (PIPE, " | $SENDMAIL");

while ($line=<STDIN>)
{
    $blank_line_flag=1 if $line=~m/^\r?\n$/;
    if ($blank_line_flag==0 && $date_changed_flag==0)
        {
        if (  $line =~ s/^Subject:( |\t)/$subj_orig / )
            {
                $date_changed_flag=1; print PIPE "Subject: \$TS:$current_date: $subj_orig $addr\n";
            }
        }
    print PIPE $line;
}
-----

Далее необходимо описать (добавить) в master.cf
-----
add-date    unix    -   n       n       -       20      pipe
    flags=Rq user=nobody argv=/usr/local/bin/add-date.pl -f ${sender} -- ${recipient}
-----
Теперь Postfix знает о новом сервисе add-date

Создаем файл /etc/postfix/subjrewrite следующего содержания
-----
test@example.com FILTER add-date:dummy
-----

Создаем hash
-----
postmap subjrewrite
-----

Добавляем или изменяем в main.сf
-----
smtpd_recipient_restrictions =
    check_recipient_access hash:/etc/postfix/subjrewrite
-----

Перегружаем postfix

В моем случае Subject меняется на
$TS:2012-05-17_16:18:26 +0300:   Original_Subj


>> Спасибо заработало. Есть еще вопрос применять правило к конкретным получателям.
>> То есть если получатель test@example.com то скрипт обрабатывать иначе нет
> Убираете из master.cf вызов вашего контент-фильтра, а в main.cf в параметре smtpd_recipient_restrictions
> определяете опцию:
> check_recipient_access hash:$config_directory/filters/change-subject
> Ну и в файле change-subject:
> test@example.com   FILTER add-date:dummy
> - ну или как там вы назвали свой фильтр вместо add-date
> На практике не проверял, но судя по http://www.postfix.org/access.5.html - должно работать.


"Postfix - Добавить дату в поле Subject"
Отправлено Etch , 17-Май-12 21:52 
Строку в скрипте:
> if (  $line =~ s/^Subject:( |\t)/$subj_orig / )

замените на:
if ( $line =~ m/^Subject:( |\t)/ )

А после строки:
> $date_changed_flag=1; print PIPE "Subject: \$TS:$current_date: $subj_orig $addr\n";

добавьте строку:
next;

А то в заголовках писем у вас появится мусор после строки с темой, что чревато проблемами в некоторых случаях.

И ещё я бы рекомендовал хранить этот скрипт не в /usr/local/bin/ , а где-нибудь рядом с конфигами - например в /etc/postfix/scripts/. Тогда, в случае чего, они потеряются все вместе, а не что-нибудь одно. А при переносе конфигов почты на другой сервер не придётся выискивать скрипты по всей ФС, вычисляя их по всему конфигу.


"Postfix - Добавить дату в поле Subject"
Отправлено Samba , 28-Апр-12 18:35 
http://serverfault.com/questions/79788/rewrite-email-subject

> Добрый день коллеги!
> Кто нибудь может подсказать как добавить в поле Subject сообщения отметку текущей
> даты и времени получения сообщения сервером. Я так понимаю надо копать
> в сторону header_checks.


"Postfix - Добавить дату в поле Subject"
Отправлено LSTemp , 17-Май-12 20:14 
> Добрый день коллеги!
> Кто нибудь может подсказать как добавить в поле Subject сообщения отметку текущей
> даты и времени получения сообщения сервером. Я так понимаю надо копать
> в сторону header_checks.

Бред собачий. Убить Вас мало - всяк х-ню в сабж писать. Как Вас пользователи терпят?

Если Вам нужна эта дата, то смотрите конверт, а не тело письма.