如有任何问题请联系博主,还请诸位大佬多多关照!!!
       添加博主
详情
评论
问答

修复主站后台发送测试邮件报错和前台忘记密码功能丢失问题

前言

📧 PHPMailer 5.2 替换全流程

ThinkPHP 5.0 + FastAdmin 邮件修复指南

适用:PHP 7.4、无 Composer、即拷即用


一、为什么要替换?

  • Tx\Mailer 握手失败:SMTP Server did not respond with anything I recognized
  • 后台测试、前台忘记密码 全部无法发信
  • PHPMailer 5.2 原生 SMTP,零依赖5 分钟搞定

二、安装 PHPMailer 5.2(无 Composer)

bash
# 1. 进入项目根目录
cd /www/wwwroot/你的项目根目录

# 2. 下载 5.2.28 完整包
wget https://github.com/PHPMailer/PHPMailer/archive/refs/tags/v5.2.28.tar.gz

# 3. 解压并重命名
tar -xzf v5.2.28.tar.gz && mv PHPMailer-5.2.28 PHPMailer && rm v5.2.28.tar.gz

# 4. 修正权限
chown -R www:www PHPMailer

三、验证文件存在

bash
# 1. 三个文件是否都有
ls PHPMailer/class.phpmailer.php
ls PHPMailer/class.smtp.php
ls PHPMailer/PHPMailerAutoload.php

四、替换前台「忘记密码」发送逻辑

文件:application/index/controller/User.php
方法:forgot() 内 保存 token 后 的邮件块

① 原代码(Tx\Mailer)
$email_obj = new Email();
$result = $email_obj
    ->to($email)
    ->subject($subject)
    ->message($message)
    ->send();

② 替换成 PHPMailer 5.2 读库版
// 从数据库读取邮件配置
$config = \think\Config::get('site');
$host   = $config['mail_smtp_host']   ?? 'smtp.qq.com';
$port   = $config['mail_smtp_port']   ?? 465;
$user   = $config['mail_smtp_user']   ?? '';
$pass   = $config['mail_smtp_pass']   ?? '';
$from   = $config['mail_from']        ?? '';
$verify = $config['mail_verify_type'] ?? 'ssl';
$secureMap = ['' => '', 1 => 'tls', 2 => 'ssl'];
$secure = $secureMap[$verify] ?? 'ssl';

// 屏蔽废弃提示
error_reporting(E_ALL & ~E_DEPRECATED);
require_once APP_PATH . '../PHPMailer/PHPMailerAutoload.php';
$mail = new \PHPMailer(true);

// PHPMailer 5.2 发送
require_once APP_PATH . '../PHPMailer/PHPMailerAutoload.php';
$mail = new \PHPMailer(true);
$mail->IsSMTP();
$mail->IsHTML(true);
$mail->Host       = $host;
$mail->SMTPAuth   = true;
$mail->Username   = $user;
$mail->Password   = $pass;
$mail->SMTPSecure = $secure;
$mail->Port       = $port;

$mail->SetFrom($from, $config['mail_smtp_user'] ?? '系统邮件');
$mail->AddAddress($email);
$mail->Subject = $subject;
$mail->Body    = $message;

try {
    $mail->Send();
    $result = true;
} catch (Exception $e) {
    $result = false;
}

五、替换后台「发送测试邮件」按钮逻辑

文件:application/admin/controller/general/Config.php
方法:emailtest()

① 原代码(Tx\Mailer)
$email = new Email;
$result = $email
    ->to($receiver)
    ->subject(...)
    ->message(...)
    ->send();

② 替换成 PHPMailer 5.2 读库版
// 从数据库读取邮件配置
$site   = \think\Config::get('site');
$host   = $site['mail_smtp_host']   ?? 'smtp.qq.com';
$port   = $site['mail_smtp_port']   ?? 465;
$user   = $site['mail_smtp_user']   ?? '';
$pass   = $site['mail_smtp_pass']   ?? '';
$from   = $site['mail_from']        ?? '';
$verify = $site['mail_verify_type'] ?? 'ssl';
$secureMap = ['' => '', 1 => 'tls', 2 => 'ssl'];
$secure = $secureMap[$verify] ?? 'ssl';

// 屏蔽废弃提示
error_reporting(E_ALL & ~E_DEPRECATED);
require_once APP_PATH . '../PHPMailer/PHPMailerAutoload.php';
$mail = new \PHPMailer(true);

// PHPMailer 5.2 发送
require_once APP_PATH . '../PHPMailer/PHPMailerAutoload.php';
$mail = new \PHPMailer(true);
$mail->IsSMTP();
$mail->IsHTML(true);
$mail->Host       = $host;
$mail->SMTPAuth   = true;
$mail->Username   = $user;
$mail->Password   = $pass;
$mail->SMTPSecure = $secure;
$mail->Port       = $port;

$mail->SetFrom($from, $site['mail_smtp_user'] ?? '系统邮件');
$mail->AddAddress($receiver);
$mail->Subject = __("This is a test mail", $site['name']);
$mail->Body    = '<div style="min-height:550px; padding: 100px 55px 200px;">' . __('This is a test mail content', $site['name']) . '</div>';

try {
    $mail->Send();
    $this->success(__('Test mail sent successfully'));
} catch (Exception $e) {
    $this->error(__('Failed to send test mail') . ':' . $mail->ErrorInfo);
}

六、后台配置对照(一次性填对)

SMTP服务器 smtp.qq.com
SMTP端口 465
SMTP用户名 你的邮箱地址
SMTP密码 16位授权码(不是QQ密码)
SMTP验证方式 SSL
发件人邮箱 你的邮箱地址
测试接收者邮箱 你自己的接收测试用

七、清缓存 & 全流程验证

rm -rf /www/wwwroot/你项目目录/runtime/temp/*

八、(可选)切换登录模板为 login2.html

① 修改控制器模板调用

文件:application/index/controller/User.php
方法:login() 末尾:
// 指定用 login2.html 模板(第210行左右)

图片[1]-修复主站后台发送测试邮件报错和前台忘记密码功能丢失问题-博客喵

return $this->view->fetch(‘login2’);

② 确保 login2.html 链接正确

检查 application/index/view/user/login2.html 内:

<a href=”{:url(‘user/forgot’)}”>忘记密码</a>

③ 清缓存 & 验证

rm -rf /www/wwwroot/你的证书站/runtime/temp/*

后续维护小贴士

只改后台「邮件配置」即可,代码永不需再动;
升级 PHP 8.x 后可随时 composer require phpmailer/phpmailer:^6 一键升官方最新版;
若换邮箱服务商,只需改 SMTP服务器/端口/用户名/密码 四项即可。
🎉 全面修复完成!
前台、后台邮件发送均正常 → 任务达成 ✅
🎉 全面修复完成!
前台 login2 + 后台测试 + 忘记密码流程 全部正常 → 任务达成 ✅

效果展示

图片[2]-修复主站后台发送测试邮件报错和前台忘记密码功能丢失问题-博客喵
图片[3]-修复主站后台发送测试邮件报错和前台忘记密码功能丢失问题-博客喵
© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容