use IO::Socket; sub send_mail { my %value = @_ ; my %res = ( 'error' => '' , 'comment' => "Open Socket\n" , 'status' => 0 ) ; my @work = ( [ '' , '220' , 'Communication with SMTP' ] , [ 'HELO robot' , '250' , 'Hello Serveur' ] , [ 'MAIL FROM: ' , '250' , 'Insert RETURN PATH adress' ] , [ 'RCPT TO: ' , '250' , 'Insert RECIENT adress' ] , [ 'DATA' , '354' , 'Ask to send DATA' ] , [ '' , '250' , 'Send DATA' ] , [ 'QUIT' , '221' , 'Ask to QUIT' ] ); $|=1; my $result = 0 ; my $reponse ; my $serveur = IO::Socket::INET->new( PeerAddr => $value{smtp} , PeerPort => '25' , Proto => 'tcp' , Type => SOCK_STREAM , Timeout => 15 ) or return ( 'error' => "Error when open Socket -($!)-\n" , 'statut' => 0 , 'comment' => '' ); for (@work) { my @element = @$_ ; if ( $element[0] ne '' ) { $element[0] =~ s//\r\n/sgi; $element[0] =~ s/]+?)>/$value{$1}/sgi ; print $serveur $element[0]; } $reponse = <$serveur>; if ($reponse =~ /^$element[1]/sgi) { $res{'comment'}.= $element[2]."\n"; } else { $res{error} = "error when $element[2] -($!)- " ; return %res ; } } $res{'statut'} = 1 ; return %res; } %test = ( 'return-path' => 'automatic_traitment@your_domain.com' , 'to' => 'my_friend@his_home.com' , 'smtp' => 'localhost' , 'message' => "To: Friend from: Me Subject: Test on line TEST ON LINE . " ); send_mail ( %test ) ;