2012-05-02 43 views
0

我無法找到針對特定場景的答案。PHPMailer:處理BCC時出錯

我正在開發一個系統發送出版物到數據庫的郵件列表。我設法使用正常的loop代碼。

不過,我想只能用循環添加使用BCC也保持error handling收件人如果有人錯過了它是這樣的:

foreach($array as $user){ 
    $mail->AddBCC($user['email'], $user['customerName']); 
} 

try{ 
    $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment 
    $mail->AddReplyTo("[email protected]","Company Name"); 
    $mail->SetFrom('[email protected]', 'Company Name'); 
    $mail->Subject = "Company| E-Zine"; 
    $mail->MsgHTML($ezineContent);    

if(!$mail->Send()) { 

    //show error msg 

} else { 

    //show successful msg 
} 


}catch (phpmailerException $e) { 

    //show error msg 

}catch (Exception $e) { 

    //show error msg 
} 

$mail->ClearAddresses(); 

然後我想發送電子郵件給所有接收者上面添加使用一個電話。

是否有可能做錯誤處理,並找到是否有人因爲地址不正確而沒有收到它?

回答

5

跟蹤郵件操作成功的常見做法是使用電子郵件的「Return-Path」標題。電子郵件,其標題的

例子:

Return-Path: [email protected] 
Received: from localhost (mx-1-1 [127.0.0.1]) 
    by mx-1.xyz.com (Postfix) with ESMTP id 3F81556754 
    for <[email protected]>; Wed, 2 May 2012 12:27:18 +0200 (CEST) 
To: [email protected] 
Subject: test mailing 
From: Jens <[email protected]> 
Message-Id: <[email protected]> 
Date: Wed, 2 May 2012 12:27:17 +0200 (CEST) 

Hi Folks, ... 

從而使「從」頭是你的真實姓名和電子郵件地址的選擇,您希望讀者看到,「Return-的主要目的路徑「是指定要發送指示未送達或其他郵件系統故障的消息的地址([參見RFC 2821以瞭解更多細節] [1])。

所以基本上這個標題是開始提取未送達報告的正確位置。

我將如何做到這一點:

  1. 創建一個唯一子來獲取所有未送達報告(例如return.xyz.com)
  2. 設置了一個收件箱趕發送到所有電子郵件(不管電子郵件地址的本地部分,例如*@return.xyz.com)
  3. 使電子郵件唯一=>一個收件人一個唯一的電子郵件(不使用BCC)
  4. 使用收件人ID(例如數字收件人數據庫的ID)和電子郵件或活動ID來生成未來的本地部分(例如, 。G。 {CAMPAIGN_ID} - {} recipient_id)
  5. 使用新的返回路徑:返回路徑:{campaign_id}-{recipient_id}@return.xyz.com
  6. 創造一些工具來獲取收到的郵件,並篩選出真正的從垃圾郵件和臨時通知未送達報告(例如外的辦公室消息)

這裏用一個獨特的返回路徑的例子:

Return-Path: [email protected] 
Received: from localhost (mx-1-1 [127.0.0.1]) 
    by mx-1.xyz.com (Postfix) with ESMTP id 3F81556754 
    for <[email protected]>; Wed, 2 May 2012 12:27:18 +0200 (CEST) 
To: [email protected] 
Subject: test mailing 
From: Jens <[email protected]> 
Message-Id: <[email protected]> 
Date: Wed, 2 May 2012 12:27:17 +0200 (CEST) 

Hi Folks, ... 

就是這樣。

編輯 - 如何實現通過PHPMailer的:

/* define domain name for non-delivery reports */ 
define('RETURN_PATH_DOMAIN', 'return.xyz.com'); 

/* get current campaign id */ 
$campaignId = 123; 

/* loop recipient list and send email */ 
foreach ($array as $userId => $user) { 
    try{ 
    $mail = new PHPMailer(); 
    $mail->HeaderLine('Return-Path', $userId . '-' $campaignId . '@' . RETURN_PATH_DOMAIN); 
    $mail->To($user['email'], $user['customerName']); 
    $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; 
    $mail->AddReplyTo("[email protected]","Company Name"); 
    $mail->SetFrom('[email protected]', 'Company Name'); 
    $mail->Subject = "Company| E-Zine"; 
    $mail->MsgHTML($ezineContent);   
    if(!$mail->Send()) { 
     // show log 
    } else { 
     //show successful msg 
    } 
    } catch (Exception $e) { 
    // show error 
    } 
} 

至於我記得我們有問題,通過使用本地的sendmail。標題Return-Path被本地MTA的一些配置所取代。如果是這種情況,請嘗試將SMTP用於可用的中繼主機。

+0

但是我很欣賞你的答案,我使用PHPMailer類,並會欣賞,如果有任何解決方案使用類似的屬性,方法或技巧? –

+1

我已經添加了一個如何在PHPmailer中使用它的例子。 –