From 6b9c20bf93652daf7b1c60c7d92c34808e4d869e Mon Sep 17 00:00:00 2001 From: kuaifan Date: Sun, 3 Jul 2022 18:00:51 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=B7=BB=E5=8A=A0=E9=82=AE=E4=BB=B6?= =?UTF-8?q?=E5=BF=BD=E7=95=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/SystemController.php | 27 ++++++++----- app/Models/Setting.php | 39 ++++++++++++++++++- app/Models/UserEmailVerification.php | 18 +++++---- app/Tasks/EmailNoticeTask.php | 37 ++++++++++-------- .../setting/components/SystemEmailSetting.vue | 11 ++++++ 5 files changed, 97 insertions(+), 35 deletions(-) diff --git a/app/Http/Controllers/Api/SystemController.php b/app/Http/Controllers/Api/SystemController.php index f576a8937..dee3c7fd8 100755 --- a/app/Http/Controllers/Api/SystemController.php +++ b/app/Http/Controllers/Api/SystemController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Api; +use App\Models\Setting; use App\Models\User; use App\Module\Base; use Arr; @@ -99,7 +100,7 @@ class SystemController extends AbstractController * * @apiParam {String} type * - get: 获取(默认) - * - save: 保存设置(参数:['smtp_server', 'port', 'account', 'password', 'reg_verify', 'notice', 'task_start_minute', 'task_remind_hours', 'task_remind_hours2', 'notice_msg', 'msg_unread_user_minute', 'msg_unread_group_minute']) + * - save: 保存设置(参数:['smtp_server', 'port', 'account', 'password', 'reg_verify', 'notice', 'task_start_minute', 'task_remind_hours', 'task_remind_hours2', 'notice_msg', 'msg_unread_user_minute', 'msg_unread_group_minute', 'ignore_addr']) * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {Object} data 返回数据 @@ -127,7 +128,8 @@ class SystemController extends AbstractController 'task_remind_hours2', 'notice_msg', 'msg_unread_user_minute', - 'msg_unread_group_minute' + 'msg_unread_group_minute', + 'ignore_addr' ])) { unset($all[$key]); } @@ -149,6 +151,7 @@ class SystemController extends AbstractController $setting['notice_msg'] = $setting['notice_msg'] ?: 'close'; $setting['msg_unread_user_minute'] = intval($setting['msg_unread_user_minute'] ?? -1); $setting['msg_unread_group_minute'] = intval($setting['msg_unread_group_minute'] ?? -1); + $setting['ignore_addr'] = $setting['ignore_addr'] ?: ''; // return Base::retSuccess('success', $setting ?: json_decode('{}')); } @@ -695,14 +698,18 @@ class SystemController extends AbstractController return Base::retError('请输入正确的收件人地址'); } try { - Factory::mailer() - ->setDsn("smtp://{$all['account']}:{$all['password']}@{$all['smtp_server']}:{$all['port']}?verify_peer=0") - ->setMessage(EmailMessage::create() - ->from(env('APP_NAME', 'Task') . " <{$all['account']}>") - ->to($all['to']) - ->subject('Mail sending test') - ->html('

收到此电子邮件意味着您的邮箱配置正确。

Receiving this email means that your mailbox is configured correctly.

')) - ->send(); + Setting::validateAddr($all['to'], function($to) use ($all) { + Factory::mailer() + ->setDsn("smtp://{$all['account']}:{$all['password']}@{$all['smtp_server']}:{$all['port']}?verify_peer=0") + ->setMessage(EmailMessage::create() + ->from(env('APP_NAME', 'Task') . " <{$all['account']}>") + ->to($to) + ->subject('Mail sending test') + ->html('

收到此电子邮件意味着您的邮箱配置正确。

Receiving this email means that your mailbox is configured correctly.

')) + ->send(); + }, function () { + throw new \Exception("收件人地址错误或已被忽略"); + }); return Base::retSuccess('成功发送'); } catch (\Throwable $e) { // 一般是请求超时 diff --git a/app/Models/Setting.php b/app/Models/Setting.php index a337cfc3f..dea33845f 100644 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -2,6 +2,8 @@ namespace App\Models; +use App\Module\Base; + /** * App\Models\Setting * @@ -24,5 +26,40 @@ namespace App\Models; */ class Setting extends AbstractModel { - + /** + * 验证邮箱地址(过滤忽略地址) + * @param $array + * @param \Closure $resultClosure + * @param \Closure|null $emptyClosure + * @return array|mixed + */ + public static function validateAddr($array, $resultClosure, $emptyClosure = null) + { + if (!is_array($array)) { + $array = [$array]; + } + $ignoreAddr = Base::settingFind('emailSetting', 'ignore_addr'); + $ignoreAddr = explode("\n", $ignoreAddr); + $ignoreArray = ['admin@dootask.com', 'test@dootask.com']; + foreach ($ignoreAddr as $item) { + if (Base::isEmail($item)) { + $ignoreArray[] = trim($item); + } + } + if ($ignoreArray) { + $array = array_diff($array, $ignoreArray); + } + if ($array) { + if ($resultClosure instanceof \Closure) { + foreach ($array as $value) { + $resultClosure($value); + } + } + } else { + if ($emptyClosure instanceof \Closure) { + $emptyClosure(); + } + } + return $array; + } } diff --git a/app/Models/UserEmailVerification.php b/app/Models/UserEmailVerification.php index ae2ac3fe2..eb0f2b4dd 100644 --- a/app/Models/UserEmailVerification.php +++ b/app/Models/UserEmailVerification.php @@ -59,14 +59,16 @@ class UserEmailVerification extends AbstractModel } $subject = env('APP_NAME') . " 绑定邮箱验证"; $content = "

