160 lines
4.4 KiB
PHP
160 lines
4.4 KiB
PHP
<?php
|
|
// +----------------------------------------------------------------------
|
|
// | YwxApp [ WE CAN DO IT JUST THINK ]
|
|
// +----------------------------------------------------------------------
|
|
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
|
|
// +----------------------------------------------------------------------
|
|
// | Author: ywxapp<admin@ywxapp.cn>
|
|
// +----------------------------------------------------------------------
|
|
|
|
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;
|
|
}
|
|
|
|
|
|
|
|
}
|