Re: Re[2]: Внешний и внутрениий домен

От: Alex Malevanny <CGatePro_at_mx_ru>
Дата: Thu 07 Jun 2007 - 12:55:03 MSD

Вот текст...
Коментарии по Skype:BeaconRus

#!/usr/bin/perl
#
# RULE 1
# Any Recipient not in *.localsite,*@localsite
# Header Filed is not X-External: yes
# From in *.localsite,*@localsite
# From is not postmaster*
# Add Header X-External: yes
#
# RULE 2
#
# Header Filed is X-External: yes
# From in xxx@localsite
# Execute [FILE] Scripts/list.pl "=?koi8-r?B?Title From?=" xxx@xxx.com
# Discard

#open(FILEDEBUG, '>>log.txt') || die;

use File::Copy;

my $temp = "/tmp/";
my $basedir = "/var/CommuniGate/";
my $debugfile = "/var/log/cgp_script.log";

my $fullname = "Alex";

my $email = "email";
my $pathmail = "temp\\temp.txt";
if ($ARGV[0] ne "") {
    $fullname = $ARGV[0];
    $email = $ARGV[1];
    $pathmail = $ARGV[3];

}

$datetime = localtime(time);

# Путь, имя и расширение файла с письмом
($paths,$mailname) = split(/[\/\\]/, $pathmail);

open(LogFile, '>>'.$debugfile) || die;
print LogFile "$datetime Path: $paths, Mail name and ext: $mailname\n"; close(LogFile);

($mailname, $mailext) = split(/\./, $mailname);

open(LogFile, '>>'.$debugfile) || die;
print LogFile "$datetime Mail name: $mailname, Mail ext: $mailext\n"; close(LogFile);

my $path_from = $basedir.$pathmail;
my $path_to = $temp;

if (!copy($path_from, $path_to)) {

    # Open debug
    open(LogFile, '>>'.$debugfile) || die;     print LogFile "$datetime Command: copy($path_from, $path_to)\nError: $!\n";

    # Close debug
    close(LogFile);
}

my $mail_read = $path_to.$mailname.".".$mailext;
my $mail_write = $path_to.$mailname.".sub";
my $mail_sub = $basedir."Submitted/";

open(LogFile, '>>'.$debugfile) || die;
print LogFile "$datetime Mail read: $mail_read, Mail write: $mail_write\n"; close(LogFile);

#######################################################################
# обработка заголовков
#######################################################################

open(FILEIN, $mail_read);

my $body = 0;
my $head = 0;
my $recipiets;
my $to;
my $cc;

while (<FILEIN>) {

    # заголовок cgp
    if (!$body && !$head && $_ eq "\n") {

        $head = 1;
        $_ = "";

    }
    # заголовок письма
    if (!$body && $head && $_ eq "\n") {
        $body = 1;
        $_ = "";

    }

    # обрабоотка заголовока cgp
    if (!$body && !$head) {

        if ($_ =~ /^R W/) {
            ($buf, $val) = split(/[<>]/);
            @recipients = (@recipients, $val);
        }

    }

    # обрабоотка заголовока письма
    if (!$body && $head) {

        if (!($_ =~ /^\t/) && !($_ =~ /^ /)) {
            $readto = 0;
            $readcc = 0;
            $readfrom = 0;       
        }       
        if ($_ =~ /^From:/) {
            $readfrom = 1;
            ($buf, $val) = split(/[<>]/);
            $realfrom = $val;
        }
        if ($_ =~ /^To:/) {
            $readto = 1;
            if ($_ =~ /[<>]/) {
                ($buf, $val) = split(/[<>]/);
            } else {
                ($buf, $val) = split(/[ \n]/);
            }
            $realto = $val;
        }
        if ($readto) {
            if ($_ =~ /[<>]/) {
                ($buf, $val) = split(/[<>]/);
            } else {
                ($buf, $val) = split(/[ \n]/);
            }
            @to = (@to, $val);
        }
        if ($_ =~ /^Cc:/) {
            $readcc = 1;
        }
        if ($readcc) {
            ($buf, $val) = split(/[<>]/);
            @cc = (@cc, $val);
        }
        if ($readfrom && $realfrom eq "") {
            ($buf, $val) = split(/[<>]/);
            $realfrom = $val;
        }

    }

    if ($body) {

        close(FILEIN);
    }
}

foreach $val (@recipients) {

    $remove = 0;

    foreach $buf (@to) {
        if ($val eq $buf) {
            $remove = 1;
        }

# print FILEDEBUG "To: ", $remove, " ", $val, " ", $buf, "\n";

    }

    foreach $buf (@cc) {
        if ($val eq $buf) {
            $remove = 1;
        }

# print FILEDEBUG "Cc: ", $remove, " ", $val, " ", $buf, "\n";

    }
    if (!$remove) {

        @newrecipients = (@newrecipients, $val);

# print FILEDEBUG $val, "\n";

    }
}

############################################################################

#######################################################################
# переписываем письмо обрабатывая заголовок
#######################################################################

open(FILEIN, $mail_read);
open(FILEOUT, ">>".$mail_write);

my $head = 0;
my $body = 0;
my $from = 0;
my $replace = 0;

