perl - 如何使用 MIME::Lite perl 检查上次发送的电子邮件是否已成功发送

标签 perl email mime

我想用 perl 代码发送电子邮件。所以我用了 MIME::Lite 模块。

如果我删除了 last_send_successful 检查,我可以随意发送电子邮件,否则我会收到下面提到的错误。我想知道电子​​邮件是否发送成功。下面是我使用的代码片段。

sub sendEmailWithCSVAttachments {
    my $retries        = 3;
    my $retry_duration = 500000;    # in microseconds
    my $return_status;
    my ( $from, $to, $cc, $subject, $body, @attachments_path_array );

    $from                   = shift;
    $to                     = shift;
    $cc                     = shift;
    $subject                = shift;
    $body                   = shift;
    @attachments_path_array = shift;

    my $msg = MIME::Lite->new(
        From    => $from,
        To      => $to,
        Cc      => $cc,
        Subject => $subject,
        Type    => 'multipart/mixed'
    ) or die "Error while creating multipart container for email: $!\n";

    $msg->attach(
        Type => 'text',
        Data => $body
    ) or die "Error while adding text message part to email: $!\n";

    foreach my $file_path (@attachments_path_array) {

        my $file_name = basename($file_path);
        $msg->attach(
            Type        => 'text/csv',
            Path        => $file_path,
            Filename    => $file_name,
            Disposition => 'attachment'
        ) or die "Error while adding attachment $file_name to email: $!\n";
    }

    my $sent = 0;
    while ( !$sent && $retries-- > 0 ) {

        eval { $msg->send(); };

        if ( !$@ && $msg->last_send_successful() ) {
            $sent = 1;
        } else {
            print "Sending failed to $to.";
            print "Will retry after $retry_duration microseconds.";
            print "Number of retries remaining $retries";
            usleep($retry_duration);
            print "Retrying...";
        }
    }

    if ($sent) {
        my $sent_message = $msg->as_string();
        print "Email sent successfully:";
        print "$sent_message\n";
        $return_status = 'success';
    } else {
        print "Email sending failed: $@";
        $return_status = 'failure';
    }
}

我得到的错误是:
Can't locate object method "last_send_successful" via package "MIME::Lite"

这意味着此方法不存在。但它在我使用的引用文献中给出。
  • 那么我是否遗漏了某些东西,或者是否有其他方法可以检查上次发送是否成功或我使用的引用不正确?
  • 因为我已经在使用 eval block ,所以这个检查是多余的吗?
  • 使用 eval 会捕获电子邮件未送达的错误吗? (很可能没有,但想确认)
  • 如何确保使用 MIME::Lite 发送电子邮件?
  • 最佳答案

    您不需要使用 eval阻止或做任何花哨的事情以确保邮件已发送;这就是last_send_successful是为了。当 send 子例程成功完成其工作时,它会设置一个内部变量( $object->{last_send_successful} );这就是 last_send_successful子正在检查。通常不需要使用 eval除非您试图阻止脚本死机或引发运行时或语法错误,否则阻止。

    您可以将代码简化为以下内容:

    $msg->send;
    
    if ($msg->last_send_successful) {
        # woohoo! Message sent
    }
    else {
        # message did not send.
        # take appropriate action
    }
    

    或者
    $msg->send;
    
    while (! $msg->last_send_successful) {
        # message did not send.
        # take appropriate action
    }
    

    关于perl - 如何使用 MIME::Lite perl 检查上次发送的电子邮件是否已成功发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25950164/

    相关文章:

    perl - 如何修改正在运行的 Gtk3(Perl) 程序中标签的背景颜色?

    c++ - 如何从 IStream 初始化 IMimeMessage 对象

    html - 如何在 opencart 2.0.1.1 中的奖励积分通知电子邮件中应用 css 样式?

    HTML 邮件 : Some links not working in Outlook 2007

    go - 如何检查文件是否为有效图像?

    gzip - 在哪里可以找到文本 MIME 类型的列表?

    perl - 使用 Perl 的数据签名

    perl - 在 Perl 中使用原型(prototype)在子例程 args 上声明数组引用上下文是一件好事吗?

    multithreading - 在Windows中启用对Perl的线程支持?

    php - Gmail从php mail()函数发送合法邮件到垃圾邮件文件夹