PHPMailer 意外启动垃圾邮件

标签 php mysql phpmailer

我正在制作一个表格来向我的所有成员(member)群发电子邮件。由于某种我不知道的原因,服务器开始疯狂地发送垃圾邮件!随意地向每个人发送数百封电子邮件。这是我使用过的脚本:

<?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']); 正确替换了每条消息中的用户名。

最佳答案

$mail->addAddress($result['email']);

该行代码在每次循环迭代中将每个成员添加到受众中。您永远不会清除该对象/属性,因此它只会在浏览 $结果时积累您的全部受众。

在循环内创建 $mail,或以不同的方式指定电子邮件地址。

关于PHPMailer 意外启动垃圾邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58785183/

相关文章:

php - 如何使用 JS 和 PHP 检查 LatLng 在 Google StreetView 中是否有效

mysql - Kohana DB - 使用 SQL_CACHE

mysql - 使用 where 子句获取 mysql 中最流行的前 5 个值

mysql - 获取每组最高/最小<whatever>的记录

phpmailer 无法添加对地址的回复

php - 一些免费的邮件服务器发送邮件

php - 如何使用 PHPMailer 向 Mailcatcher 发送电子邮件?

php - 使用 REGEXP 在 MySQL 中搜索

php - 将MySQL数据显示到HTML表格中(解释清楚)

php - 是否可以获取城市集合但排除任何重复项?