Я пытаюсь использовать 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, так как есть пример, который делает именно это. Вы не могли смотреть слишком усердно.

В вашем коде не создавайте новый экземпляр PHPMailer каждый раз во время цикла — все вещи, которые остаются неизменными (isSmtp, Host, Port и т. Д.), Должны быть установлены один раз, перед циклом. Внутри цикла вы должны сделать следующее:

  • Установить тело сообщения
  • Установить получателя
  • Отправить сообщение
  • Храните любые ошибки
  • Очистить список получателей (используйте clearAllRecipients())

Вы также получили return операторы после проверки отправки — они полностью выйдут из вашей функции, поэтому она никогда не отправит более одного сообщения. Вы должны собирать ошибки, просматривая свой список, и представлять (или возвращать) их в конце.

0

Другие решения

Я использовал цикл while только вокруг addAddress, как предложено @synchro выше. Синтаксис 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

По вопросам рекламы [email protected]