如何使用perl进行与用户和SSL身份验证的SMTP连接,并发送带附件的电子邮件

时间:2010-04-06 10:06:07

标签: perl sendmail perl-module

我正在使用SMTP邮件服务器,该服务器需要用户+ ssl身份验证才能进行连接。我正在寻找连接到邮件服务器和发送电子邮件的perl模块,但没有找到任何有用的东西。

对perl模块或任何perl代码的任何建议都将非常感激。

修改

我尝试使用Mail :: Sendmail和Net :: SMTP :: SSL连接到sendmail服务器并发送邮件。下面是示例代码,但错误用户未知。

错误:

mail: Net::SMTP::SSL=GLOB(0x9599850) not found 
RCPT TO: error (550 5.1.1 <user@mail.com>... User unknown).

代码:

#!/usr/bin/perl

use strict;
use warnings;
use Mail::Sendmail;
use Net::SMTP::SSL;

my %mail = (
From=> 'user1@server.com',
To=> 'user2@server.com',
# Cc will appear in the header. (Bcc will not)
Subject => 'Test message',
'X-Mailer' => "Mail::Sendmail version $Mail::Sendmail::VERSION",
);

$mail{Smtp} = Net::SMTP::SSL->new("mail.server.com", Port=> 465, Debug=>1);
$mail{auth} = {user=>'username', password=>"password", required=>1 };
$mail{'X-custom'} = 'My custom additionnal header';
$mail{Message} = "The message key looks terrible, but works.";
# cheat on the date:
$mail{Date} = Mail::Sendmail::time_to_date( time() - 86400 );
if (sendmail %mail) { print "Mail sent OK.\n" }
else { print "Error sending mail: $Mail::Sendmail::error \n" }

print "\n\$Mail::Sendmail::log says:\n", $Mail::Sendmail::log;

5 个答案:

答案 0 :(得分:2)

我假设您验证了此行中的数据:

$mail{auth} = {user=>'username', password=>"password", required=>1 };

是用户'用户名'(在你的reallife代码'user@mail.com'?中),密码'password'在mail.server.com上知道?

如果没有,我会发现User unknown错误。


<强> EDIT1 我刚刚看到你在那封邮件中没有'To','只有'一个cc,可能你的邮件服务器不喜欢那个(我不介意,所以那么:-),或者是这样'发生'在修剪码?


<强> EDIT2 我能够通过替换

来重现您的错误
$mail{Smtp} = Net::SMTP::SSL->new("mail.server.com", Port=> 465);

$mail{Smtp} = Net::SMTP::SSL->new("smtp.mail.com", Port=> 465);

你需要给mailserer一个有效的地址来发送消息!当我提供一个现有的地址(Cc=>'user2@server.com'行..它有效!

答案 1 :(得分:0)

也许您可以尝试使用Net :: SMTP :: SSL进行SSL身份验证连接,使用Net :: SMTP :: Multipart进行附件支持并执行某些操作以使它们协同工作。

答案 2 :(得分:0)

您应该使用“SMTP”和“SSL”等字词在search.cpan.org查找此类内容。第一个匹配是Net::SMTP::SSL,它将自己描述为标准Net::SMTP的替代品。这听起来非常相关;它能做你想做的事吗?

答案 3 :(得分:0)

您得到的错误是RCPT TO错误而不是身份验证错误。这可能是因为您实际上尝试将邮件发送给不存在的用户,或者您尝试通过服务器进行中继而不进行身份验证。

如果看起来像Mail :: Sendmail不支持SMTP Auth Method( http://metacpan.org/pod/Mail::Sendmail#LIMITATIONS)所以很可能甚至没有尝试过身份验证。

您应该在创建它的实例后立即使用Net :: SMTP:SSL的auth方法:

$mail{Smtp}->auth('username','password');

答案 4 :(得分:0)

康卡斯特已经转移到SSMTP,所以我不得不修改我的自动消息。

以下是Comcast邮件服务器的一些工作PERL代码。希望你觉得它有用。

#!/usr/bin/perl

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


$uptime = `uptime`;

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

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

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

# Email to
$smtp->to ('anyuser@gmail.com');

$smtp->data();

$smtp->datasend("To: anyuser@gmail.com\n");
$smtp->datasend("From: myuserid\@comcast.net\n");
$smtp->datasend("Subject: My Subject Line");

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


$smtp->datasend("Uptime Report - At $uptime\n");
$smtp->dataend();

$smtp->quit();

exit;