0

我找不到我的具体情况的答案。

我正在开发一个系统来将出版物从数据库发送到邮件列表。我已经设法使用普通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();

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

是否可以进行错误处理并查找是否有人因为地址不正确而没有收到它?

4

1 回答 1

5

跟踪邮件操作成功的一种常见做法是使用电子邮件的“返回路径”标题。

电子邮件及其标题的示例:

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, ...

其中“发件人”标题是您选择的真实姓名和您希望读者看到的电子邮件地址,“返回路径”的主要目的是指定指示未投递或其他邮件系统故障的邮件的地址将被发送([有关详细信息,请参阅 RFC 2821][1])。

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

我将如何做到这一点:

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

这是一个具有唯一返回路径的示例:

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, ...

就是这样。

编辑 - 如何通过 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
  }
}

据我记得,我们在使用本地 sendmail 时遇到了问题。标头 Return-Path 被本地 MTA 的某些配置替换。如果是这种情况,请尝试使用 SMTP 连接到可用的中继主机。

于 2012-05-02T11:25:44.373 回答