From baae2cc26f6e7f7e7709ae45c310c5c9e07081fa Mon Sep 17 00:00:00 2001 From: lkddi Date: Fri, 27 Feb 2026 09:47:47 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=B9=E6=80=A7=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=88=9B=E5=A7=8B=E4=BA=BA=E4=B8=93=E4=BA=AB=E7=9A=84=E5=9C=A8?= =?UTF-8?q?=E7=BA=BF=20SMTP=20=E9=85=8D=E7=BD=AE=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=B9=B6=E5=9C=A8=20AppServiceProvider=20=E4=B8=AD=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E5=8A=A0=E8=BD=BD=E4=BB=A5=E6=8B=A6=E6=88=AA=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=8F=91=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Admin/SmtpController.php | 84 ++++++++++ .../Controllers/Admin/SystemController.php | 2 + app/Providers/AppServiceProvider.php | 31 +++- resources/views/admin/layouts/app.blade.php | 6 +- resources/views/admin/smtp/edit.blade.php | 143 ++++++++++++++++++ routes/web.php | 5 + 6 files changed, 269 insertions(+), 2 deletions(-) create mode 100644 app/Http/Controllers/Admin/SmtpController.php create mode 100644 resources/views/admin/smtp/edit.blade.php diff --git a/app/Http/Controllers/Admin/SmtpController.php b/app/Http/Controllers/Admin/SmtpController.php new file mode 100644 index 0000000..052ee67 --- /dev/null +++ b/app/Http/Controllers/Admin/SmtpController.php @@ -0,0 +1,84 @@ +pluck('body', 'alias')->toArray(); + $descriptions = SysParam::where('alias', 'like', 'smtp_%')->pluck('guidetxt', 'alias')->toArray(); + + return view('admin.smtp.edit', compact('params', 'descriptions')); + } + + /** + * 更新 SMTP 配置,并刷新全站 Cache 缓存 + */ + public function update(Request $request): RedirectResponse + { + $data = $request->except(['_token', '_method']); + + foreach ($data as $alias => $body) { + SysParam::updateOrCreate( + ['alias' => $alias], + ['body' => $body ?? ''] + ); + + // 写入 Cache 保证极速读取 + $this->chatState->setSysParam($alias, $body ?? ''); + + // 清除 Sysparam 模型的内部缓存 + SysParam::clearCache($alias); + } + + return redirect()->route('admin.smtp.edit')->with('success', 'SMTP 发信配置已成功保存更新!'); + } + + /** + * 发送测试邮件 + */ + public function test(Request $request): RedirectResponse + { + $request->validate([ + 'test_email' => 'required|email' + ]); + + $testEmail = $request->input('test_email'); + + try { + Mail::raw('您好,这是一封来自【飘落流星聊天室】系统的测试邮件,当您看到这封邮件,说明系统后台您的 SMTP 设置已经完全畅通无误。', function ($message) use ($testEmail) { + $message->to($testEmail) + ->subject('飘落流星聊天室 - SMTP 发信测试'); + }); + + return redirect()->route('admin.smtp.edit')->with('success', "测试邮件已成功发送至 {$testEmail},请注意查收。"); + } catch (\Exception $e) { + return redirect()->route('admin.smtp.edit')->with('error', "测试发出失败,原因:" . $e->getMessage()); + } + } +} diff --git a/app/Http/Controllers/Admin/SystemController.php b/app/Http/Controllers/Admin/SystemController.php index 86e6730..8f75230 100644 --- a/app/Http/Controllers/Admin/SystemController.php +++ b/app/Http/Controllers/Admin/SystemController.php @@ -31,10 +31,12 @@ class SystemController extends Controller { // 读取数据库中最新的参数 (剔除专属模块已接管的配置,避免重复显示) $params = SysParam::whereNotIn('alias', ['chatbot_enabled']) + ->where('alias', 'not like', 'smtp_%') ->get()->pluck('body', 'alias')->toArray(); // 为后台界面准备的文案对照 (可动态化或硬编码) $descriptions = SysParam::whereNotIn('alias', ['chatbot_enabled']) + ->where('alias', 'not like', 'smtp_%') ->get()->pluck('guidetxt', 'alias')->toArray(); return view('admin.system.edit', compact('params', 'descriptions')); diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b6..cccff55 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,6 +3,9 @@ namespace App\Providers; use Illuminate\Support\ServiceProvider; +use App\Models\Sysparam; +use Illuminate\Support\Facades\Config; +use Illuminate\Support\Facades\Schema; class AppServiceProvider extends ServiceProvider { @@ -19,6 +22,32 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { - // + // 动态加载自定义 SMTP 配置 (如果有数据库则执行) + try { + if (Schema::hasTable('sysparam')) { + $smtpConfig = Sysparam::where('alias', 'like', 'smtp_%')->pluck('body', 'alias'); + + if ($smtpConfig->isNotEmpty() && $smtpConfig->get('smtp_host')) { + Config::set('mail.default', 'smtp'); + Config::set('mail.mailers.smtp', [ + 'transport' => 'smtp', + 'host' => $smtpConfig->get('smtp_host'), + 'port' => $smtpConfig->get('smtp_port', 465), + 'encryption' => $smtpConfig->get('smtp_encryption', 'ssl'), + 'username' => $smtpConfig->get('smtp_username'), + 'password' => $smtpConfig->get('smtp_password'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN'), + ]); + + Config::set('mail.from', [ + 'address' => $smtpConfig->get('smtp_from_address', $smtpConfig->get('smtp_username')), + 'name' => $smtpConfig->get('smtp_from_name', '飘落流星聊天室'), + ]); + } + } + } catch (\Exception $e) { + // 在安装初期表不存在时忽略,防止应用崩溃 + } } } diff --git a/resources/views/admin/layouts/app.blade.php b/resources/views/admin/layouts/app.blade.php index 1d61713..3113840 100644 --- a/resources/views/admin/layouts/app.blade.php +++ b/resources/views/admin/layouts/app.blade.php @@ -24,7 +24,11 @@ @if (Auth::id() === 1) - ⚙️ 系统参数参数 + ⚙️ 聊天室参数设置 + + + 📧 邮件 SMTP 配置 @endif +
⚠️
+
+

重要安全警示:最高安全级别配置

+

+ 本页面用于配置支持全站消息推送、密码找回等关键业务的底层 SMTP 邮件网关接口。
+ 由于涉及关键的授权密码/秘钥安全,**该界面已被系统强制锁定仅允许 ID=1 的系统创始人操作**。请确保填写的服务器、账号、授权码准确无误。 +

+
+ + +
+ + +
+
+

+ 📧 编辑 SMTP 发件参数 +

+
+
+
+ @csrf + @method('PUT') + +
+
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+ +
+ +
+
+
+
+ + +
+
+

+ 📡 线路连通性测试 +

+
+
+

+ 配置保存完毕后,请在下方输入一个你能立即查收的外部邮箱地址(如网易/新浪等),系统将尝试发送一封包含成功验证的测试函。

+
+ @csrf +
+ + + +
+
+
+
+
+@endsection diff --git a/routes/web.php b/routes/web.php index 337359f..505b7be 100644 --- a/routes/web.php +++ b/routes/web.php @@ -109,6 +109,11 @@ Route::middleware(['chat.auth', 'chat.level:super'])->prefix('admin')->name('adm Route::middleware(['chat.site_owner'])->group(function () { Route::get('/system', [\App\Http\Controllers\Admin\SystemController::class, 'edit'])->name('system.edit'); Route::put('/system', [\App\Http\Controllers\Admin\SystemController::class, 'update'])->name('system.update'); + + // 发信配置管理 + Route::get('/smtp', [\App\Http\Controllers\Admin\SmtpController::class, 'edit'])->name('smtp.edit'); + Route::put('/smtp', [\App\Http\Controllers\Admin\SmtpController::class, 'update'])->name('smtp.update'); + Route::post('/smtp/test', [\App\Http\Controllers\Admin\SmtpController::class, 'test'])->name('smtp.test'); }); // 用户大盘管理 (替代 gl/ 目录下的各种用户管理功能)