首页 > php代码 > PHP用户注册邮箱验证激活帐号示例

PHP用户注册邮箱验证激活帐号示例

现在大部份网站都需要用户利用邮箱注册,然后再发帐号激活邮件到用户注册邮箱,用户点击链接就可以激活帐号了,下面我来介绍一下具体方法。

功能需求

PHP程序开发,用户在网站注册,需要用户通过邮件链接激活帐号,当用户注册后(用户信息写入数据库),没有登录邮箱激活帐号,规定24小时后自动删除没有激活帐号的用户信息,实现激活链接过期后,用户还可以使用该信息在网站注册

准备数据表

用户信息表中字段Email很重要,它可以用来验证用户、找回密码、甚至对网站方来说可以用来收集用户信息进行Email营销,以下是用户信息表t_user的表结构:

CREATE TABLE IF NOT EXISTS `t_user` ( 
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `username` varchar(30) NOT NULL COMMENT '用户名', 
  `password` varchar(32) NOT NULL COMMENT '密码', 
  `email` varchar(30) NOT NULL COMMENT '邮箱', 
  `token` varchar(50) NOT NULL COMMENT '帐号激活码', 
  `token_exptime` int(10) NOT NULL COMMENT '激活码有效期', 
  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态,0-未激活,1-已激活', 
  `regtime` int(10) NOT NULL COMMENT '注册时间', 
  PRIMARY KEY (`id`) 
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

HTML

在页面中放置一个注册表单,用户可以输入注册信息,包括用户名、密码和邮箱。

<form id="reg" action="register.php" method="post"> 
    <p>用户名:<input type="text" class="input" name="username" id="user"></p> 
    <p>密 码:<input type="password" class="input" name="password" id="pass"></p> 
    <p>E-mail:<input type="text" class="input" name="email" id="email"></p> 
    <p><input type="submit" class="btn" value="提交注册"></p> 
</form>

对于用户的输入要进行必要的前端验证,关于表单验证功能,建议您参考本站文章:实例讲解表单验证插件Validation的应用,本文对前端验证代码略过,另外其实页面中还应该有个要求用户重复输入密码的输入框,一时偷懒就此略过。

register.php

用户将注册信息提交到register.php进行处理。register.php需要完成写入数据和发送邮件两大功能。

首先包含必要的两个文件,connect.php和smtp.class.php,这两个文件在外面提供的下载包里有,欢迎下载。


include_once("connect.php");//连接数据库 

include_once("smtp.class.php");//邮件发送类

然后我们要过滤用户提交的信息,并验证用户名是否存在(前端也可以验证)。

<?php
$username = stripslashes(trim($_POST['username']));
$query = mysql_query("select id from t_user where username='$username'");
$num = mysql_num_rows($query);
if ($num == 1) {
    echo '用户名已存在,请换个其他的用户名';
    exit;
}
?>

接着我们将用户密码加密,构造激活识别码:

<?php
$password = md5(trim($_POST['password'])); //加密密码
$email = trim($_POST['email']); //邮箱
$regtime = time();
$token = md5($username . $password . $regtime); //创建用于激活识别码
$token_exptime = time() + 60 * 60 * 24; //过期时间为24小时后
$sql = "insert into `t_user` (`username`,`password`,`email`,`token`,`token_exptime`,`regtime`)  
values ('$username','$password','$email','$token','$token_exptime','$regtime')";
mysql_query($sql);
?>

上述代码中,$token即构造好的激活识别码,它是由用户名、密码和当前时间组成并md5加密得来的。$token_exptime用于设置激活链接URL的过期时间,用户在这个时间段内可以激活帐号,本例设置的是24小时内激活有效。最后将这些字段插入到数据表t_user中。

当数据插入成功后,调用邮件发送类将激活信息发送给用户注册的邮箱,注意将构造好的激活识别码组成一个完整的URL作为用户点击时的激活链接,以下是详细代码:

<?php
if (mysql_insert_id()) {
    $smtpserver = ""; //SMTP服务器,如:smtp.163.com
    $smtpserverport = 25; //SMTP服务器端口,一般为25
    $smtpusermail = ""; //SMTP服务器的用户邮箱,如xxx@163.com
    $smtpuser = ""; //SMTP服务器的用户帐号xxx@163.com
    $smtppass = ""; //SMTP服务器的用户密码
    $smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); //实例化邮件类
    $emailtype = "HTML"; //信件类型,文本:text;网页:HTML
    $smtpemailto = $email; //接收邮件方,本例为注册用户的Email
    $smtpemailfrom = $smtpusermail; //发送邮件方,如xxx@163.com
    $emailsubject = "用户帐号激活"; //邮件标题
    //邮件主体内容
    $emailbody = "亲爱的" . $username . ":<br/>感谢您在我站注册了新帐号。<br/>请点击链接激活您的帐号。<br/> 
    <a href='/demo/register/active.php?verify=" . $token . "' target= 
'_blank'>/demo/register/active.php?verify=" . $token . "</a><br/> 
    如果以上链接无法点击,请将它复制到你的浏览器地址栏中进入访问,该链接24小时内有效。";
    //发送邮件
    $rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype);
    if ($rs == 1) {
        $msg = '恭喜您,注册成功!<br/>请登录到您的邮箱及时激活您的帐号!';
    } else {
        $msg = $rs;
    }
}
echo $msg;
?>

