尝试使用Net :: SMTP :: SSL发送经过身份验证的电子邮件

时间:2014-03-22 04:25:28

标签: perl email authentication ssl smtp

我正在尝试将带有Net :: SMTP :: SSL模块的经过身份验证的电子邮件发送到comcast电子邮件服务器。我正在使用以下代码。

#!/usr/bin/perl

use Net::SMTP::SSL;
use MIME::Base64;

$smtp = Net::SMTP::SSL->new
    (
    "smtp.comcast.net",
    Hello => "host.comcast.net",
    Port => 465,
    Timeout => 30,
    Debug => 1,
    );
$smtp->datasend("AUTH LOGIN\n");
$smtp->response();

# Mailbox info
$smtp->datasend(encode_base64('username')); # username
$smtp->response();
$smtp->datasend(encode_base64('password')); # password
$smtp->response();

# Email from
$smtp->mail('user\@comcast.net');

# Email to
$smtp->to('user\@host.com');

$smtp->data();

$smtp->datasend("To: user\@host.com\n");
$smtp->datasend("From: user\@comcast.net\n");
$smtp->datasend("Subject: Test");

# Line break to separate headers from body
$smtp->datasend("\n");

$smtp->datasend("Blah\n");
$smtp->dataend();

$smtp->quit();
exit;

我基本上是关注来自here的代码来进行comcast。

我已经运行了telnet并且可以连接到端口上的smtp服务器,我可以发出AUTH LOGIN并成功登录,但是发出了

$smtp->datasend("AUTH LOGIN\n");

始终会导致:

Can't call method "datasend" on an undefined value

我也尝试过执行auth方法登录,但也失败了。

我在这里缺少什么?我知道这很简单,我忽视了。

3 个答案:

答案 0 :(得分:0)

几乎所有Net::SMTP方法都可以选择设置错误代码,所以我怀疑Net::SMTP::SSL做同样的事情。请尝试以下构造函数:

use Net::SMTP::SSL;
use MIME::Base64;

use strict;
use warnings;

my $smtp = Net::SMTP::SSL->new(
    "smtp.comcast.net",
    Hello => "host.comcast.net",
    Port => 465,
    Timeout => 30,
    Debug => 1,
) or die "Failed to connect to mail server: $!";

另外,你的smtp服务器与你的Hello不同的事实对我来说有点怀疑。

答案 1 :(得分:0)

对于使用STARTTLS的电子邮件服务,最好使用较新的NET :: SMTPS模块。请尝试以下代码:

my $msg = MIME::Lite ->new (  
From => 'from@bellsouth.net',
To => 'to@bellsouth.net',
Subject => 'Test Message',
Data => 'This is a test',
Type => 'text/html'
);

my $USERNAME = 'from@bellsouth.net';
my $PASSWORD = 'abc123'; 

my $smtps = Net::SMTPS->new("smtp.mail.att.net", Port => 587,  doSSL => 'starttls', SSL_version=>'TLSv1');

$smtps->auth ( $USERNAME, $PASSWORD ) or die("Could not authenticate with bellsouth.\n");

$smtps ->mail('from@bellsouth.net');
$smtps->to('to@bellsouth.net');
$smtps->data();
$smtps->datasend( $msg->as_string() );  
$smtps->dataend();  
$smtps->quit;

最初来自http://www.skipser.com/p/2/p/send-email-using-perl-via-live.com.html

答案 2 :(得分:-1)

试试这个:

来自

的电子邮件

<强> 更改

没有$smtp->mail('user\@comcast.net');

$smtp->mail('user@comcast.net');'\'

电邮至

<强> 更改

没有$smtp->to('user\@host.com');

$smtp->to('user@host.com');'\'