// +---------------------------------------------------------------------- namespace ywxapp\library; use think\facade\Event; use ywxapp\library\Result; use ywxapp\model\Email as EmailModel; use ywxapp\model\MemberUser as UsersModel; /** * 邮箱验证码类. */ class Email { /** * 验证码有效时长 * @var int */ protected $expire = 120; /** * 最大允许检测的次数. * @var int */ protected $maxCheckNums = 10; /** * 获取当前对象实例. * * @return EmailModel */ public static function instance() { return app()->email; } /** * 发送验证码 * * @param int $email 邮箱 * @param int $code 验证码,为空时将自动生成4位数字 * @param string $event 事件 * * @return bool */ public function sendEmail($emailAddr, $code = null, $event = 'default') { $lastEmail = EmailModel::where('email', $emailAddr) ->where('event', $event) ->order('id', 'DESC') ->find(); Event::trigger('email_get', $lastEmail, true); if ($lastEmail && time() - $lastEmail['create_at'] < 60) Result::instance()->error(message: ('发送频繁')); if ($event) { $userinfo = UsersModel::where('email', $emailAddr)->find(); if ($event == 'register' && $userinfo) Result::instance()->error(('已被注册')); elseif (in_array($event, ['changeemail']) && $userinfo) Result::instance()->error(('已被占用')); elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) Result::instance()->error(('未注册')); } $code = is_null($code) ? mt_rand(100000, 999999) : $code; $time = time(); $ip = request()->ip(); $email = EmailModel::create([ 'event' => $event, 'email' => $emailAddr, 'code' => $code, 'ip' => $ip, 'create_at' => $time, ]); $result = Event::trigger('email_send', $email, true); if (!$result) Result::instance()->error(message: ('发送失败')); Result::instance()->success(message: ('发送成功')); } /** * 发送通知. * * @param mixed $email 邮箱,多个以,分隔 * @param string $msg 消息内容 * @param string $template 消息模板 * * @return bool */ public function notice($email, $msg = '', $template = null) { $params = [ 'email' => $email, 'msg' => $msg, 'template' => $template, ]; $result = Event::trigger('email_notice', $params, true); return $result ? true : false; } /** * 校验验证码 * * @param int $email 邮箱 * @param int $code 验证码 * @param string $event 事件 * * @return bool */ public function check($emailAddr, $code, $event = 'default') { $lastEmail = EmailModel::where('email', $emailAddr) ->where('event', $event) ->order('id', 'DESC') ->find(); if (!$lastEmail || $code != $lastEmail['code']) Result::instance()->error(message: ('验证码不正确')); if ($lastEmail['create_at'] > time() - $this->expire) Result::instance()->error(message: ('验证码已经过期')); if ($code != $lastEmail['code']) Result::instance()->error(message: ('验证码不正确')); $result = Event::trigger('ems_check', $lastEmail, true); $lastEmail->status = 1; $lastEmail->save(); return $result; } /** * 清空指定邮箱验证码 * * @param int $email 邮箱 * @param string $event 事件 * * @return bool */ public static function flush($email, $event = 'default') { EmailModel::where(['email' => $email, 'event' => $event])->delete(); Event::trigger('email_flush'); return true; } }