浅笑博客
我的世界有我的真理,正义的立场由我决定
浅笑博客
PHP实现SMTP发信及邮箱验证码实现
PHP实现SMTP发信及邮箱验证码实现

准备

smtp发信服务器及账号,如qq邮箱、163邮箱、企业邮箱等。我这里用的是腾讯企业邮,其他同理,只需更改配置即可。

下载PHPMailer, 非常小巧、简单、方便、快捷的PHP邮件工具。下载后使用其代码。

封装发信函数

mailutils.php:

<?php
//引入PHPMailer自动导入文件
require_once("PHPMailer-5.2.28/PHPMailerAutoload.php"); 
/**
 * 封装一个腾讯企业邮发信函数
 */
function sendmail($title,$content,$toemail,$toname=''){
	$mail = new PHPMailer();
	//是否启用smtp的debug进行调试
	$mail->SMTPDebug = 0;
	//使用smtp鉴权方式发送邮件
	$mail->isSMTP();
	//smtp需要鉴权
	$mail->SMTPAuth=true;
	//smtp服务器地址
	$mail->Host = 'smtp.exmail.qq.com';
	//使用ssl加密方式登录鉴权
	$mail->SMTPSecure = 'ssl';
	//端口
	$mail->Port = 465;
	//smtp的helo消息头(可有可无、内容任意)
	$mail->Helo = 'Hello';
	//发件人的主机域 可有可无 默认为localhost 内容任意,建议使用你的域名
	//$mail->Hostname = 'qianxiao.fun';
	//邮件编码
	$mail->CharSet = 'UTF-8';
	//发件人昵称
	$mail->FromName = '浅笑';
	//smtp登录的账号
	$mail->Username ='hello@qianxiao.fun';
	//smtp登录的密码(部分服务商称授权码)
	$mail->Password = '********';
	//发件人邮箱地址
	$mail->From = 'hello@qianxiao.fun';
	//邮件正文是否为html编码
	$mail->isHTML(true); 
	//设置收件人邮箱地址(p1:收件人邮箱地址;p2:给该地址设置的昵称),可多次调用添加多个收件人
	if($toname==''){
		$mail->addAddress($toemail);
	}else{
		$mail->addAddress($toemail,$toname);
	}
	$mail->Subject = $title;//邮件主题
	$mail->Body = $content;//内容
	//添加附件(p1:附件文件名;p2:在邮件附件中该附件的名称),可以多次调用上传多个附件
	//$mail->addAttachment('./pic1.jpg','mm.jpg');
	$status = $mail->send();//发送
	return $status;
}
?>

其中第一行require的文件为下载的PHPMailer解压后的文件夹中的。为方便使用将发信过程封装为函数,方便调用。其中一些配置,如smtp服务器地址、端口、账号密码等自行更改配置好即可。

邮箱验证码实现思路

1.php生成随机验证码code。

2.将code发送至用户邮箱,同时将code加密(取md5)写入SESSION。为了实现验证码有效期,同时在 SESSION 中写入一个有效期截止时间。为了解决频繁发邮件, 同时在 SESSION 中写入当前时间在下一次发送邮件时判断。

3.验证时,先验证验证码是否过期,然后取用户提交的验证码的md5,与 SESSION 对比,验证是否成功。

发送随机验证码至邮箱

sendcaptch.php:

<?php
header('Content-type:application/json; charset=utf-8');
include('mailutils.php');

session_start();
if(ispostnull('toemail')){
    retn(-2,"参数为空");
}
if($_SESSION['lastsendtime'] > time()-60){
    retn(-3,"发送验证码过于频繁");
}
$toemail = $_POST['toemail'];
$result = sendMailCaptch($toemail);
if($result){
    retn(1,"验证码邮件发送成功");
}else{
    retn(-1,"验证码邮件发送失败");
}

function sendMailCaptch($tomail){
    $captch_code = getRandomCaptch();
    $nowtime = time();
    $_SESSION['authcode'] = md5($captch_code);
    $_SESSION['expiretime'] = $nowtime + 600;
    $_SESSION['lastsendtime'] = $nowtime;
    $sendstate = sendmail('验证码邮件测试','您的验证码是:<b>'.$captch_code.'</b>,十分钟内有效。</br>'.date("Y-m-d H:i",$nowtime),$tomail);
    return $sendstate;
}
#生成4为随机验证码
function getRandomCaptch(){
    $captch='';
    for ($i=0; $i <4 ; $i++) {
        $data='abcdefghijkmnpqrstuvwxy3456789';
        $captch.= substr($data,rand(0,strlen($data)-1) ,1);
    }
    return $captch;
}
#post参数是否为空
function ispostnull($a){
    if(empty($_POST[$a]) || !isset($_POST[$a]) || $_POST[$a]=='' || $_POST[$a]==null){
        return true;
    }
    return false;
}
function retn($code,$str){
    exit(json_encode([
        "code"=>$code,
        "msg"=>$str
    ],JSON_UNESCAPED_UNICODE));
}
?>

