2011-11-01 37 views
1

好的,我刚刚花了四个小时试图弄清为什么我的Net :: SMTP模块的实现不再有效。Perl Net :: SMTP - 如何使用

总之,我这样做(除去错误检查工具和清晰度):

my $smtp = Net::SMTP->new(Host => $host); 
$smtp->send($from); 
$smtp->data; 
$smtp->datasend($message); 
$smtp->dataend; 
$smtp->quit; 

这曾经工作过,但现在我是越来越:

Net::SMTP=GLOB(0x7f9893114798)>>> SEND FROM:<[email protected]> 
Net::SMTP=GLOB(0x7f9893114798)<<< 450 Unable to send to "<[email protected]" at this time 

这是从我的send方法。

中的Perldoc是没有太多的帮助,因为sendsend_and_mailsend_or_mail,并mail命令都描述在一起,我本以为是对方的相当多的别名。

我看了其他的例子,并决定尝试$smtp->mail而不是$smtp->send这工作。

那么,send,mail,send_and_mailsend_or_mail方法之间有什么区别?我需要尝试每一个吗?我知道它们对应于SMTP中的MAIL,SEND,SOMLSAML命令,但我无法真正找到任何能够告诉我有什么区别的东西。而且,不同的SMTP服务器使用不同的命令。 (也许这就是为什么send方法以前工作过吗?)

+0

对MAIL,SEND,SOML和SAML之间差异的很好解释:http://cr.yp.to/smtp/send.html –

+0

感谢您的链接。 –

回答

3

Net::SMTP文档提到,你应该熟悉SMTP协议,目前指定为RFC5321Appendix F.6 of RFC5321讨论了现在已过时的SEND命令(它应该直接向终端发送消息,但很少实现,有些服务器可能会将其解释为)的代名词。)

简短版本是你应该使用MAIL通讯和。或者,更好的是,像Email::Sender这样的更高级别的模块。

+0

感谢您的链接到附录。现在,我知道这些命令是做什么的。 –

2

RFC 5321, appendix F.6

“除了指定的机制邮件传递到 用户的邮箱中,RFC 821提供了额外的,可选的命令 交付这些 命令(SEND,SAML,SOML)很少实现,并且工作站技术的变化和其他协议的引入可能会使它们即使在实现它们的地方也被废弃。

“客户不应将SEND,SAML或SOML作为服务提供。服务器 可以实施它们。如果他们是由服务器来实现,在RFC 821中规定的 实现模型必须被使用,并且 命令名称必须与响应EHLO命令予以公布。”

+1

耶,历史!我猜OP想用$ smtp-> mail($ from);因为大约15年:) – themel

+0

我以前曾经与Solaris机器讨论过SMTP,我猜他们有'SEND'或多或少是'MAIL'命令的别名。现在,我看到附录,我知道这四个命令之间的区别。现在我可以看到为什么'send'已经过时了。 –