2

我正在使用一个 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;
4

5 回答 5

2

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

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

用户“用户名”(在您的真实代码“user@mail.com”中?)在 mail.server.com 上使用密码“password”?

如果没有,我会期待一个User unknown错误。


EDIT1 我刚刚看到您在那封邮件中没有“收件人”,“只有”一个抄送,您的邮件服务器可能不是那样(我的不介意,所以:-),或者在修剪时“发生”了编码?


EDIT2 我能够通过替换该行来重现您的错误

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

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

你需要给邮件发送者一个有效的地址来发送邮件!当我提供一个现有地址时(Cc=>'user2@server.com'行 .. 它起作用了!

于 2010-04-12T20:52:22.167 回答
0

也许您可以尝试使用 Net::SMTP::SSL 通过 SSL 身份验证进行连接,使用 Net::SMTP::Multipart 进行附件支持,并做一些事情让它们一起工作。

于 2010-04-06T10:15:17.053 回答
0

您应该search.cpan.org使用诸如“SMTP”和“SSL”之类的术语来查找此类内容。第一个热门是Net::SMTP::SSL,它将自己描述为标准的替代品Net::SMTP。这听起来很相关;它做你想做的事吗?

于 2010-04-06T10:15:43.083 回答
0

Comcast 已迁移到 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;
于 2013-04-02T10:40:09.047 回答
0

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

如果看起来 Mail::Sendmail 不支持 SMTP 身份验证方法( http://metacpan.org/pod/Mail::Sendmail#LIMITATIONS),那么很可能甚至没有尝试过身份验证。

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

$mail{Smtp}->auth('username','password');
于 2010-04-13T10:16:54.530 回答