PHPMailer:使用BCC处理错误

Gha*_*Mir 0 php phpmailer

我找不到我的具体方案的答案.

我正在开发一个系统,用于将发布从数据库发送到邮件列表.我已设法使用普通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("noreply@company.com","Company Name");
    $mail->SetFrom('noreply@company.com', '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();
Run Code Online (Sandbox Code Playgroud)

然后我想使用一个电话将电子邮件发送给上面添加的所有收件人.

是否有可能进行错误处理,并发现是否有人没有收到它,因为地址不正确?

Jen*_*ler 5

跟踪邮件操作成功的常见做法是使用电子邮件的"Return-Path"标题.

电子邮件示例及其标题:

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

Hi Folks, ...
Run Code Online (Sandbox Code Playgroud)

因此,"From"标题是您希望读者看到的真实姓名和电子邮件地址的选择,"返回路径"的主要目的是指定消息指示未送达或其他邮件系统故障的地址将被发送([参见RFC 2821了解更多详情] [1]).

所以基本上这个标题是开始提取未送达报告的正确位置.

我该怎么做:

  1. 创建一个唯一的子域来获取所有未送达的报告(例如return.xyz.com)
  2. 设置收件箱以捕获发送到上述子域的所有电子邮件(无论电子邮件地址的本地部分如何,例如*@return.xyz.com)
  3. 使电子邮件唯一=>一个收件人一个唯一的电子邮件(不使用BCC)
  4. 使用收件人ID(例如收件人数据库的数字ID)和电子邮件或广告系列ID来生成未来的本地部分(例如{campaign_id} - {recipient_id})
  5. 使用新的返程路径:返回路径:{campaign_id }-{recipient_id }@return.xyz.com
  6. 创建一些工具来获取传入邮件并从垃圾邮件和临时通知(例如,外出邮件)中过滤掉真正的未送达报告

这是一个具有唯一Return-Path的示例:

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

Hi Folks, ...
Run Code Online (Sandbox Code Playgroud)

而已.

编辑 - 如何通过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("noreply@company.com","Company Name");
    $mail->SetFrom('noreply@company.com', 'Company Name');
    $mail->Subject = "Company| E-Zine";
    $mail->MsgHTML($ezineContent);         
    if(!$mail->Send()) {
      // show log
    } else {
      //show successful msg
    }
  } catch (Exception $e) {
    // show error
  }
}
Run Code Online (Sandbox Code Playgroud)

据我记得,我们使用本地sendmail存在问题.标题Return-Path被本地MTA的一些配置所取代.如果是这种情况,请尝试将SMTP用于可用的中继主机.