Добрый день коллеги!Кто нибудь может подсказать как добавить в поле Subject сообщения отметку текущей даты и времени получения сообщения сервером. Я так понимаю надо копать в сторону header_checks.
Нет, копайте в сторону milter или контент-фильтров. Через контент-фильтр у меня было так:---- master.cf:
smtp inet n - y - - smtpd
-o content_filter=add-date:dummyadd-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 смотреть на дату сервера, а не в этот заголовок).
Спасибо заработало. Есть еще вопрос применять правило к конкретным получателям.То есть если получатель test@example.com то скрипт обрабатывать иначе нет
>[оверквотинг удален]
>
> $date_changed_flag=1; print PIPE "Date: $current_date\n";
> }
> }
> print PIPE $line;
> }
> --------------
> Только у меня не в тему дата добавляется, а заголовок 'Date:' меняется
> на локальный (это оказалось легче, чем научить Thunderbird смотреть на дату
> сервера, а не в этот заголовок).
Вот так теперь стало
-----
#!/usr/bin/perl -wuse 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;
}
-----
> Спасибо заработало. Есть еще вопрос применять правило к конкретным получателям.
> То есть если получатель 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 - должно работать.
Всем спасибо все работетСгруппировано получилось следующим образом
Чтобы добавить в поле Subject текущую дату и время сервера создаем скрипт (немного изменив предложенный Etch), размещаем, например, в /usr/local/bin/add-date.pl и выставляем права на исполнение
-----
#!/usr/bin/perl -wuse 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 - должно работать.
Строку в скрипте:
> 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/. Тогда, в случае чего, они потеряются все вместе, а не что-нибудь одно. А при переносе конфигов почты на другой сервер не придётся выискивать скрипты по всей ФС, вычисляя их по всему конфигу.
http://serverfault.com/questions/79788/rewrite-email-subject> Добрый день коллеги!
> Кто нибудь может подсказать как добавить в поле Subject сообщения отметку текущей
> даты и времени получения сообщения сервером. Я так понимаю надо копать
> в сторону header_checks.
> Добрый день коллеги!
> Кто нибудь может подсказать как добавить в поле Subject сообщения отметку текущей
> даты и времени получения сообщения сервером. Я так понимаю надо копать
> в сторону header_checks.Бред собачий. Убить Вас мало - всяк х-ню в сабж писать. Как Вас пользователи терпят?
Если Вам нужна эта дата, то смотрите конверт, а не тело письма.