如何不使用Composer,通过require_once()使用最新版PHPMailer?
我完全理解你想要纯xcopy式极简部署的需求,之前的报错核心原因是新版PHPMailer使用了命名空间,且不再自带旧版的自动加载文件,直接只引入PHPMailer.php是不够的。下面给你一步步解决的方案:
一、核心解决代码
首先你需要从PHPMailer的Releases页面下载最新的发布版压缩包,解压后把src目录放到你的项目里,然后手动引入3个核心文件,同时处理命名空间问题。完整代码如下:
// 手动引入PHPMailer的核心必需文件 require_once 'src/PHPMailer.php'; require_once 'src/SMTP.php'; require_once 'src/Exception.php'; // 引入命名空间,避免每次写完整类名 use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; // 初始化PHPMailer实例,传入true启用异常处理(更便于调试) $mail = new PHPMailer(true); try { // SMTP配置 $mail->isSMTP(); $mail->SMTPDebug = SMTP::DEBUG_SERVER; // 用常量替代数字,更清晰 $mail->Host = 'smtp.gmail.com'; $mail->Port = 587; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->SMTPAuth = true; $mail->Username = $smtpUsername; // 替换为你的Gmail账号 $mail->Password = $smtpPassword; // 替换为你的Gmail应用密码(注意:Gmail现在需要用应用密码,不是原密码) // 发件人与收件人设置 $mail->setFrom($emailFrom, $emailFromName); $mail->addAddress($emailTo, $emailToName); // 邮件内容设置 $mail->Subject = 'PHPMailer GMail SMTP test'; $mail->msgHTML('<p>test body</p>'); // 这里可以传完整的HTML内容 $mail->AltBody = 'HTML messaging not supported'; // 发送邮件 $mail->send(); echo 'Message sent!'; } catch (Exception $e) { // 捕获异常并输出错误信息 echo "Mailer Error: {$mail->ErrorInfo}"; }
为什么之前的代码报错?
新版PHPMailer的核心类都在PHPMailer\PHPMailer命名空间下,你之前直接写new PHPMailer;,PHP会在全局命名空间找这个类,自然找不到。要么用use语句引入命名空间,要么写完整的类名:new \PHPMailer\PHPMailer\PHPMailer();
二、解答你的三个疑惑
1. 下载的压缩包为什么缺少GitHub页面的文件?
GitHub仓库里的内容包含了开发所需的所有文件:测试用例、文档、示例代码、CI配置文件等,但发布版压缩包(从Releases页面下载的)只保留了运行必需的核心文件(也就是src目录和LICENSE等),去掉了开发冗余内容。如果想要获取完整的仓库文件,你可以直接Clone仓库,或者在Releases页面下载「Source code」压缩包。
2. 为什么示例引用不存在的autoload.php?
autoload.php是Composer生成的自动加载文件,当你用Composer安装PHPMailer时,Composer会自动生成这个文件,它能自动加载所有需要的类文件,不用手动写一堆require_once。官方示例默认是给使用Composer的用户准备的,所以会引用这个文件,但它确实不在发布版压缩包里,因为它不是PHPMailer本身的文件。
3. 为什么旧版本有PHPMailerAutoload.php,现在没有了?
PHPMailer在6.0版本做了重大架构更新,移除了自带的PHPMailerAutoload.php,转而推荐使用Composer的自动加载机制。你2017年的视频对应的是6.0之前的旧版本,所以和现在的新版本结构差异很大。
内容的提问来源于stack exchange,提问作者HerrimanCoder

