2007年5月6日 星期日

postfix mail_filtering part-2

#!/usr/bin/perl

use IO::Socket;
$remote_host= "127.0.0.1";
$remote_port= 10026;
$server_port= 10025;
$server= IO::Socket::INET->new(LocalPort => $server_port,
Type => SOCK_STREAM,
Reuse =>1,
Listen =>10)
or die "Cant be tcp server on port $server_port : $@\n";
$tosmtpd = new IO::Socket::INET (PeerAddr => $remote_host,
PeerPort => $remote_port,
Proto => "tcp",
Type => SOCK_STREAM)
or die "Can't connect to $remote_host:$remote_port : $!\n";


# Or use the simpler single-argument interface.
#$socket = IO::Socket::INET->new("$remote_host:$remote_port");
# "localhost:80", for example.

#print $socket "data\n";
#$line = <$socket>;
open SEADOG , ">>" , '1lo.log';
$server->listen();
$server->autoflush(1);
my $client;
my $back1 = "250-wh101.11f1.com \n250-PIPELINING \n250-SIZE 10240000 \n250-VRFY \n250-ETRN \n250 8BITMIME";
my $end_value_0;
##--------------------------------------------------
while ($client = $server->accept()) {
print SEADOG "work $_";
#$request = <$server>;
print "Connecting ", $client->peerhost() , " \n";
print $client "220 wh101.11f1.com ESMTP Ting \r\n";
my $read_string_control1= 1 ;
while($read_string_control1) {
$_=(<$client>) ;
my $operation = $_;
#$operation =~ /[\r\n]/ ;
my($verb, $params) = &tokenize_command($operation);
print "Receive1: => $verb <= $params \n"; if ($verb eq "EHLO" ) {$server_sender = $back1 ; } elsif ($verb eq "MAIL" ) {$server_sender = "250 Ok" ; } elsif ($verb eq "RCPT" ) {$server_sender = "250 Ok" ; } elsif ($verb eq "DATA" ) {$server_sender = "354 End data with ." ;
} elsif ($verb eq "RSET" ) {$server_sender = "250 Ok" ;
} elsif ($verb eq "QUIT" ) {$server_sender = "221 Bye" ;
$read_string_control1=0 ;
} else {$server_sender = "" ;}
print $client "$server_sender \n" ;
};
close $client;
#print $client "250 OK\n";
}
##----------------------------------------------------
print SEADOG "$request \n";
print SEADOG "$ARGV[0] \n";
print $tosmtpd "$request \n";
$line = <$tosmtpd>;
close(SEADOG) ;
close($server);

print $ARGV[0];

sub init() {
my $ack1 = "250-wh101.11f1.com \n250-PIPELINING \n250-SIZE 10240000 \n250-VRFY \n250-ETRN \n250 8BITMIME \n";


}
#========================
sub process_operation {
my($operation) = @_;
my($verb, $params) = &tokenize_command($operation);
if(defined $params && $params =~ /[\r\n]/)
{
# doesn't support grouping of operations
print $client "453 Command received prior to completion of".
" previous command sequence \n";
return;
}else {
&process_command($verb, $params);
}
}
#===========================
sub process_command
{
my($verb, $params) = @_;
my $self;
$self->def_verb(HELO => 'helo');
$self->def_verb(VRFY => 'vrfy');
$self->def_verb(EXPN => 'expn');
$self->def_verb(TURN => 'turn');
$self->def_verb(HELP => 'help');
$self->def_verb(NOOP => 'noop');
$self->def_verb(MAIL => 'mail');
$self->def_verb(RCPT => 'rcpt');
$self->def_verb(SEND => 'send');
$self->def_verb(SOML => 'soml');
$self->def_verb(SAML => 'saml');
$self->def_verb(DATA => 'data');
$self->def_verb(RSET => 'rset');
$self->def_verb(QUIT => 'quit');
if(exists $self->{verb}->{$verb})
{
return ;
}
else
{
print $client "500 Syntax error: unrecognized command \n";
return;
}
}

sub tokenize_command() {
my ($line) = @_;
$line =~ s/\r?\n$//s;
$line =~ s/^\s+|\s+$//g;
my($verb, $params) = split ' ', $line, 2;
return(uc($verb), $params);
}

沒有留言: