PHPMailer 意外开始垃圾邮件
PHPMailer started spam mailing unexpectedly
我正在制作一个表格来向我的所有成员群发电子邮件。出于某种我不知道的原因,服务器开始疯狂地发送垃圾邮件!乱七八糟地向每个人发送数百封电子邮件。这是我用过的脚本:
<?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 结果返回给自己,但它只 returns 一次数据。查看 Postfix 的日志 var/log/mail.log
它看起来不是向每个用户发送他们自己的消息,而是向每个用户发送所有消息。
所以用户 A 收到了用户 A、B、C、D.. 的邮件,同样也收到了用户 B 等的邮件。
我不明白这怎么会发生?我似乎无法在我的代码中找到任何会导致此循环的错误?特别是因为 $mail->Body = str_replace("%username%",$result['username'],$_POST['message']);
正确地替换了每条消息中的用户名。
$mail->addAddress($result['email']);
该行代码在每次循环迭代中将每个成员添加到听众中。您永远不会清除 object/property,因此它只会在通过 $results 时积累您的全部受众。
在循环内创建 $mail,或以不同的方式指定电子邮件地址。
我正在制作一个表格来向我的所有成员群发电子邮件。出于某种我不知道的原因,服务器开始疯狂地发送垃圾邮件!乱七八糟地向每个人发送数百封电子邮件。这是我用过的脚本:
<?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 结果返回给自己,但它只 returns 一次数据。查看 Postfix 的日志 var/log/mail.log
它看起来不是向每个用户发送他们自己的消息,而是向每个用户发送所有消息。
所以用户 A 收到了用户 A、B、C、D.. 的邮件,同样也收到了用户 B 等的邮件。
我不明白这怎么会发生?我似乎无法在我的代码中找到任何会导致此循环的错误?特别是因为 $mail->Body = str_replace("%username%",$result['username'],$_POST['message']);
正确地替换了每条消息中的用户名。
$mail->addAddress($result['email']);
该行代码在每次循环迭代中将每个成员添加到听众中。您永远不会清除 object/property,因此它只会在通过 $results 时积累您的全部受众。
在循环内创建 $mail,或以不同的方式指定电子邮件地址。