>>>Требуется установить промежуточный сервер для приема и отсылки почты.
>>>Сейчас почта работает через smart-host наружу, раздача внутри доменых
>>>пользователей, -понятно- по pop3.
>>>Что-то не соображу, с помощью чего это можно сделать?
>>
>>Привет!
>>http://www.coruscant.demon.co.uk/mike/sendmail/examples.html
>>Это конфигурация почтового хаба под sendmail. Перегоняет через себя входящую и исходящую
>>почту. Во время приема производит проверку только домена. Для включения проверки
>>и имен юзеров нужно добавить:
>>FEATURE(`blacklist_recipients')
>>И работать с access - файлом.
>>http://www.opennet.dev/openforum/vsluhforumID1/38136.html - здесь все это обсуждалось.
>>Если у тебя внутри Exchange, могу поделиться опытом автоматического переноса списка существующих
>>адресов.
>Ага если не сложно и не жалко поделись, очень обяжешь
Ok! Если чего-то не понятно, уточняй.
Перенос ведется с помощью программы ADMIN.exe (exchange administrator) под 5.5. Файл со всем барахлом выкладывается на FTP машины с Exсhange, оттуда он забирается машиной-mail-hub, из него выдираются e-mail-адреса и происходит сборка access-файла (Perl-скрипт)
Содержимое bat-файла на Exchange:
copy C:\admin\userexport\exportfields.txt C:\admin\userexport\exchusers_abby.txt
D:\Programs\Ex\bin\ADMIN.EXE /e C:\admin\userexport\exchusers_abby.txt /n /o C:\admin\userexport\userexport_abby.ini
Содежимое exportfields.txt
Obj-Class tab E-mail addresses tab Secondary-Proxy-Addresses
tab - в смысле табуляция (поля задаем)
Содержимое userexport_abby.ini
[Export]
DirectoryService=имя_сервера_Exchange
Basepoint=
ExportObject=All
InformationLevel=Minimal
BasepointOnly=No
RawMode=No
HiddenObjects=Yes
Subcontainers=No
CodePage=0
; 09 = TAB
ColumnSeparator=09
; 37 = %
MVSeparator=37
; 34 = "
QuoteCharacter=34
Все это копирование и остальной изврат с ini - файлами сделаны для экспорта всех адресов, по умолчанию экспортируются только reply-адреса и то, только маилбоксов, не групп.
На FreeBSD для автоматического скачивания поставил lftp-2.6.11
Скрипт на перле-скачивает файло, вытаскивает адреса, формирует и запускает access-файл, следит за тем чтобы ненароком не сотворить глупостей (чтобы все адреса не потереть, такое было :)) и отсылает отчеты о сделанных изменениях. Я не программер, так что извиняйте за возможную топорность.
#!/usr/bin/perl -w
use strict;
my $input = "/etc/mail/userexport";
my $output = "/etc/mail/userexport/access_mailboxes";
my $access = "/etc/mail/access";
my $access_mailboxes = "/etc/mail/userexport/access_mailboxes";
my $access_new = "/etc/mail/userexport/access_new";
my $access_global = "/etc/mail/userexport/access_global";
my $ourdomains = "/etc/mail/userexport/ourdomains";
my $exception = "/etc/mail/userexport/exception";
my $message = "/etc/mail/userexport/message";
my $log = "/etc/mail/userexport/log";
my @ourdomains;
my @exception;
my @mailboxes;
my @old_mailboxes;
my @added_strings;
my @deleted_strings;
my $l;
my $k;
my $string;
my $result;
my $domain;
my $address;
my @fields;
my $count=0;
my $old_count=0;
system "cd /etc/mail/userexport";
system "/usr/local/bin/lftp -e 'set ftp:passive-mode off && mget -E /Mail/userexport/exchusers*.txt && bye' -u user,pass mail.inel.ru";
open OURDOMAINS, "$ourdomains" or die "Cannot find $ourdomains\n";
while (<OURDOMAINS>) {
chomp;
push @ourdomains, $_;
}
close OURDOMAINS;
open EXCEPTION, "$exception" or die "Cannot find $exception\n";
while (<EXCEPTION>) {
chomp;
push @exception, $_;
}
close EXCEPTION;
open OUTPUT, "$output" or die "Cannot find $output\n";
while (<OUTPUT>) {
$old_count ++;
push @old_mailboxes, $_;
}
close OUTPUT;
foreach (<$input/exchusers_*>) {
open INPUT, "$_" or die "Cannot find $_\n";
while (<INPUT>) {
@fields = split /smtp/i, $_;
foreach (@fields) {
if (/:(.*@.*\.\w*)/) {
$address = $1;
$domain = ($1 =~ /^.*@(.*\.\w*$)/);
$domain = $1;
foreach (@ourdomains) {
if ($domain eq $_) {
$result = "noexception";
foreach (@exception) {
$result = "excpetion" if ($address eq $_);
}
if ($result eq "noexception") {
$count ++;
$string = "To:\L$address\E\t\tRELAY\n";
push @mailboxes, $string;
}
}
}
}
}
}
}
foreach $l (@old_mailboxes) {
$result = "noconcur";
foreach $k (@mailboxes) {
$result = "concur" if ($l eq $k);
}
push @deleted_strings, $l if ($result eq "noconcur");
}
foreach $l (@mailboxes) {
$result = "noconcur";
foreach $k (@old_mailboxes) {
$result = "concur" if ($l eq $k);
}
push @added_strings, $l if ($result eq "noconcur");
}
#die "Warning, to much changes!!!\nWas:\t$old_count\nNow\t$count\n" if ($old_cou
nt - $count > 10 || $count - $old_count > 10);
if ($old_count - $count > 10 || $count - $old_count > 10) {
system 'cat /etc/mail/userexport/toomuch | mail -s "Mail base, warning"
admin@inel.ru';
system 'cat /etc/mail/userexport/toomuch | mail -s "Mail base, warning"
serge@inel.ru';
die;
}
open OUTPUT, ">$output" or die "Cannot find $output\n";
foreach (@mailboxes) {
# print "$_";
print OUTPUT "$_";
}
close OUTPUT;
print "deleted_strings\n @deleted_strings\n";
print "added_strings\n @added_strings\n";
print "Total was addresses: $old_count\n";
print "Total addresses: $count\n";
if ($count != $old_count) {
print "Sending letter\n";
open ACCESS_NEW, ">$access_new" or die "Cannot find $access_new\n";
open ACCESS_MAILBOXES, "$access_mailboxes" or die "Cannot find $access_mailboxes\n";
while (<ACCESS_MAILBOXES>) {
print ACCESS_NEW "$_";
}
close ACCESS_MAILBOXES;
open ACCESS_GLOBAL, "$access_global" or die "Cannot find $access_global\n";
while (<ACCESS_GLOBAL>) {
print ACCESS_NEW "$_";
}
close ACCESS_NEW;
close ACCESS_GLOBAL;
my $date = `date "+%d%-%m-%Y_%H:%M:%S"`;
system "cp $access $access\_\_$date";
sleep 1;
system "cp $access_new $access";
print "$access file relaced,\nold file named $access\_\_$date";
sleep 1;
system "cd /etc/mail";
system "chown -R root /etc/mail/";
system "makemap hash /etc/mail/access < /etc/mail/access";
system "chown -R mailnull /etc/mail/";
open MESSAGE, ">$message" or die "Cannot find $message\n";
print MESSAGE "deleted_strings\n @deleted_strings\n";
print MESSAGE "added_strings\n @added_strings\n";
print MESSAGE "Total was addresses: $old_count\n";
print MESSAGE "Total addresses now: $count\n";
print MESSAGE "$access file relaced,\nold file named $access\_\_$date";
close MESSAGE;
system 'cat /etc/mail/userexport/message | mail -s "Mail base" admin@domain.ru';
}