Я пробовал много разных способов, чтобы PHP Mailer не добавлял каждый адрес электронной почты, поступающий из моей БД, в каждое электронное письмо.
Я считаю, что для каждого пользователя неуместно получать электронное письмо с моего веб-сайта и видеть еще несколько тысяч писем, добавленных к тому же электронному письму.
Вот мой код, я уже пробовал много разных вещей:
$query_select = "SELECT * FROM users";
$query = mysqli_query($connection, $query_select);
if ($select_to == 'all'){
while($row = mysqli_fetch_assoc($query)) {
$user_email = $row['user_email'];
$send_to = $user_email;
$mail->setFrom('[email protected]', 'My website');
$mail->addAddress($send_to);
$mail->isHTML(true);
$mail->Subject = $subject_email;
$mail->Body = $content_email;
$mail->AltBody = $content_email;
}
} else {
if ($select_to == 'single'){
$send_to = $to_single_email;
}
}
if ($mail->send()){
$confirm = 'Sent.';
$send = array(
'confirm'=>$confirm
);
echo json_encode($send);
} else {
$confirm = 'There was en error while sending this email.';
$send = array(
'confirm'=>$confirm
);
echo json_encode($send);
}






$mail->send() отправит на все адреса в одном сообщении. Вместо этого вам нужно отправить одно сообщение на получателя.
Цикл while() будет переработан аналогично:
while($row = mysqli_fetch_assoc($query)) {
$user_email = $row['user_email'];
$send_to = $user_email;
$mail->setFrom('[email protected]', 'My website');
$mail->addAddress($send_to);
$mail->isHTML(true);
$mail->Subject = $subject_email;
$mail->Body = $content_email;
$mail->AltBody = $content_email;
$mail->send();
$mail->clearAllRecipients();
}
Вызов clearAllRecipients() очистит предыдущие адреса, которые в противном случае накапливались бы через addAddress().
Вам также нужно будет добавить проверку ошибок в цикле для каждого вызова send().
Посмотрите пример списка рассылки, поставляемый с PHPMailer. Он делает то же самое, но немного более эффективно.
@leepowers Вау, спасибо .. это работает правильно, я сделал это вчера, но я оставил $ mail-> send () вне цикла, поэтому я могу отправить строку подтверждения электронной почты через json, я думаю, мне нужно выяснить лучший способ подтвердить, были ли отправлены эти электронные письма? Поскольку, если я продолжу использовать if ($ mail-> send ()) {...}, он будет отправлять электронные письма дважды.
@Synchro Пробовал это тоже, и снова кажется лучше .. Я использовал это вчера, но оставил $ mail-> send () вне цикла для подтверждения электронной почты через json .. Мне больше нравится этот метод, я никогда не использовал $ mail-> send () внутри цикла, чтобы подтверждение работало, хотя
Выводить посыл за пределы цикла не имеет смысла. Вы можете сохранить статус отправки каждого сообщения внутри цикла, а затем вернуть весь массив.
Вы должны создать объект $ email для каждого письма, которое нужно отправить, и отправить его внутри цикла while, вы также можете создать ассоциативный массив, когда индексом будет адрес электронной почты пользователя и значение данных подтверждения, и отправить массив, закодированный в json, в конец процесса отправки всех писем