Функция сокета 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
Другие вопросы по тегам