perl利用Net::smtp发送邮件异常?【解决】

perl利用Net::smtp发送邮件异常?【解决】

小弟想不想利用本机的sendmail进行邮件的发送,想利用perl通过Net::smtp模块进行邮件发送,以下是程序代码,但是在发送的时候出现异常:

#!/usr/bin/perl

use strict;
use warnings;
use Net::SMTP;

my $mailhost='smtp.163.com';
my $mailfrom='123@abc.com';
my @mailto=('xxxx@163.com');

my $subject='hello';
my $text='you is good';

my $user = 'aaa@163.com';
my $passwd = '123456';

my $smtp=Net::SMTP->new($mailhost, Timeout=>120, Debug=>1) or die "Error.\n";
$smtp->auth('$user','$passwd');


foreach my $mailto(@mailto) {
$smtp->mail($mailfrom);
$smtp->to($mailto);
$smtp->data();
$smtp->datasend("To: $mailto\n";
$smtp->datasend("Frommailfrom\n";
$smtp->datasend("Subject: $subject\n";
$smtp->datasend("\n";
$smtp->datasend("$text\n\n";
$smtp->dataend();
}

$smtp->quit;



运行程序后,出现下面的错误提示


Net::SMTP>>> Net::SMTP(2.29)
Net::SMTP>>>   Net::Cmd(2.26)
Net::SMTP>>>     Exporter(5.5
Net::SMTP>>>   IO::Socket::INET(1.27)
Net::SMTP>>>     IO::Socket(1.2
Net::SMTP>>>       IO::Handle(1.24)
Net::SMTP=GLOB(0x95927d4)<<< 220 163.com Anti-spam GT for Coremail System (163com[071018])
Net::SMTP=GLOB(0x95927d4)>>> EHLO localhost.localdomain
Net::SMTP=GLOB(0x95927d4)<<< 250-mail
Net::SMTP=GLOB(0x95927d4)<<< 250-PIPELINING
Net::SMTP=GLOB(0x95927d4)<<< 250-AUTH LOGIN PLAIN
Net::SMTP=GLOB(0x95927d4)<<< 250-AUTH=LOGIN PLAIN
Net::SMTP=GLOB(0x95927d4)<<< 250 8BITMIME
Net::SMTP=GLOB(0x95927d4)>>> MAIL FROM:<123@abc.com>
Net::SMTP=GLOB(0x95927d4)<<< 553 Requested action not taken: Local user only,smtp9,DcCowLDrONR8u+5I9KXohQ==.57009S2 1223605116
Net::SMTP=GLOB(0x95927d4)>>> RCPT TO:<xxxx@163.com>
Net::SMTP=GLOB(0x95927d4)<<< 503 bad sequence of commands
Net::SMTP=GLOB(0x95927d4)>>> DATA
Net::SMTP=GLOB(0x95927d4)<<< 503 bad sequence of commands
Net::SMTP=GLOB(0x95927d4)>>> To: xxxx@163.com
Net::SMTP=GLOB(0x95927d4)>>> From:123@abc.com
Net::SMTP=GLOB(0x95927d4)>>> Subject: hello
Net::SMTP=GLOB(0x95927d4)>>> you is good
Net::SMTP=GLOB(0x95927d4)>>> .
Net::SMTP=GLOB(0x95927d4)<<< 502 Error: command not implemented
Net::SMTP=GLOB(0x95927d4)>>> QUIT
Net::SMTP=GLOB(0x95927d4)<<< 502 Error: command not implemented


哪位大哥能帮小弟看看,请指点,谢谢!

你可以看看RFC821和RFC2821搞清楚SMTP协议

你的ESMTP提交验证信息没有通过,<123@abc.com>这个肯定是不对的
强,一眼看出问题所在
需要安装一下 Authen::SASL 模块。
abc的域无法登录到163的
smtp.163.com 设置规定 发送者必须先提供smtp auth认证
要想发信又不通过sendmail进行邮件的发送,那你的163邮箱必须支持smtp发送。要就是类似,您可以通过foxmail或outlook工具登录你的163邮局并收发邮件。

据我所知,163的免费邮局是不支持smtp吧!


QUOTE:
原帖由 myfifi 于 2008-10-14 07:44 发表
据我所知,163的免费邮局是不支持smtp吧!

当然是支持的。


QUOTE:
原帖由 myfifi 于 2008-10-14 07:44 发表
要想发信又不通过sendmail进行邮件的发送,那你的163邮箱必须支持smtp发送。要就是类似,您可以通过foxmail或outlook工具登录你的163邮局并收发邮件。

据我所知,163的免费邮局是不支持smtp吧!

给你一个可行的建议,申请一个163邮箱,比如:XXX@163.com
再使用这个邮箱登陆就可以发信了


QUOTE:
原帖由 chenzq1604 于 2008-10-14 10:49 发表


给你一个可行的建议,申请一个163邮箱,比如:XXX@163.com
再使用这个邮箱登陆就可以发信了

谢谢,这个问题已经解决了。附上代码:

#!/usr/bin/perl -w

use strict;
use Net::SMTP_auth;

my $mailhost = 'mail.abc.cn';
my $mailfrom = '120@abc.cn';
my @mailto = ('aaa@163.com',
              'bbb@163.com');

my $user = '120@abc.cn';
my $passwd = '123456';

my $subject = 'hello';

#my $text

my $f_list = '/home/sysadmin/scp.log';
open(FILE, $f_list) or die "Can not open list file\n";
undef $/;
my $text = <FILE>;


my $smtp = Net::SMTP_auth->new($mailhost, Timeout=>120, Debug => 1) or die "Error.\n";
$smtp->auth('LOGIN', $user, $passwd);

foreach my $mailto(@mailto) {
$smtp->mail($mailfrom);
$smtp->to($mailto);
$smtp->data();
$smtp->datasend("To: $mailto\n";
$smtp->datasend("Frommailfrom\n";
$smtp->datasend("Subject: $subject\n";
$smtp->datasend("\n";
$smtp->datasend("$text\n\n";
$smtp->dataend();
}

$smtp->quit;


申请个163的邮箱就ok了! 163支持smtp,主机写上 smtp.163.com 就可以了