我正在使用 phpmailer 向我的订阅者发送批量电子邮件,但我面临一个可怕的问题,即当我向订阅者发送电子邮件时,每个订阅者都会多次收到相同的电子邮件。有些人获得了 4 次,有些人获得了 14 次。
我正在通过 Mysql 表获取 flag = 0 的订阅者电子邮件,在 while 循环结束时,我将订阅者标志更新为 1。我知道这是循环问题,但我不知道我在哪里做错了,甚至不确定我应该使用 while 循环或其他东西来解决这个问题。任何帮助将非常感谢我。
这是我的代码:
<?php
$db_host = "localhost";
$db_username = "root";
$db_pass = "";
$link= mysqli_connect("$db_host","$db_username","$db_pass", "mydb") or die ("could not connect to mysql");
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
// Simply:
//Load Composer's autoloader
require 'vendor/autoload.php';
if(isset($_POST['send'])){
$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
$query = "select customer_id, customer_name, customer_email from subscribers where flag_email = 0";
$result = mysqli_query($link, $query) or die("No customer in the table");;
while($values = mysqli_fetch_array($result)){
$id = $values['customer_id'];
$name = $values['customer_name'];
$toemail = $values['customer_email'];
//Server settings
$mail->SMTPDebug = 1; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp server'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'username'; // SMTP username
$mail->Password = 'password'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
//Recipients
$mail->setFrom('username', 'username');
$mail->addReplyTo('myemail', 'name');
$mail->addBCC(''.$toemail.'', ''.$name.'');
//Content
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body = 'Here is the message';
$mail->send();
echo 'Message has been sent';
$upd_query = "update subscribers set flag_email = 1 where customer_id = ".$id."";
$result= mysqli_query($link, $upd_query);
}
} catch (Exception $e) {
echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
}
}
发生这种情况是因为您没有清除to
每次循环时的地址 - 请注意该方法被调用addAddress
, not setAddress
,并且它执行了所建议的操作。你需要打电话$mail->clearAddresses();
在循环结束时重置它。否则,您所做的事情大部分都是正确的,但是您可以采取一些措施来提高效率,主要是使用保持活动状态并在循环之前设置所有消息通用的所有属性。
你可以看到这一切都在工作PHPMailer 提供的邮件列表示例 https://github.com/PHPMailer/PHPMailer/blob/master/examples/mailing_list.phps.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)