我只是想编写自己的 Perl 脚本来通过我的 ISP 的邮件服务器发送电子邮件。因为我对 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”行。在特定时间后,连接超时,我在屏幕上打印出来,而不是在我的“EHLO”之后预期的“250 OK”。
注释行是没有解决问题的尝试。有任何想法吗?
编辑:我知道 CPAN 上有一些很好的模块,但它是为了学习和娱乐,所以这无济于事。
最佳答案
#!/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
关于sockets - Perl 套接字函数连接到 SMTP-Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23608330/