Функция сокета Perl для подключения к SMTP-серверу
Я просто хотел написать свой собственный Perl-скрипт для отправки электронной почты через почтовый сервер моего интернет-провайдера. Поскольку меня интересует встроенная функция сокетов Perl, я начал экспериментировать с ней (я уже написал несколько небольших инструментов с IO::Socket, и я хочу улучшить свои знания по встроенной функции). Мой текущий код:
use Socket;
use diagnostics;
my $port = 25;
my $server = "<Servername>";
socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname("tcp"));
my $inetaddress = inet_aton($server);
my $peeraddress = sockaddr_in($port, $inetaddress);
connect(SOCKET, $peeraddress);
my $answer = <SOCKET>;
#sysread(SOCKET, my $answer, 200);
print "Answer was: ".$answer."\n";
print SOCKET "EHLO <domain>\n";
#syswrite(SOCKET,"EHLO <Domainname>\n", length("EHLO <Domainname>\n"));
$answer = <SOCKET>;
print "Answer was: ".$answer."\n";
close(SOCKET);
#shutdown(SOCKET, 1);
Моя проблема: я получаю первую строку SMTP ("220 [...] готово"). После этого он просто останавливается, как будто сервер не получил от меня "EHLO"-линию. После определенного времени ожидания соединения, и я получаю это напечатанное на экране вместо ожидаемых "250 OK" после моего "EHLO". Комментарии были попытками, которые не решили проблему. Есть идеи?
РЕДАКТИРОВАТЬ: Я знаю, что есть некоторые хорошие модули на CPAN, но это для обучения и для удовольствия, так что это не помогает.
1 ответ
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use Socket;
my $port = 587;
my $server = "smtp.live.com";
my $inetaddress = inet_aton($server);
my $peeraddress = sockaddr_in($port, $inetaddress);
my $answer;
socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname("tcp"))
or die "Can't open socket $!\n";
connect(SOCKET, pack_sockaddr_in($port, $inetaddress))
or die "Can't connect to port $port!\n";
print SOCKET "EHLO $server\n";
while ($answer = <SOCKET>) {
print "Answer was: $answer\n";
}
close(SOCKET) or die "Can't close socket: $!";
__OUTPUT__
Answer was: 220 BLU436-SMTP163.smtp.hotmail.com Microsoft ESMTP MAIL Service, Ve
rsion: 8.0.9200.16384 ready at Sat, 24 May 2014 13:19:57 -0700