前几天小白让我看看怎样去实现邮件激活账号的功能,对于一些大型的论坛或网站注册一般都会这样做的啦,用来防止某些人乱注册的情况,一开始paperen我就有个思路,就是在用户注册时,生成一个随机的数列同时放入到数据库中(自己就想到用MD5),然后调用mail函数向注册的邮箱发一封邮件,里面装着一个地址(如example.php?rand=f3223d2d32d&id=12)刚才实现了下,看来paperen我的思路是可行的。下面来具体说一下是到底怎实现的吧。?

首先从基本开始吧,对于注册页面肯定就是一个form啦

<form method="post" action="reg.php">
<p>Name:<input type="text" name="name" /></p>
<p>Email:<input type="text" name="email" /></p>
<p>Password:<input type="password" name="pwd" /></p>
<p><input type="submit" name="submit" value="Reg Now" /></p>
</form>

用来装注册的数据,名字,邮箱,密码,你还可以加进验证码,paperen我这里就略掉验证码吧,因为不是重点。这个form传到reg.php页处理。与平常接收表单的数据没什么区别,不过这里我们需要扩展一个表,这个表的字段基本上与正式会员的字段差不多,但是多了两个字段,一个是用来装随机字符串(rand),一个是判断是否已经激活(member),用来装这些数据,而不是直接放入正式会员的表中,paperen我觉得这样子比较好一点,不会使正式验证的会员那个表太杂了,并且生成一个随机字符串,paperen我这里使用了MD5,不过我们可以去实现更可怕的加密函数,自制一个也行,也不会很难,就是abcd26个英文字母加上1234数字甚至加上+-*%等特殊符号,这样会增加保密性,而个人觉得用MD5应该足够了。?

$name=mysql_escape_string($name);
$pwd=md5($pwd);//别忘了给密码也加密一下
$rand=substr(md5(time()),0,16);//这个就是随机字符串
$sql="insert into member (`name`,`email`,`rand`) values ('$name','$email','$rand')";

$db=new sql();//sql为自己定义的一个用于操作数据库的一个类
$db->query($sql);
$id=$db->get_insertid();//获得刚才插入数据的id

sendmail();//给他发个邮件吧,让他激活账号

而对于邮件也可以是html形式的,大家应该有体会吧,而如果你想发送是html形式的邮件注意要在使用mail函数时加进头信息,对于mail函数大家可以参考?

http://docs.php.net/manual/en/function.mail.php?

手册的例子已经说得很详细了。?

$headers='MIME-Version: 1.0'. "rn";
$headers.='Content-type: text/html; charset=utf-8'."rn";

再来构造一个html页面吧,为了使邮件好看点吧,代码这里就不贴了,就是一个很简单的页面,里面有一个超链接,href属性为,为什么写成这样,因为这个href是动态的,而具体怎实现请看下文。?

200912311262252915?

我将这个html页面保存为后缀是tpl的,好像保存为是什么格式的都不要紧。?

再贴出sendmail这个函数的代码。

function sendmail(){
??$url="http://paperen.com/email/finish.php?id=".$GLOBALS['id']."&rand=".$GLOBALS['rand'];//这个就是那个url变量了,使用global全局变量来获取随机字符串与id号
??ob_start();//启动缓冲
??require_once("email/email.tpl");//引入刚才那个后缀叫tpl的html页面
??$message=ob_get_contents();//获得缓冲的所有内容并放在一个变量中
??ob_end_clean();//清空缓冲
??$from="paperen.com";
??$subject="Welcome to paperen's blog";
??$headers='MIME-Version: 1.0'. "rn";
??$headers.='Content-type: text/html; charset=utf-8'."rn";
??$headers.="To:,".$GLOBALS['email']."rn";
??$headers.="From:".$from."rn";
??mail($GLOBALS['email'],$subject,$message,$headers);//发送邮件
??return true;
?}

对于ob_start()与ob_get_contents()这几个函数也是经常用于生成静态页的技术中的,比较神奇的函数。相关资料大家都可以去查查php手册。?

经过ob_start()然后require后,$url变量就会放到tpl那个的超链接的href中去了,然后再所有内容放到一个叫$message的变量中,之后进行一些很基本的参数设置后直接调用mail发送邮件吧。?

然后到自己的邮箱看看吧

200912311262253888?

点击here超链接跳到finish.php页确定激活就ok了。对于finish.php的代码如下。

if(isset($id) && isset($rand)){
??$id=mysql_escape_string($id);
??$rand=mysql_escape_string($rand);
??$sql="select * from member where id='$id' and rand='$rand' and member='0'";
??$db=new sql();
??if($db->query($sql)){
???$sql="update `member` set member=1 where id='$id'";
???$db->query($sql);
???echo "finish";
??}else{
???echo "error";
??}
??unset($db);
?}

就是获取get的参数并检查,满足条件后就将表中的member字段设置为1,就是是表名完成激活了,而这里也需要将激活后的数据插入正式的会员表中,paperen这里就省略了这部分,但是这个功能还有许多地方需要完善才能更好,很明显你可以看出我写的代码很多地方不太合理,所以就得好好完善一下,将功能进行整合并封装,使这个功能能更好的与整站代码结合。