2014-09-20 44 views
3

我想用perl代碼發送電子郵件。所以我使用MIME::Lite模塊。如何檢查發送的最後一封電子郵件是否已成功發送或未使用MIME :: Lite perl

如果我刪除了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 ([email protected] && $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: [email protected]"; 
     $return_status = 'failure'; 
    } 
} 

我得到的錯誤是:

Can't locate object method "last_send_successful" via package "MIME::Lite" 

這意味着這種方法不存在。但它在我使用的參考文獻中給出。

  1. 所以我錯過了一些東西,或者有其他方法可以檢查最後一次發送是否成功或者我使用的引用不正確?

  2. 由於我已經在使用eval塊,所以這個檢查是多餘的嗎?

  3. 將使用eval捕獲電子郵件的錯誤未送達? (很可能不,但想確認)

  4. 如何確保電子郵件與MIME :: Lite一起交付?

+2

perl的-MMIME ::精簡版-e '打印$ MIME ::精簡版:: VERSION' – askovpen 2014-09-20 16:40:35

回答

5

您不需要使用eval塊或做任何事情以確保郵件已發送;這就是last_send_successful的用途。當發送子程序成功完成其工作時,它設置一個內部變量($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 
} 
+0

謝謝爲您的答覆,但我在頂部使用「使用MIME :: Lite」。然後我也得到同樣的錯誤。如果我不會使用「使用MIME :: Lite」,我就不能自己創建MIME消息。 – chammu 2014-09-20 18:11:46

+0

如果轉儲'$ msg'的內容,是否顯示內部變量'$ object - > {last_send_successful}'?您可能在模塊中發現了一個錯誤。你正在使用什麼版本的MIME :: Lite和Perl? – 2014-09-20 19:55:39

+0

我正在使用的MIME :: Lite版本是3.027。這是造成這個錯誤的原因。使用3.030版本時,它不會給對象缺少錯誤。無論如何感謝人們。 – chammu 2014-09-21 12:37:46

相關問題