1. Добавляем в постфикс след строку
[root@bc ~]# cat /usr/local/etc/postfix/main.cf | grep bcc
always_bcc=backup@domen.ru
Теперь ВСЯ почта будет дублироваться этому пользователю.
2. Создаем этого почтового пользователя.
3. Редактируем крон[root@bc ~]# cat /etc/crontab | grep big
57 */2 * * * root /mnt/big/backup_mail/list_mail_users.pl
59 */2 * * * root /mnt/big/backup_mail/all.sh
0 */2 * * * root /mnt/big/backup_mail/mail_backup.pl –q
Скрипты выглядят так.(скриптописатель из меня никакой – буду признателен за любые исправления)
4. Тут мы получаем список наших почтовых пользователей и засовываем его во временный файл.
[root@bc /mnt/big/backup_mail]# cat list_mail_users.pl
#!/usr/bin/perl
unlink ("/mnt/big/backup_mail/111");
#`rm /mnt/big/backup_mail/vusers`;
opendir (TEMPDIR,'/var/spool/mail') || die "Не могу открыть каталог /var/spool/mail: $!";
@FILES=grep(!/^\.\.?/, readdir TEMPDIR);
closedir(TEMPDIR);
foreach (@FILES) {
$_="$_ /var/spool/mail/$_";
`echo "$_" >> /mnt/big/backup_mail/111`;
}
5. Тут мы всего лишь меняем слеш в другую сторону ((( ну не умею я кодить(((
[root@bc /mnt/big/backup_mail]# cat all.sh
#!/bin/sh
sed 's/\(.*\)@/\1\\@/' 111 > vusers
6. Тут немного уличной магии (вот этот скрипт уже не мой. Но все замечания только приветствуются)
[root@bc /mnt/big/backup_mail]# cat mail_backup.pl
#!/usr/bin/perl
#
# vars
use Log::LogLite;
$LOG_DIRECTORY = "/mnt/big/backup_mail";
$ERROR_LOG_LEVEL = 6;
$CALLER="mail_backup.pl";
# create new Log::LogLite object
$log = new Log::LogLite($LOG_DIRECTORY."/backup.log", $ERROR_LOG_LEVEL);
use File::Copy;
$backup_path="/mnt/big/backup_mail/mail"; #куда копируется ВСЯ почта
$bcm_path="/var/spool/mail/backup\@domen.ru/new"; #откуда, с какого ящика
$config_path="/mnt/big/backup_mail/vusers"; #где находятся все пользователи домена
#$banner="E-mail backup & sorting program by ONYX.\n";
#print $banner;
#attempt to read postbackup maildir
opendir(MDIR,"$bcm_path") or die "Cant find postbackup maildir! Check $bcm_path for existense.\n";
@files=readdir(MDIR);
closedir(MDIR);
if (scalar(@files)==2) #abort if no mail to backup
{
$log->write("No mails to backup! Aborted.",$CALLER);
die "No mails to backup! Aborted.\n";
}
#finded files
print "The following mails will be stored:\n\n";
for ($j=2;$j <= scalar(@files)-1;$j++)
{
print "$files[$j]\n";
}
printf("\nTotal: %d mails.\n",scalar(@files)-2);
#yes_no confirmation
if (!defined($ARGV[0]) or $ARGV[0] ne "-q")
{
print "\nConfirm? [y/n]: ";
$yes_no=<STDIN>;
chop($yes_no);
if ($yes_no ne 'y')
{
die "Not confirmed. Type 'y' to confirm! Aborted.\n";
}
}
#reading the config file
open(CONF,"$config_path") or die "Cant read postfix config! Check $config_path for existense.\n";
$e=0;
while (<CONF>)
{
if ($_=~m|(\S+)|)
{
$config[$e]=$1;
$e++;
}
}
close(CONF);
#ok, here we go
chdir($bcm_path);
$lc=0;
for ($i=2;$i <= scalar(@files)-1;$i++)
{
@content=0;
open(MFILE,"$files[$i]") or die "Cant open $files[$i]! checkit.\n";
while ($line=<MFILE>)
{
$content[$lc]=$line;
if ($line=~m|X-Anti-Virus|i)
{
last;
}
$lc++;
}
close(MFILE);
for ($q=0;$q <= scalar(@content)-1;$q++)
{
#chop($content[$q]);
if ($content[$q]=~m|^From:.+<(\S+)>|i)
{
if ($il=is_local(@config,$1)) #if sender is local...
{
$ret=backup_mail($files[$i], $1,"out"); #store the mail in his out dir
print "$ret";
}
}
if ($content[$q]=~m|^\tfor <(\S+)>|)
{
if ($il=is_local(@config,$1)) #if recipient is local
{
$ret=backup_mail($files[$i], $1,"in"); #store the mail in his in dir
print "$ret";
}
}
}
unlink($files[$i]) and print " *******$files[$i] deleted.\n";
}
$log->write((scalar(@files)-2)." mails backed up OK.",$CALLER);
exit 1;
sub backup_mail()
{
mkdir("$backup_path/$_[1]");
mkdir("$backup_path/$_[1]/out");
mkdir("$backup_path/$_[1]/in");
if ($_[2] eq "out")
{
copy("$_[0]","$backup_path/$_[1]/out/$_[0]") or return "Cant copy to $backup_path/$_[1]/out/$_[0]! Check it.\n";
return "$backup_path/$_[1]/out/$_[0]\t\tOK\n";
}
else
{
copy("$_[0]","$backup_path/$_[1]/in/$_[0]") or return "Cant copy to $backup_path/$_[1]/in/$_[0]! Check it.\n";
return "$backup_path/$_[1]/in/$_[0]\t\tOK\n";
}
}
sub is_local()
{
for ($r=0;$r <= scalar(@_)-2;$r++)
{
if ($_[scalar(@_)-1] eq $_[$r])
{
return 1;
}
}
return 0;
}
Теперь по адресу /mnt/big/backup_mail/mail у нас есть папки со всеми нашими почтовыми пользователями
[root@bc /mnt/big/backup_mail/mail]# ls
abramova@domen.ru lagutina@domen.ru
lebedev@domen.ru
a.melnikov@domen.ru len@domen.ru
abdullin@domen.ru lepeshkina@domen.ru
lipatova@domen.ru
admin@domen.ru logina@domen.ru
в которых есть папки IN и OUT соответственно отправленные и полученные письма.
Если надо вытаскивать почту дата/ин/оут пр. скриптом тоже могу прислать