2014-09-25 93 views
0

第一次发布这样不胜感激任何帮助......我试图使用的PHPMailer发送多封电子邮件(不同的电子邮件给每个收件人)

  • 我很高兴的SQL查询工作,并返回两张2行
  • 我很高兴离开消息“你好”现在
  • 我已经通过很多答案看上去和没有解决我的问题
  • 该功能可以将邮件发送到只(前2 )收件人,但不是第二个。

如果有人能告诉我在哪里,我错了,我会非常感激......

public function sendOrderEmail($customer_order_id) 
{ 
$sql3=" SELECT DISTINCT  w.user_id AS supplier_id, 
          s.trading_name AS supplier_name, 
          s.contact_email AS supplier_email 
     FROM supplier_info AS s 
     JOIN wine AS w ON w.user_id = s.id 
     JOIN order_detail AS o ON o.wine_id = w.id 
     WHERE o.order_no_id = :customer_order_id ORDER BY supplier_id DESC;"; 

$query3 = $this->db->prepare($sql3); 
$query3->execute(array(':customer_order_id' => intval($customer_order_id))); 

//$result3 = $query3->fetchAll(); 
while($row3 = $query3->fetch(PDO::FETCH_ASSOC)){ 
    // while ($row3 = $query3->fetch()) { 

     $supplier_name = $row3['supplier_name']; 
     $supplier_email = $row3['supplier_email']; 

// foreach($result3 as $key => $output){ 
    //$supplier_id = $output->supplier_id; 
    // $supplier_email = $output->email; */ 

    $mail = new PHPMailer; 

     if (EMAIL_USE_SMTP) { 
          $mail->IsSMTP(); 
          $mail->SMTPDebug = PHPMAILER_DEBUG_MODE; 
          $mail->SMTPAuth = EMAIL_SMTP_AUTH; 

          if (defined('EMAIL_SMTP_ENCRYPTION')) { 
          $mail->SMTPSecure = EMAIL_SMTP_ENCRYPTION; 
          } 

          $mail->Host = EMAIL_SMTP_HOST; 
          $mail->Username = EMAIL_SMTP_USERNAME; 
          $mail->Password = EMAIL_SMTP_PASSWORD; 
          $mail->Port = EMAIL_SMTP_PORT; 
     } else { 
          $mail->IsMail(); 
     } 

// Build email body 
     $message = "<p>hello</p>"; 

     // fill mail with data 
$mail->isHTML(true); 
$mail->From = "[email protected]"; 
$mail->FromName = "Me"; 
$mail->AddAddress($supplier_email); 
$mail->Subject = "Your request "; 
$mail->Body = $message; 

    // final sending and check 
    if($mail->Send()) { 
     $_SESSION["feedback_positive"][] = FEEDBACK_CONTACT_MAIL_SENDING_SUCCESSFUL; 
     return true; 
    } else { 
     $_SESSION["feedback_negative"][] = FEEDBACK_CONTACT_MAIL_SENDING_ERROR . $mail-  >ErrorInfo; 
     return false; 
    } 
} 

回答

0

首先,你真的应该先检查PHPMailer的文档,因为有an example that does exactly this。你不可能看起来太辛苦。

在您的代码中,请勿在每次循环时创建新的PHPMailer实例 - 在循环之前,应该将所有保持不变的东西(isSmtp,Host,Port等)设置为一次。在循环中,你应该做这些事情:

  • 设置邮件正文
  • 将收件人
  • 发送邮件
  • 商店的任何错误
  • 清除收件人列表(使用clearAllRecipients()

您的发送检查后还得到return声明 - 这些声明将完全退出您的功能,因此它会失效我永远不会发送多条消息。你应该在你浏览清单时收集错误,并在最后呈现(或返回)它们。

+0

为了你,先生,我小费我的帽子!非常感谢你! – brianjlennon 2014-09-26 09:36:26

0

我使用了上面@synchro建议的while循环,就在addAddress的周围。 Foreach迭代器语法无法正常工作,因为我使用的是PHP 5.3(如上面链接到PHPmailer的注释)。

然后我在while循环之外取回了返回值,一切正常。

这是工作的代码: (它的任何改进欣然接受)

public function sendOrderEmail($customer_order_id) 
{ 
    $sql3 = " SELECT DISTINCT  w.user_id AS supplier_id, 
           s.trading_name AS supplier_name, 
           s.contact_email AS supplier_email 
      FROM supplier_info AS s 
      JOIN wine AS w ON w.user_id = s.id 
      JOIN order_detail AS o ON o.wine_id = w.id 
      WHERE o.order_no_id = :customer_order_id ORDER BY supplier_id DESC;"; 

    $query3 = $this->db->prepare($sql3); 
    $query3->execute(array(':customer_order_id' => intval($customer_order_id))); 

    $mail = new PHPMailer; 

    if (EMAIL_USE_SMTP) { 
     $mail->IsSMTP(); 
     $mail->Host = EMAIL_SMTP_HOST; 
     $mail->Username = EMAIL_SMTP_USERNAME; 
     $mail->Password = EMAIL_SMTP_PASSWORD; 
     $mail->Port = EMAIL_SMTP_PORT; 
     $mail->SMTPDebug = PHPMAILER_DEBUG_MODE; 
     $mail->SMTPAuth = EMAIL_SMTP_AUTH; 
     $mail->SMTPKeepAlive = true; 
     if (defined('EMAIL_SMTP_ENCRYPTION')) { 
      $mail->SMTPSecure = EMAIL_SMTP_ENCRYPTION; 
     } 
    } else { 
     $mail->IsMail(); 
    } 

    $mail->isHTML(true); 
    $mail->From = "[email protected]"; 
    $mail->FromName = "Me"; 

    while ($row3 = $query3->fetch(PDO::FETCH_ASSOC)) { 
     // Build email body 
     $message = "<p>hello</p>"; 

     // fill mail with data 
     $mail->AddAddress($row3['supplier_email']); 
     $mail->Subject = "Your request to " . $row3['supplier_name']; 
     $mail->Body = $message; 

     // final sending and check 
     if ($mail->Send()) { 
      // $_SESSION["feedback_positive"][] = FEEDBACK_CONTACT_MAIL_SENDING_SUCCESSFUL; 
      //return true; 
     } else { 
      $_SESSION["feedback_negative"][] = FEEDBACK_CONTACT_MAIL_SENDING_ERROR . $mail->ErrorInfo; 
      // return false; 
      break; 
     } 
     $mail->ClearAddresses(); 
    } 
    return true; 
} 
+0

你的循环内部仍然做得太多 - 在* while循环之前创建PHPMailer实例,设置SMTPDebug,SMTPAuth,SMTPSecure,Host,Username,Password和Port isHTML,From,FromName *,因为它们将相同每一条消息。设置'$ mail-> SMTPKeepAlive = true;'也可以让发送速度更快。 – Synchro 2014-09-26 10:21:56

+0

我已经采取了我所描述的清理代码的自由。 – Synchro 2014-09-26 11:07:58

+0

Synchro - 再次感谢您!我非常感谢你的帮助!但是我想我必须粘贴你的代码?我没有看到你最近的评论,在改变我的功能和粘贴(我认为是)我的最后一个代码之间!抱歉!你可以重新报名吗? – brianjlennon 2014-09-26 11:23:02

相关问题