{$user->nickname} 您好,您正在绑定 " . env('APP_NAME') . " 的邮箱,请于30分钟之内点击以下链接完成验证 :

{$url}

"; - Factory::mailer() - ->setDsn("smtp://{$setting['account']}:{$setting['password']}@{$setting['smtp_server']}:{$setting['port']}?verify_peer=0") - ->setMessage(EmailMessage::create() - ->from(env('APP_NAME', 'Task') . " <{$setting['account']}>") - ->to($user->email) - ->subject($subject) - ->html($content)) - ->send(); + Setting::validateAddr($user->email, function ($to) use ($content, $subject, $setting) { + Factory::mailer() + ->setDsn("smtp://{$setting['account']}:{$setting['password']}@{$setting['smtp_server']}:{$setting['port']}?verify_peer=0") + ->setMessage(EmailMessage::create() + ->from(env('APP_NAME', 'Task') . " <{$setting['account']}>") + ->to($to) + ->subject($subject) + ->html($content)) + ->send(); + }); } catch (\Throwable $e) { if (str_contains($e->getMessage(), "Timed Out")) { throw new ApiException("language.TimedOut"); diff --git a/app/Tasks/EmailNoticeTask.php b/app/Tasks/EmailNoticeTask.php index 3d7b8c0ac..53b908eb1 100644 --- a/app/Tasks/EmailNoticeTask.php +++ b/app/Tasks/EmailNoticeTask.php @@ -4,6 +4,7 @@ namespace App\Tasks; use App\Models\ProjectTask; use App\Models\ProjectTaskMailLog; +use App\Models\Setting; use App\Models\User; use App\Models\WebSocketDialogMsg; use App\Models\WebSocketDialogMsgRead; @@ -150,14 +151,16 @@ class EmailNoticeTask extends AbstractTask 'task' => $task, 'setting' => $setting, ])->render(); - Factory::mailer() - ->setDsn("smtp://{$setting['account']}:{$setting['password']}@{$setting['smtp_server']}:{$setting['port']}?verify_peer=0") - ->setMessage(EmailMessage::create() - ->from(env('APP_NAME', 'Task') . " <{$setting['account']}>") - ->to($user->email) - ->subject($subject) - ->html($content)) - ->send(); + Setting::validateAddr($user->email, function($to) use ($content, $subject, $setting) { + Factory::mailer() + ->setDsn("smtp://{$setting['account']}:{$setting['password']}@{$setting['smtp_server']}:{$setting['port']}?verify_peer=0") + ->setMessage(EmailMessage::create() + ->from(env('APP_NAME', 'Task') . " <{$setting['account']}>") + ->to($to) + ->subject($subject) + ->html($content)) + ->send(); + }); $data['is_send'] = 1; } catch (\Throwable $e) { $data['send_error'] = $e->getMessage(); @@ -247,14 +250,16 @@ class EmailNoticeTask extends AbstractTask $content = str_replace("{{RemoteURL}}", config("app.url") . "/", $content); } try { - Factory::mailer() - ->setDsn("smtp://{$setting['account']}:{$setting['password']}@{$setting['smtp_server']}:{$setting['port']}?verify_peer=0") - ->setMessage(EmailMessage::create() - ->from(env('APP_NAME', 'Task') . " <{$setting['account']}>") - ->to($user->email) - ->subject($subject) - ->html($content)) - ->send(); + Setting::validateAddr($user->email, function($to) use ($content, $subject, $setting) { + Factory::mailer() + ->setDsn("smtp://{$setting['account']}:{$setting['password']}@{$setting['smtp_server']}:{$setting['port']}?verify_peer=0") + ->setMessage(EmailMessage::create() + ->from(env('APP_NAME', 'Task') . " <{$setting['account']}>") + ->to($to) + ->subject($subject) + ->html($content)) + ->send(); + }); } catch (\Throwable $e) { info("unreadMsgEmail: " . $e->getMessage()); } diff --git a/resources/assets/js/pages/manage/setting/components/SystemEmailSetting.vue b/resources/assets/js/pages/manage/setting/components/SystemEmailSetting.vue index 983a659be..f8bb6fddd 100644 --- a/resources/assets/js/pages/manage/setting/components/SystemEmailSetting.vue +++ b/resources/assets/js/pages/manage/setting/components/SystemEmailSetting.vue @@ -80,6 +80,16 @@ + +
+ +
+

{{ $L('忽略邮箱地址') }}

+ + +
{{$L('不会向忽略的邮箱地址发送邮件,可使用换行分割多个地址。')}}
+
+