sockets - Perl 套接字函数连接到 SMTP-Server

标签 sockets network-programming perl

我只是想编写自己的 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/

相关文章:

perl - 我可以在 Perl 中使用 sprintf 为数字指定最大精度宽度吗?

perl - 如果 AUTOLOAD 失败,则传递错误消息

java - 在没有服务器的情况下建立平等客户端的双向 TCP 通信的最佳方法是什么?

使用套接字在两台计算机之间复制目录

node.js - Socket.io pinginterval 对服务器性能的影响

java - 为什么我得到 “Address already in use (Bind failed)” ?

perl - 为什么我不能在new里面初始化成员变量?

c++ - 套接字发送调用被阻塞了这么久

c++ - C++ 模块之间的数据传输

linux - 识别c中的虚拟网络接口(interface)