while (<FILEIN>) {

    $replace = 0;
    if (!$head && !$body && $_ eq "\n") {

        $head = 1;
        $_ = "";

    }
    if ($head && !$body && $_ eq "\n") {

        $body = 1;
    }
    if ($head && !$body) {

        if ($_ =~ /^From:/) {
                # Подменяем поле From
            print FILEOUT "From: \"$fullname\" <$email>\n";
           

# print FILEOUT "X-Referent: processed\n";
# Добавляем поле Sender #$sender = substr($_, 6); #print FILEOUT "Sender: $sender"; $from = 1; } else { if (!($_ =~ /^\t/) && !($_ =~ /^ /)) { $from = 0; } if ($_ =~ /^Disposition-Notification-To:/) { print FILEOUT "Disposition-Notification-To: $fullname <$email>\n"; $replace = 1; } if (!$from && !$replace) { print FILEOUT $_; } }

    }
    if ($body) {

        print FILEOUT $_;
    }
}

close(FILEOUT);
close(FILEIN);

# Перемещаем обработанный файл с письмом
if (!copy($mail_write, $mail_sub)) {

    # Open debug
    open(LogFile, '>>'.$debugfile) || die;     print LogFile "$datetime Command: move($mail_write, $mail_sub)\nError: $!\n";

    # Close debug
    close(LogFile);
} else {

    open(LogFile, '>>'.$debugfile) || die;     print LogFile "$datetime Send: from $realfrom as $email to $realto\n";     close(LogFile);
}

unlink($mail_write);

##########################################################################
# создание дополнительных писем для скрытой копии
##########################################################################

$i = 0;

foreach $recipient (@newrecipients) {

    my $mail_write = $path_to.$mailname."_".$i++.".sub";

    open(FILEIN, $mail_read);
    open(FILEOUT, ">>".$mail_write);

    my $head = 0;
    my $body = 0;
    my $from = 0, $to = 0, $cc = 0;
    while (<FILEIN>) {
        $replace = 0;
        # заголовок письма
        if (!$head && !$body && $_ eq "\n") {
            $head = 1;
            $_ = "";
            print FILEOUT "To: <$recipient>\n";
        }
        # тело письма
        if ($head && !$body && $_ eq "\n") {
            $body = 1;
        }

        # обработка заголока письма
        if ($head && !$body) {
            if (!($_ =~ /^\t/) && !($_ =~ /^ /)) {
                $from = 0;
                $to = 0;
                $cc = 0;
            }
            if ($_ =~ /^From:/) {
                # Подменяем поле From
                print FILEOUT "From: \"$fullname\" <$email>\n";
               

# print FILEOUT "X-Referent: processed\n";
# Добавляем поле Sender #$sender = substr($_, 6); #print FILEOUT "Sender: $sender"; $from = 1; } if ($_ =~ /^To:/) { $to = 1; } if ($_ =~ /^Cc:/) { $cc = 1; } if ($_ =~ /^Disposition-Notification-To:/) { print FILEOUT "Disposition-Notification-To: $fullname <$email>\n"; $replace = 1; } if (!$from && !$to && !$cc && !$replace) { print FILEOUT $_; } } # обработка тела письма if ($body) { print FILEOUT $_; }

    }

    close(FILEOUT);
    close(FILEIN);

    # Перемещаем обработанный файл с письмом     if (!copy($mail_write, $mail_sub)) {

        # Open debug
        open(LogFile, '>>'.$debugfile) || die;
        print LogFile "$datetime Command: move($mail_write, 
$mail_sub)\nError: $!\n";
        # Close debug
        close(LogFile);
    } else {
            open(LogFile, '>>'.$debugfile) || die;
        print LogFile "$datetime Send: from $realfrom as $email to 
$recipient\n";
        close(LogFile);

    }
    unlink($mail_write);
}

############################################################################

# Удаляем исходный файл с письмом

unlink($mail_read);

#close(FILEDEBUG);

exit 0;

rujet пишет:

> ы писали 7 июня 2007 г., 13:32:50:
> Alex Согласен. Пришлите пожайлуста.
>
>> Скрипт могу дать... Но для внутрених целей и в нем возможны ошибки...
>
>> rujet пишет:
>>> Было бы проще. Если бы не приказы сверху :)
>>> Странно, что это реализуется лишь внешними обработчиками.
>>> В других программах для домена можно настроить внешний алиас
>>>
>>>
>>> ##################################################################
>>> Вы получили это сообщение потому, что подписаны на список рассылки
>>>   <CGatePro@mx.ru>.
>>>
>>> Чтобы отписаться, отправьте сообщение на адрес <CGatePro-off@mx.ru>
>>> Чтобы переключиться в режим дайджеста - mailto:<CGatePro-digest@mx.ru>
>>> Чтобы переключиться в индексный режим - mailto:<CGatePro-index@mx.ru>
>>> Для административных запросов адрес <CGatePro-request@mx.ru>
>>> Архив списка: http://mx.demos.su/lists/cgp-russian/
>>>
>>>
>>>
>>>
>>>
>>>
>
>
> ##################################################################
> Вы получили это сообщение потому, что подписаны на список рассылки
>   <CGatePro@mx.ru>.
>
> Чтобы отписаться, отправьте сообщение на адрес <CGatePro-off@mx.ru>
> Чтобы переключиться в режим дайджеста - mailto:<CGatePro-digest@mx.ru>
> Чтобы переключиться в индексный режим - mailto:<CGatePro-index@mx.ru>
> Для административных запросов адрес <CGatePro-request@mx.ru>
> Архив списка: http://mx.demos.su/lists/cgp-russian/
>
>
>
>
>
Получено Thu Jun 07 08:55:10 2007

Этот архив был сгенерирован hypermail 2.1.8 : Thu 07 Jun 2007 - 13:13:52 MSD