【PHP】一个邮箱点击验证的完整示例

目录

1.效果展示

2.发送验证码

3.进行验证


以绑定邮箱为例,注册验证的话修改判断逻辑

1.效果展示


2.发送验证码


    /**
     * 发点击验证
     * 参数 email
     */
    public function sendClick(){
        $param = $this->request->post();
        // 邮箱email的validate规则验证,略...

        $user = $this->auth->getUser();
        // 防抖
        $key = md5('send_click'.json_encode($param));
        $lock = Cache::get($key);
        if ($lock){
            $this->error('请勿频繁请求');
        }
        Cache::set($key, 1, 60);
        
        // 邮箱是否已被占用
        $find = User::where(['email' => $param['email']])
            ->where('id', '<>', $user['id'])
            ->find();
        if($find){
            $this->error('该邮箱已被其他账号绑定');
        }

        // 发送邮件
        $from = '我的name';
        $arr['subject'] = '【'.$from.'】请查收你的验证信息';
        $url = request()->domain();
        $content = json_encode([
            'url' => $url,
            'user_id' => $user->id,
            'email' => $param['email'],
            'time' => time(),
        ]);
        // url中的+号需要转义为%2B,否则无法正确识别,并进行常规的AES加解密
        $params = urlencode(Aes::encrypt($content));
        $url = $url.'/xxx/click_verify/check/?params='.$params;

        // 格式化邮箱的确认页面
        $arr['message'] = $this->clickHtml($url);
        $obj = new Email();
        $result = $obj
            ->from('自己的邮箱地址', $from)
            ->to($param['email'])
            ->subject($arr['subject'])
            ->message($arr['message'])
            ->send();
        if (!$result) {
            return false;
        }
        if ($ret) {
            $this->success(__('发送成功'));
        } else {
            $this->error(__('发送失败,请检查短信配置是否正确'));
        }
    }
    /**
     * @param $url
     * @return string
     * 点击验证
     */
    public function clickHtml($url)
    {
        return <<<HTML
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>电子邮件验证</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      background-color: #f7f7f7;
      padding: 20px;
      text-align: center;
    }

    h1 {
      text-align: center;
      margin-bottom: 30px;
    }

    p {
      line-height: 1.5;
      color: #4a4a4a;
      text-align: center;
    }

    a {
      display: inline-block;
      padding: 10px 15px;
      border-radius: 5px;
      color: blue;
      text-decoration: none;
      margin-top: 30px;
      text-align: center;
    }

    a:hover {
      text-decoration: underline;
    }
  </style>
</head>

<body>
  <h1>电子邮件验证</h1>
  <p>感谢您在我们的网站上注册认证!请单击以下链接验证您的电子邮件地址:</p>
  <p style="color: blue">{$url}</p>
</body>

</html>
HTML;
    }

3.进行验证


    public function check()
    {
        $param = $this->request->get('params');
        // 对参数进行验证
        $ret = $this->encry($param);
        if($ret['code'] == 0){
            $this->error($ret['msg']);
        }
        $array = $ret['array'];
        Db::startTrans();
        try {
            $user = User::where(['id' => $array['user_id']])->find();
            if($user['is_auth_email'] == 1){
                throw new \Exception('该账号已经认证邮箱,无需重复操作');
            }
            $user->is_auth_email = 1;
            $user->email = $array['email'];

            Creditscorelog::package($user, 'email_auth');

            $user->save();
            Db::commit();
        } catch (\Exception $e) {
            $this->error('验证失败:'.$e->getMessage());
        }
        $url = request()->domain();
        $this->success('验证成功', $url);
    }
    // 以下是验证的方法
    protected $noNeedUrl = ['www.taskpublish.com', 'www.52qzl.com'];
    /**
     * 验证
     */
    public function encry($param= []){
        if(empty($param)){
            return ['code' => 0,'msg' => '参数错误,验证失败'];
        }
        $domain = $_SERVER['HTTP_HOST'];
        if(!in_array($domain, $this->noNeedUrl)){
            return ['code' => 0,'msg' => '域名不在白名单中,验证失败'];
        }
        try {
            $ret = Aes::decrypt($param);
        } catch (\Exception $e) {
            return ['code' => 0,'msg' => $e->getMessage()];
        }
        $array = json_decode($ret, true);
        if(empty($array)){
            return ['code' => 0,'msg' => '参数错误,验证失败'];
        }
        if(time() - $array['time'] > 120){
            return ['code' => 0,'msg' => '验证超时,请重新发送'];
        }
        // 邮箱唯一性验证
        $find = User::where(['email' => $array['email']])
            ->where('id', '<>', $array['user_id'])
            ->find();
        if($find){
            return ['code' => 0,'msg' => '该邮箱已被其他账号绑定'];
        }
        return ['code' => 1,'array' => $array];
    }

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好,您的问题是关于邮箱批量验证系统PHP的。为了开发一个邮箱批量验证系统,您需要了解以下几个步骤: 1. 从一个文本文件中读取所有需要验证邮箱地址。 2. 使用PHP的SMTP库来连接到每个邮箱服务器,以验证邮箱地址的有效性。 3. 在验证过程中,需要检查MX记录以确保邮件服务器存在,以及检查SMTP服务器以确保邮箱地址是可用的。 4. 将验证结果保存到一个新的文件中,以备将来使用。 下面是一个简单的PHP代码示例,用于验证单个邮箱地址的有效性: ``` function verifyEmail($email) { $isValid = true; // Validate email address syntax if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $isValid = false; } // Get domain name from email address $domain = substr(strrchr($email, "@"), 1); // Verify MX record exists if ($isValid && !checkdnsrr($domain, "MX")) { $isValid = false; } // Verify SMTP server can accept mail if ($isValid) { $mxhosts = array(); getmxrr($domain, $mxhosts); foreach ($mxhosts as $mx) { $socket = fsockopen($mx, 25, $errno, $errstr, 10); if ($socket) { stream_set_timeout($socket, 10); $reply = fgets($socket, 4096); fclose($socket); if (preg_match("/^220/", $reply)) { break; } } } if (!$socket) { $isValid = false; } } return $isValid; } ``` 您可以使用此函数来验证单个邮箱地址的有效性。要批量验证多个邮箱地址,您可以编写一个循环来遍历输入文件中的所有邮箱地址,并为每个地址调用此函数。然后将验证结果保存到输出文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzoood

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值