PHPMailer从MySQL读取收件人地址无法发送邮件问题求助
故障排查方案
- 修复SQL查询错误
当前SQL语句中引用了别名为l的表字段l.Position Name和`l.`Position Email,但整段查询逻辑中没有关联任何别名为l的表,这会直接导致$r['EmailPresidente']、$r['NomePresidente']两个核心字段为空。PHPMailer在没有有效收件人的情况下,即便返回发送成功状态,实际也不会完成邮件投递,补充对应表的JOIN关联逻辑即可修复该问题。 - 增加收件人有效性校验
调用AddAddress、addCC方法前,先校验对应邮箱字段是否存在、是否为合法邮箱格式,避免空值、非法格式传入:// 主收件人校验 if (!empty($r['EmailPresidente']) && filter_var($r['EmailPresidente'], FILTER_VALIDATE_EMAIL)) { $mail->AddAddress(trim($r['EmailPresidente']), trim($r['NomePresidente']) ?? ''); } // 抄送收件人校验 if (!empty($r['EmailArquiteto']) && filter_var($r['EmailArquiteto'], FILTER_VALIDATE_EMAIL)) { $mail->addCC(trim($r['EmailArquiteto']), trim($r['NomeArquiteto']) ?? ''); } if (!empty($r['EmailGerente']) && filter_var($r['EmailGerente'], FILTER_VALIDATE_EMAIL)) { $mail->addCC(trim($r['EmailGerente']), trim($r['NomeGerente']) ?? ''); } // 校验是否存在有效收件人 if (count($mail->getToAddresses()) === 0) { $res = 0; $msg = "无有效收件人,邮件发送取消"; } - 开启调试日志定位问题
你已经初始化new PHPMailer(true)开启了异常模式,可将发送逻辑包裹在try-catch块中,同时开启SMTP调试输出,查看发送全流程的详细日志:// 开启SMTP调试,调试完成后改为0关闭日志输出 $mail->SMTPDebug = 2; // 将调试日志写入本地文件方便排查 $mail->Debugoutput = function($str, $level) { file_put_contents('./mail_debug.log', date('Y-m-d H:i:s').' '.$str.PHP_EOL, FILE_APPEND); }; try { $resp = $mail->send(); if ($resp) { $res = 1; $msg = "E-mail de aviso enviado com sucesso!"; } } catch (Exception $e) { $res = 0; $msg = "发送失败,错误详情:" . $e->getMessage(); } - 排查投递链路问题
若以上修改后仍存在问题,可登录发件邮箱的SMTP服务后台查看退信记录,确认是否是收件人地址无效、被收件方反垃圾规则拦截、触发邮箱发送频率限制等原因导致投递失败。
内容的提问来源于stack exchange,提问作者Claudionir Queiroz
相关产品推荐
相关产品推荐

