调试Email :: Sender :: Simple with Email :: Sender :: Transport :: SMTPS

时间:2014-04-20 12:52:25

标签: perl smtp dancer

我正在撰写一个电子邮件服务,通过Email::Sender::SimpleEmail::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服务器之间的连接(它的第三方所以无法检查日志),看看是否正在建立连接以及正在传递什么/是否存在问题?

1 个答案:

答案 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);