在PHP while循环中使用PHPMailer批量发送邮件提示类未找到问题求助
问题解决方法
你遇到的Class "PHPMailer" not found报错是因为新版PHPMailer自带命名空间,仅引入文件没有声明命名空间的话,全局空间无法直接访问PHPMailer类,解决步骤如下:
- 第一步:在引入PHPMailer三个文件的代码后,追加命名空间声明
require_once('../includes/PHPMailer.php'); require_once('../includes/SMTP.php'); require_once('../includes/Exception.php'); // 追加下面三行命名空间声明 use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception;
- 第二步:验证实例化调用逻辑
如果加了use声明后还是报错,可以直接用带命名空间的全限定名实例化,替换原来的$mail = new PHPMailer();代码为:
$mail = new PHPMailer\PHPMailer\PHPMailer();
- 额外问题修复&优化建议
- 你当前代码里的
$name和$to_email两个变量没有定义就直接使用,解决类找不到的问题后会触发新报错,需要先补充这两个变量的赋值逻辑 - 批量发邮件不需要每次循环都新建PHPMailer实例、重复配置SMTP参数,可以把实例初始化和SMTP配置放到最外层循环外面,每次循环只需要清空旧收件人、修改邮件内容后调用send即可,大幅提升发送效率:
- 你当前代码里的
// 外层提前初始化一次即可 $mail = new PHPMailer(); $mail->isSMTP(); $mail->SMTPOptions = array ( 'ssl' => array ( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) ); $mail->Host = "smtp.gmail.com"; $mail->SMTPAuth = true; $mail->SMTPSecure = "tls"; $mail->Port = "587"; $mail->Username = "from@gmail.com"; $mail->Password = "12345678"; $mail->Subject = "用药提醒通知"; $mail->isHTML(true); // 循环内部只需要修改动态参数即可 while($row = $statement->fetch(PDO::FETCH_OBJ)) { // ...原有业务查询逻辑保持不变... $mail->clearAddresses(); // 清空上一次的收件人信息 $mail->setFrom("from@gmail.com",$by); $mail->Body = "<h3>来自 {$by} 的用药提醒报告</h3></br> 你收到提醒:<b>{$name}</b> 漏服了 {$directions} 类药物 {$row->med_type},请及时采取对应措施。"; $mail->addAddress($to_email['Email_add']); $mail->send(); }
内容的提问来源于stack exchange,提问作者Namri
相关产品推荐
相关产品推荐

