PHPMailer-master无法发送邮件,现有解决方案均无效求指导
问题排查及解决方案
第一个问题:重复导入PHPMailer类文件导致版本冲突
代码同时导入了PHPMailer 6.x版本的命名空间类文件和旧版的class.phpmailer.php,类定义冲突会直接阻断代码运行,先删除require_once('class.phpmailer.php');这行代码。第二个问题:缺少SMTP基础配置,无报错调试逻辑
未指定PHPMailer使用SMTP协议,默认调用的服务器mail()函数大部分场景下被服务商禁用,同时缺少发件邮箱的SMTP认证信息、加密方式、端口等必填配置,且无异常捕获逻辑,无法定位错误原因。第三个问题:附件路径未做有效性校验
代码直接使用$file变量作为附件路径,未提前验证路径是否存在、是否有读取权限,附件路径异常也会导致发送失败。
修正后可直接使用的参考代码
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'PHPMailer/src/Exception.php'; require 'PHPMailer/src/PHPMailer.php'; require 'PHPMailer/src/SMTP.php'; // 调试模式:排查问题时设为2可输出完整SMTP交互日志,上线后改为0关闭 $debugMode = 2; $send_mail = new PHPMailer($debugMode); try { // SMTP基础配置,对应参数替换为你邮箱服务商提供的真实值 $send_mail->isSMTP(); $send_mail->Host = 'smtp.altervista.org'; $send_mail->SMTPAuth = true; $send_mail->Username = 'classiperlo2@altervista.org'; $send_mail->Password = '你的邮箱登录密码或专属授权码'; $send_mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $send_mail->Port = 465; // 收发件人配置 $send_mail->setFrom('classiperlo2@altervista.org', 'classiperlo2'); $send_mail->addAddress('mymail@gmail.com'); // 邮件内容配置 $send_mail->isHTML(false); $send_mail->Subject = 'Backup'; $send_mail->Body = 'Backup'; // 附件合法性校验后再添加 $attach_file = $file; // 此处提前给$file赋值为文件的绝对路径,避免相对路径读取失败 if (file_exists($attach_file) && is_readable($attach_file)) { $send_mail->addAttachment($attach_file); } else { throw new Exception('附件异常:不存在或无读取权限,路径为'.$attach_file); } $send_mail->send(); echo '发送成功'; return true; } catch (Exception $e) { echo "发送失败,错误信息:{$send_mail->ErrorInfo}"; return false; }
后续排查步骤
- 替换代码里的邮箱密码、附件路径两个变量为真实值,确认SMTP地址、端口和邮箱服务商公示的参数一致
- 开启调试模式运行代码,根据输出的错误信息定位问题:如果提示SMTP连接失败,联系主机商确认服务器开放了对应发件端口的出站权限;如果提示认证失败,确认是不是需要用邮箱专属授权码而非登录密码
- 测试发送成功后,再把调试模式改为0关闭日志输出
内容的提问来源于stack exchange,提问作者Giancarlo
相关产品推荐
相关产品推荐

