从上图可以看出,浏览器通过访问web站点中的邮件发送程序来提交邮件发送请求。
邮件发送程序将把邮件发送给自己网站的SMTP服务器,该SMTP服务器收到邮件后,将根据收件人的地址在将邮件的目的地,要么是投递到本地域管理的收件人邮箱中,要么是转交给管理收件人地址域的其他SMTP服务器
当你的密码忘记时,网站给你注册时填写的邮箱发送验证码,你填写正确进入重置密码页面;网站是如何发送邮件的呢?
1,下载两个php的邮件类(就是别人写好的发送邮件的函数),把这两个包下载到你的网站中,进行调用函数;这两个类分别是:class.phpmailer.php和class.stmp.php;建议不要在官网上下载,因为官网上的phpmailer包我下载后使用报错:/e这个规则已经被新版本的php抛弃,需要用其他函数来代替它,如果不是专业学习php,要调老半天代码;
2,有了这两个函数我们还需要自己写一个调用他们俩的函数,你的很多信息也是在这里进行配置的:比如发送方的邮件,接收方的邮件,发送邮件的内容等;而步骤一中的两个类是不需要在里面配置参数的,他们是类,仅仅是用来被调用的;下面上代码(建议各位下载一套代码,不要三个主要代码东下西下,有些函数名会不匹配,出现未定义函数名);
<?php
$link=mysqli_connect("166.62.28.132","ZWJroot","654321","web003");
$username =$_POST['username'];
$email=$_POST['email'];
$sql ="select * from t_user where username='$username'";
$res = mysqli_query($link, $sql);
$row=mysqli_fetch_assoc($res);
if(mysqli_num_rows($res)>0&&$row['email']==$email){ //若填入的邮箱和数据库中邮箱相同
//引入邮件发送类
require 'class.phpmailer.php';
require 'class.smtp.php';
$mail = new PHPMailer;
//$mail->SMTPDebug = 3; // Enable verbose debug output
$mail->isSMTP(); // 使用SMTP服务
$mail->Host = 'sg2pl043.prd.sn2.secureseer.net'; // 发送方的SMTP服务器地址
$mail->SMTPAuth = true; //是否使用身份验证
$mail->Username = 'email@givemoc.com'; // 发送方的邮箱账户
$mail->Password = 'mypassword'; // 如果是qq就是客户端授权密码,如果是服务器就是mail邮箱的登录密码
$mail->SMTPSecure = 'ssl'; // 使用ssl协议方式
$mail->Port = 465; // 端口号
$mail->setFrom('email@givemoc.com', "小可爱");//设置发件人信息,或者下一个;
//$mail->AddCC('2424275819@qq.com', "小可爱");//设置发件人信息,有时候下载的phpmailer不一样,里面函数名不同
$mail->addAddress($email, '.'); // 设置收件人信息
$mail->addReplyTo($email, 'php');//设置回复人信息,即收件人收到邮件后,如果要回复,回复邮件将发送到的邮箱地址
$code=rand(100000,999999);//生成随机验证码
$mail->isHTML(true); // 邮件内容是html吗
$mail->Subject = '找回密码'; //邮件标题
$mail->Body = "这里是www.givemmoc.com网站;<b>您的验证码是:</b>".$code; //邮件内容;
if(!$mail->Send()) { //邮件发送结果
//输出错误信息
echo 'Mailer Error: ' . $mail->ErrorInfo; //发送失败的原因;
return false;
} else { //如若发送成功,将产生的随机验证码保存到数据库,到时候做对比;
$sql2="update t_user set token='$code' where username='$username'";
mysqli_query($link,$sql2);
echo '<script>alert("Message has been sent");window.history.back();</script>'; //成功输出
}
}
else {
echo '<script>alert("账号和邮箱不匹配");window.history.back();</script>';
}
?>
3,以上红色字体是必须配置的信息,如果用qq发送邮件:登录qq邮箱,点击设置,账户,往下拖找到pop3开启,生成授权码;
只要将授权码输入就行,还有你的邮箱改一下,qq邮件服务器地址是:
如果用服务器发送邮件:这里用的是狗爹的配置信息:
4,下面是两个类的源码地址:
class.phpmailer.php:https://github.com/featherzwj/class.phpmailer.php/blob/master/class.phpmailer.php
class.smtp.php:https://github.com/featherzwj/class.smtp.php/blob/master/class.smtp.php
5,下面是简陋的发送邮箱的html界面:
账户名:<input name="username" type="text">
邮箱地址:<input name="email" type="text">
6,结束。
---------------------------------------------分割线--------------------------------------------------------------------------------------------------------------
下面是我摸索的时候一些问题:
2,Fatal error: Cannot declare class PHPMailer because the name is already in use命名空间冲突,两个php的命名空间相同;
3,Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead;
/e表示,可以使得 正则替换的时候 替换规则能够适应php 代码;
提醒的意思是用preg_replace_callback 替换 /e;
4,The following From address failed: root@localhost Mailer Error: The following From address failed: root@localhost
SMTP server error: mail from address must be same as authorization user
邮箱账号和你的授权码不一致,需要到qq邮箱在次生成新的授权码填入:
有两种发送函数,一个是setFrom,一个是Addcc(),你写的发送邮箱函数要和不同版本的class.phpmailer.php相互匹配,不要从一个地方拷贝发送邮箱代码,又从另一个地方拷贝phpmailer类,很容易报错:调用的函数未定义;