Как запретить PHP Mailer добавлять все адреса электронной почты к каждому электронному письму?

Я пробовал много разных способов, чтобы 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);
}

Вы должны создать объект $ email для каждого письма, которое нужно отправить, и отправить его внутри цикла while, вы также можете создать ассоциативный массив, когда индексом будет адрес электронной почты пользователя и значение данных подтверждения, и отправить массив, закодированный в json, в конец процесса отправки всех писем

Averias 11.03.2018 20:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
1
179
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

$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. Он делает то же самое, но немного более эффективно.

Synchro 11.03.2018 20:42

@leepowers Вау, спасибо .. это работает правильно, я сделал это вчера, но я оставил $ mail-> send () вне цикла, поэтому я могу отправить строку подтверждения электронной почты через json, я думаю, мне нужно выяснить лучший способ подтвердить, были ли отправлены эти электронные письма? Поскольку, если я продолжу использовать if ($ mail-> send ()) {...}, он будет отправлять электронные письма дважды.

Ed91gg 11.03.2018 20:56

@Synchro Пробовал это тоже, и снова кажется лучше .. Я использовал это вчера, но оставил $ mail-> send () вне цикла для подтверждения электронной почты через json .. Мне больше нравится этот метод, я никогда не использовал $ mail-> send () внутри цикла, чтобы подтверждение работало, хотя

Ed91gg 11.03.2018 20:58

Выводить посыл за пределы цикла не имеет смысла. Вы можете сохранить статус отправки каждого сообщения внутри цикла, а затем вернуть весь массив.

Synchro 11.03.2018 21:02

Другие вопросы по теме