email : $email; $res = self::whereEmail($email)->where('created_at', '>', Carbon::now()->subMinutes(30))->whereType($type)->first(); if ($res && $type == 1) return; //删除 self::whereUserid($email)->delete(); $code = $type == 1 ? Base::generatePassword(64) : rand(100000, 999999); $row = self::createInstance([ 'userid' => $user->userid, 'email' => $email, 'code' => $code, 'status' => 0, 'type' => $type ]); $row->save(); $setting = Base::setting('emailSetting'); try { if (!Base::isEmail($email)) { throw new \Exception("User email '{$email}' address error"); } switch ($type) { case 2: $subject = env('APP_NAME') . "修改邮箱验证"; $content = "
{$user->nickname} 您好,您正在修改 " . env('APP_NAME') . " 的邮箱,验证码如下。请在30分钟内输入验证码
$code
如果不是本人操作,您的帐号可能存在风险,请及时修改密码!
"; break; case 3: $subject = env('APP_NAME') . "注销帐号验证"; $content = "{$user->nickname} 您好,您正在注销 " . env('APP_NAME') . " 的帐号,验证码如下。请在30分钟内输入验证码
$code
如果不是本人操作,您的帐号可能存在风险,请及时修改密码!
"; break; default: $url = Base::fillUrl('single/valid/email') . '?code=' . $row->code; $subject = env('APP_NAME') . "绑定邮箱验证"; $content = "{$user->nickname} 您好,您正在绑定 " . env('APP_NAME') . " 的邮箱,请于30分钟之内点击以下链接完成验证 :
"; break; } 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($email) ->subject($subject) ->html($content)) ->send(); } catch (\Throwable $e) { if (str_contains($e->getMessage(), "Timed Out")) { throw new ApiException("邮件发送超时,请检查邮箱配置是否正确"); } elseif ($e->getCode() === 550) { throw new ApiException('邮件内容被拒绝,请检查邮箱是否开启接收功能'); } else { throw new ApiException($e->getMessage()); } } } /** * 校验验证码 * @param $email * @param $code * @param int $type * @return bool */ public static function verify($email, $code, $type = 1) { if (!$code) { throw new ApiException('请输入验证码'); } /** @var UserEmailVerification $emailVerify */ $emailVerify = self::whereEmail($email)->whereType($type)->orderByDesc('id')->first(); if (empty($emailVerify) || $emailVerify->code != $code) { throw new ApiException('验证码错误'); } $oldTime = Carbon::parse($emailVerify->created_at)->timestamp; $time = Base::Time(); // 30分钟失效 if (abs($time - $oldTime) > 1800) { throw new ApiException('验证码已失效'); } self::whereEmail($email)->whereCode($code)->whereType($type)->update([ 'status' => 1 ]); return true; } }