首先通过getRandomCaptch()函数获取4位随机验证码,将验证码md5、当前时间、验证码有效截止时间写入SESSION,同时给用户(接收到的post参数toemail )发送邮件。 当前时间用于记录上次发信时间,以避免发信过于频繁。 验证码有效截止时间用于验证时判断验证码是否过期。

验证

verify.php:

<?php
header('Content-type:application/json; charset=utf-8');
if (isset($_REQUEST['authcode'])) {
	session_start();
	if($_SESSION['expiretime'] < time()){
		retn(0,"验证码已过期");
	}else if(md5(strtolower($_REQUEST['authcode']))==$_SESSION['authcode']){
		retn(1,"验证成功");
	}else{
		retn(-1,"验证码不正确");
	}
}
function retn($code,$str){
    exit(json_encode([
        "code"=>$code,
        "msg"=>$str
    ],JSON_UNESCAPED_UNICODE));
}
?>

邮箱验证码Demo

index.php:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>邮箱验证码Demo</title>
		<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
		<script src="https://www.layuicdn.com/layer/layer.js"></script>
		<script type="text/javascript">
			$(document).ready(function(){
				$("form").submit(function(event){
					event.preventDefault();
					var authcode = $('input[name="authcode"]').val();
					$.ajax({
						url: './verify.php',
						type: 'POST',
						data: {authcode:authcode},
						dataType: 'json',
						success: function (data) {
							console.log(data);
							if(data.code == 1){
								layer.msg(data.msg, {icon:6,time:2000});//icon:6 笑脸
							}else{
								layer.msg(data.msg, {icon:5,time:2000});//icon:5 难过脸
							}
						},
						error: function () {
							layer.msg('验证请求错误', {icon:2,time:2000});////icon:2 叉叉
						}
					});
				});
			});
			var countdown = 60;
			function sendmailcode(){
				var toemail = $('input[name="email"]').val();
				$.ajax({
					url: './sendcaptch.php',
					type: 'POST',
					data: {toemail:toemail,toname:''},
					dataType: 'json',
					success: function (data) {
						console.log(data);
						if(data.code == 1){
							layer.msg(data.msg, {icon:6,time:2000});//icon:6 笑脸
							settime();
						}else{
							layer.msg(data.msg, {icon:5,time:2000});//icon:5 难过脸
						}
					},
					error: function () {
						layer.msg('验证请求错误', {icon:2,time:2000});////icon:2 叉叉
					}
				});
			}
			//每隔60s可重新发送,60s倒计时
			function settime() {
				if (countdown == 0) {
					$('#tip_text').attr("disabled",false);
					$('#tip_text').text("发送邮件验证码");
					countdown = 60;
					return;
				} else {
					$('#tip_text').attr("disabled",true)
					$('#tip_text').text("重新发送(" + countdown + ")");
					countdown--;
				}
				setTimeout(function () {
					settime()
				},1000)
			}
		</script>
	</head>
	<body>
		<form>
			<p>
				<input type="text" name="email" value="" />
				<a id="tip_text" href="#" onclick="sendmailcode()">发送邮箱验证码</a>
			</p>
 
			<p>请输入邮箱验证码:
				<input type="text" name="authcode" value="" />
			</p>
 
			<p>
				<input type="submit" value="提交" style="padding: 6px 20px;">
			</p>
 
		</form>
	</body>
</html>

截图:

http://blog.qianxiao.fun/wp-content/uploads/2020/05/图片.png
http://blog.qianxiao.fun/wp-content/uploads/2020/05/QQ图片20200507222623.png

如对本文有任何疑问或建议,欢迎评论交流。

发表评论

textsms
account_circle
email

浅笑博客

PHP实现SMTP发信及邮箱验证码实现
准备 smtp发信服务器及账号,如qq邮箱、163邮箱、企业邮箱等。我这里用的是腾讯企业邮,其他同理,只需更改配置即可。 下载PHPMailer, 非常小巧、简单、方便、快捷的PHP邮件工具。…
扫描二维码继续阅读
2020-05-07