我正在撰写一个电子邮件服务,通过Email::Sender::Simple
和Email::Sender::Transport::SMTPS
向我的用户发送数据。现在,我有一个包应该只需要一些输入并发送电子邮件:
package MyApp::Service::Mail;
use Email::Sender::Simple qw(sendmail);
use Email::Simple;
use Email::Sender::Transport::SMTPS;
use Try::Tiny;
use Dancer;
use constant CANT_SEND_MAIL => -1;
use constant SENT_SUCCESSFULLY => 1;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub sendEmail {
my $self = shift;
my $to = shift;
my $subject = shift;
my $body = shift;
my $failed = 0;
my $email = Email::Simple->create(
header => [
To => $to,
From => 'noreply@myapp.com',
Subject => $subject
],
body => $body
);
my $transport = Email::Sender::Transport::SMTPS->new({
host => config->{smtp_host},
port => config->{smtp_port},
sasl_username => config->{smtp_username},
sasl_password => config->{smtp_password},
ssl => 'ssl'
});
try {
sendmail($email, {transport => $transport});
} catch {
$failed = 1;
}
return $self->CANT_SEND_MAIL if ($failed eq 1);
return $self->SENT_SUCCESSFULLY;
}
1;
这主要基于example from the CPAN page for the modules involved。
请注意,这些配置变量来自Dancer
s config.yml,我已确认它们正在正确传递。我还确认$to
,$body
和$subject
包含了我期望的内容。
正在调用sendEmail
函数并返回1(SENT_SUCCESSFULLY
)但我在电子邮件客户端的“已发送”框中看不到任何内容,并且接收地址也没有任何内容。我一直试图找到某种调试功能来深入研究为什么会失败,但无济于事。
调用此代码的代码是:
package MyApp::Service::Mail::User;
use MyApp::Service::Mail;
our @ISA = qw(MyApp::Service::Mail);
sub sendPasswordByEmail {
my $self = shift;
my $to = shift;
my $username = shift;
my $subject = "Test E-Mail";
(my $body = << " END_MESSAGE") =~ s/^ {4}//gm;
Dear $username,
This is a test e-mail.
END_MESSAGE
return $self->sendEmail($to, $subject, $body);
}
1;
我可以确认SMTP帐户肯定有效,因为我在我的电子邮件客户端(Thunderbird)中使用它。有关为什么这个函数可能返回1没有成功的任何建议?有没有办法调试这个和我的SMTP服务器之间的连接(它的第三方所以无法检查日志),看看是否正在建立连接以及正在传递什么/是否存在问题?
答案 0 :(得分:3)
try {} catch {}
阻止后缺少分号。如果没有它,以下行将成为同一语句的一部分,因此整个try/catch
块基于$failed
是有条件的,在此时永远不会为1。
这是Try::Tiny
实现的一个不幸的副作用,但在纯perl实现中无法避免。您现有的代码解析如下:
try(
sub {
sendmail($email, {transport => $transport});
},
catch(
sub {
$failed = 1;
},
return($self->CANT_SEND_MAIL),
),
) if ($failed eq 1);