2014-09-25 95 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

相關問題