Я с PERL только начал заниматься, а тут приспичило написать прогу которая соединяется по SMTP и отправляет письмо.
Я прогу нашел коечто урезал НО в одном месте ошибка не знаю как сделать правильно.
print smtp("mail.ru",\%m,"Hello","primer@mail.ru","primer2@mail.ru","Telo soobshenia","dgxyZrI="(это имя пользователя и пароль в Base64),"6zlrM5A6MTFy");
my($server,$g,$subject,$from,$to,$mdata,$user,$pass)=@_;
my($port,$iaddr,$paddr,$proto);
local(*SOCK);$crlf="\r\n";
($server,$port)=split(/:/,$server,2);
# если порт не задан используем 25
$port = 25 if !$port;
# создаем сокет
$iaddr = gethostbyname($server) or die $!;
$paddr = sockaddr_in($port,$iaddr);
$proto = getprotobyname("tcp") or die $!;
socket(SOCK,PF_INET,SOCK_STREAM,$proto) or return "Cannot create socket: $!";
# соединяемся
connect(SOCK,$paddr) or return "Connect to $server failed: $!";
# получаем банер
chomp($banner = <SOCK>);
# идентифицируем себя
send(SOCK,"helo $server$crlf",0) or die $!;
chomp($data = <SOCK>);
if($data =~ /^2/){
if($user and $pass){
send(SOCK,"auth login$crlf",0);
chomp($data=<SOCK>);
if($data =~ /^3/){
# если мы попали сюда значит все ОК
# посылаем логин
send(SOCK,"$user$crlf",0);
chomp($data=<SOCK>);
# посылаем пароль
send(SOCK,"$pass$crlf$crlf",0);
chomp($data=<SOCK>);
if($data =~ /^5/i){
# если авторизация не удалась вернули, закрыли сокет и
# вернули ответ сервера
close(SOCK);
return $data;
}
}else{
return $data;
}
}
send(SOCK,"mail from: $from$crlf",0); #Вот здеся у меня SMTP сервер говорит неизвестная команда потому что @воспринимается как массив и получается primer.ru, а надо primer@mail.ru если сделать так primer\@mail.ru говорит неизвестная команда все равно, вообщем здесь у меня дальше не проходит. Помогите.)
chomp($data = <SOCK>);
if($data =~ /^5/i){
close(SOCK);
return $data;
}else{
send(SOCK,"rcpt to: $to$crlf",0);
chomp($data=<SOCK>);
if($data =~ /^5/i){
close(SOCK);
return $data;
}
}
$mdata.="From: $from$crlf";
$mdata.="To: $to$crlf";
# добавляем всякие поля...
$mdata.="Reply-To: $from$crlf";
$mdata.="Subject: $subject$crlf";
$mdata.="Content-Type: text/html; charset=\"windows-1251\"";
$mdata.=$crlf.$crlf;
# вызываем команду data
send(SOCK,"data$crlf",0);
chomp($data=<SOCK>);
# если она поддерживается код ответа сервера должен быть - продолжать (т.е. 3)
if($data =~ /^3/i){
# посылаем данные
send(SOCK,"$mdata$crlf",0);
# посылаем конец данных, т.е. <CRLF>.<CRLF>
send(SOCK,"$crlf.$crlf",0);
chomp($data=<SOCK>);
if($data !~ /^2/){
close(SOCK);
return $data;
}
# завершаем сессию и возвращаем Dropped
send(SOCK,"quit$crlf",0);
close(SOCK);
return "Dropped";
}else{
close(SOCK);
return $data;
}
}else{
close(SOCK);
return $data;
}
}