PHPMailer неожиданно начал рассылку спама - PullRequest
1 голос
/ 10 ноября 2019

Я работал над формой для массовой рассылки всех моих участников. По какой-то неизвестной мне причине сервер начал рассылать спам по электронной почте как сумасшедший! Сорри отправка сотен писем каждому. Это скрипт, который я использовал:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require_once '../../config.php';
require_once '../../src/Pdo.php';
require 'Exception.php';
require 'PHPMailer.php';
require 'SMTP.php';

if(!empty($_POST['message'])){
    $mail = new PHPMailer(true);
    $db = new MyChat\Database;

    $db->query("SELECT
                    users.email AS email,
                    users.username AS username
                FROM
                    users
                WHERE
                    users.getmail = 1
                AND
                    users.id
                NOT IN
                    (SELECT bans.userid FROM bans)
                AND
                    users.email
                NOT IN
                    (SELECT blocked.email FROM blocked)
               ");

    try {
        $results = $db->resultset();
    }
    catch(PDOException $e){
        echo "PDO Error: ". $e->getMessage();
    }

    foreach($results as $result){
        if(filter_var($result['email'], FILTER_VALIDATE_EMAIL)){
            try {
                $mail->setFrom('noreply@example.com', 'Example');
                $mail->addAddress($result['email']);
                $mail->isHTML(true);
                $mail->Subject = $_POST['subject'];
                $mail->Body = str_replace("%username%",$result['username'],$_POST['message']);
                $mail->AltBody = str_replace("%username%",$result['username'],$_POST['altmessage']);

                $mail->send();
            } catch (Exception $e) {
                echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
            }
        }
    }

    echo 'succes';
} else {
    echo 'empty';
}

Я попытался вернуть результат mysql самому себе, и он возвращает данные только один раз. Проверяя журнал Postfix var/log/mail.log, он выглядит так, что вместо того, чтобы отправлять каждому пользователю свое сообщение по почте, он отправляет все сообщения каждому пользователю.

Таким образом, пользователь A получил почту для пользователя A, B, C, D .. и то же самое снова для пользователя B и т. д.

Я не понимаю, как это могло произойти? Я не могу найти ошибку в моем коде, который вызвал бы этот цикл? Тем более, что $mail->Body = str_replace("%username%",$result['username'],$_POST['message']); правильно заменяет имя пользователя в каждом сообщении.

1 Ответ

2 голосов
/ 10 ноября 2019
$mail->addAddress($result['email']);

Эта строка кода добавляет каждого члена в аудиторию на каждой итерации цикла. Вы никогда не очищаете этот объект / свойство, поэтому он просто накапливает вашу полную аудиторию, проходя через $ results.

Создайте $ mail внутри цикла или укажите адрес электронной почты другим способом.

...