还有一个相当好用且强大的邮件发送类分享个大家:使用PHPMailer发送带附件并支持HTML内容的邮件,直接可以用哦。

active.php

如果不出意外,您注册帐号时填写的Email将收到一封helloweba发送的邮件,这个时候您直接点击激活链接,交由active.php处理。

active.php接收提交的链接信息,获取参数verify的值,即激活识别码。将它与数据表中的用户信息进行查询对比,如果有相应的数据集,判断是否过期,如果在有效期内则将对应的用户表中字段status设置1,即已激活,这样就完成了激活功能。

<?php
include_once ("connect.php"); //连接数据库
$verify = stripslashes(trim($_GET['verify']));
$nowtime = time();
$query = mysql_query("select id,token_exptime from t_user where status='0' and  
`token`='$verify'");
$row = mysql_fetch_array($query);
if ($row) {
    if ($nowtime > $row['token_exptime']) { //24hour
        $msg = '您的激活有效期已过,请登录您的帐号重新发送激活邮件.';
    } else {
        mysql_query("update t_user set status=1 where id=" . $row['id']);
        if (mysql_affected_rows($link) != 1) die(0);
        $msg = '激活成功!';
    }
} else {
    $msg = 'error.';
}
echo $msg;
?>

激活成功后,发现token字段并没有用处了,您可以清空。接下来我们会讲解用户找回密码的功能,也要用到邮箱验证,敬请关注。

最后附上邮箱smtp.class.php发送类

<?php
class Smtp {
    /* Public Variables */
    var $smtp_port;
    var $time_out;
    var $host_name;
    var $log_file;
    var $relay_host;
    var $debug;
    var $auth;
    var $user;
    var $pass;
    /* Private Variables */
    var $sock;
    /* Constractor */
    function smtp($relay_host = "", $smtp_port = 25, $auth = false, $user, $pass) {
        $this->debug = false;
        $this->smtp_port = $smtp_port;
        $this->relay_host = $relay_host;
        $this->time_out = 30; //is used in fsockopen()
        $this->auth = $auth; //auth
        $this->user = $user;
        $this->pass = $pass;
        $this->host_name = "localhost"; //is used in HELO command
        $this->log_file = "";
        $this->sock = false;
    }
    /* Main Function */
    function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "") {
        $mail_from = $this->get_address($this->strip_comment($from));
        $body = ereg_replace("(^|(rn))(.)", "1.3", $body);
        $header.= "MIME-Version:1.0rn";
        if ($mailtype == "HTML") {
            $header.= "Content-Type:text/htmlrn";
        }
        $header.= "To: " . $to . "rn";
        if ($cc != "") {
            $header.= "Cc: " . $cc . "rn";
        }
        $header.= "From: $from<" . $from . ">rn";
        $header.= "Subject: " . $subject . "rn";
        $header.= $additional_headers;
        $header.= "Date: " . date("r") . "rn";
        $header.= "X-Mailer:By Redhat (PHP/" . phpversion() . ")rn";
        list($msec, $sec) = explode(" ", microtime());
        $header.= "Message-ID: <" . date("YmdHis", $sec) . "." . ($msec * 1000000) . "." . $mail_from . ">rn";
        $TO = explode(",", $this->strip_comment($to));
        if ($cc != "") {
            $TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
        }
        if ($bcc != "") {
            $TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
        }
        $sent = true;
        foreach ($TO as $rcpt_to) {
            $rcpt_to = $this->get_address($rcpt_to);
            if (!$this->smtp_sockopen($rcpt_to)) {
                $this->log_write("Error: Cannot send email to " . $rcpt_to . "n");
                $sent = false;
                continue;
            }
            if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
                $this->log_write("E-mail has been sent to <" . $rcpt_to . ">n");
            } else {
                $this->log_write("Error: Cannot send email to <" . $rcpt_to . ">n");
                $sent = false;
            }
            fclose($this->sock);
            $this->log_write("Disconnected from remote hostn");
        }
        return $sent;
    }
    /* Private Functions */
    function smtp_send($helo, $from, $to, $header, $body = "") {
        if (!$this->smtp_putcmd("HELO", $helo)) {
            return $this->smtp_error("sending HELO command");
        }
        // auth
        if ($this->auth) {
            if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {
                return $this->smtp_error("sending HELO command");
            }
            if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
                return $this->smtp_error("sending HELO command");
            }
        }
        if (!$this->smtp_putcmd("MAIL", "FROM:<" . $from . ">")) {
            return $this->smtp_error("sending MAIL FROM command");
        }
        if (!$this->smtp_putcmd("RCPT", "TO:<" . $to . ">")) {
            return $this->smtp_error("sending RCPT TO command");
        }
        if (!$this->smtp_putcmd("DATA")) {
            return $this->smtp_error("sending DATA command");
        }
        if (!$this->smtp_message($header, $body)) {
            return $this->smtp_error("sending message");
        }
        if (!$this->smtp_eom()) {
            return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
        }
        if (!$this->smtp_putcmd("QUIT")) {
            return $this->smtp_error("sending QUIT command");
        }
        return true;
    }
    function smtp_sockopen($address) {
        if ($this->relay_host == "") {
            return $this->smtp_sockopen_mx($address);
        } else {
            return $this->smtp_sockopen_relay();
        }
    }
    function smtp_sockopen_relay() {
        $this->log_write("Trying to " . $this->relay_host . ":" . $this->smtp_port . "n");
        $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
        if (!($this->sock && $this->smtp_ok())) {
            $this->log_write("Error: Cannot connenct to relay host " . $this->relay_host . "n");
            $this->log_write("Error: " . $errstr . " (" . $errno . ")n");
            return false;
        }
        $this->log_write("Connected to relay host " . $this->relay_host . "n");
        return true;;
    }
    function smtp_sockopen_mx($address) {
        $domain = ereg_replace("^.+@([^@]+)$", "1", $address);
        if (!@getmxrr($domain, $MXHOSTS)) {
            $this->log_write("Error: Cannot resolve MX "" . $domain . ""n");
            return false;
        }
        foreach ($MXHOSTS as $host) {
            $this->log_write("Trying to " . $host . ":" . $this->smtp_port . "n");
            $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
            if (!($this->sock && $this->smtp_ok())) {
                $this->log_write("Warning: Cannot connect to mx host " . $host . "n");
                $this->log_write("Error: " . $errstr . " (" . $errno . ")n");
                continue;
            }
            $this->log_write("Connected to mx host " . $host . "n");
            return true;
        }
        $this->log_write("Error: Cannot connect to any mx hosts (" . implode(", ", $MXHOSTS) . ")n");
        return false;
    }
    function smtp_message($header, $body) {
        fputs($this->sock, $header . "rn" . $body);
        $this->smtp_debug("> " . str_replace("rn", "n" . "> ", $header . "n> " . $body . "n> "));
        return true;
    }
    function smtp_eom() {
        fputs($this->sock, "rn.rn");
        $this->smtp_debug(". [EOM]n");
        return $this->smtp_ok();
    }
    function smtp_ok() {
        $response = str_replace("rn", "", fgets($this->sock, 512));
        $this->smtp_debug($response . "n");
        if (!ereg("^[23]", $response)) {
            fputs($this->sock, "QUITrn");
            fgets($this->sock, 512);
            $this->log_write("Error: Remote host returned "" . $response . ""n");
            return false;
        }
        return true;
    }
    function smtp_putcmd($cmd, $arg = "") {
        if ($arg != "") {
            if ($cmd == "") $cmd = $arg;
            else $cmd = $cmd . " " . $arg;
        }
        fputs($this->sock, $cmd . "rn");
        $this->smtp_debug("> " . $cmd . "n");
        return $this->smtp_ok();
    }
    function smtp_error($string) {
        $this->log_write("Error: Error occurred while " . $string . ".n");
        return false;
    }
    function log_write($message) {
        $this->smtp_debug($message);
        if ($this->log_file == "") {
            return true;
        }
        $message = date("M d H:i:s ") . get_current_user() . "[" . getmypid() . "]: " . $message;
        if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {
            $this->smtp_debug("Warning: Cannot open log file "" . $this->log_file . ""n");
            return false;;
        }
        flock($fp, LOCK_EX);
        fputs($fp, $message);
        fclose($fp);
        return true;
    }
    function strip_comment($address) {
        $comment = "([^()]*)";
        while (ereg($comment, $address)) {
            $address = ereg_replace($comment, "", $address);
        }
        return $address;
    }
    function get_address($address) {
        $address = ereg_replace("([ trn])+", "", $address);
        $address = ereg_replace("^.*<(.+)>.*$", "1", $address);
        return $address;
    }
    function smtp_debug($message) {
        if ($this->debug) {
            echo $message . "
   ;";
        }
    }
}
?>

connect数据库连接类

<?php
$host = "localhost";
$db_user = ""; //用户名
$db_pass = ""; //密码
$db_name = "demo"; //数据库
$timezone = "Asia/Shanghai";
$link = mysql_connect($host, $db_user, $db_pass);
mysql_select_db($db_name, $link);
mysql_query("SET names UTF8");
header("Content-Type: text/html; charset=utf-8");
date_default_timezone_set($timezone); //北京时间
?>


永久链接:http://www.phprm.com/code/54605.html

转载随意!带上文章地址吧。

标签:foreach include explode select fopen 邮箱验证 数据库连接类

相关文章

发表留言