这两天,在开发一个登陆注册系统,要做好一个注册系统,我想验证码肯定是必不可少的,毕竟设置这个验证码有很多的用途,其一,可以防止被人恶意注册,防止sql注入;其二,可以用来验证对方的手机或者邮箱是真实的信息。
由于我没有那么多的经济能力,所以没办法使用手机短信验证,因此我只能通过邮箱来验证信息。那么问题来了,怎么使用邮箱验证呢?
我去找了很多,一开始,我是直接用了mail()这个函数,然后肯定是不行的了,提示错误
,相信就算不是这个确切的错误也是会有诸如此类的错误,所以这个函数用起来还是比较困难的。于是,我又去找别的办法,然后找到了大家常说的phpmailer这个封装类。
还有个问题要提前讲一下,就是如果你使用的是阿里云的服务器,如果是在2016年九月份之后购买的话,那么默认的已经封掉了25端口,也就是我们无法使用到25端口,而网上的很多的phpmailer的封装类的话,都是针对25端口写的文件,可能也可以拓展,不过我还不会,所以就只能直接点找一些现成的,也给那些和我同样在解决这个问题搞到焦头烂额的同学们予与帮助。顺便带巨,刚用到phpmailer的时候,很多都是这两个错误。①SMTP Error: Could not authenticate.②SMTP Error: Could not connect to SMTP host.,然后这个的话,如果不是25端口被服务器提供商屏蔽掉了的话,通常有两个解决方案①就是在class.smtp.php中修改,
在@fsockopen前面加个‘p’,变成@pfsockopen,这个是fsockopen函数被屏蔽掉的一种处理办法,②也有可能fsockopen和pfsockopen两个函数都屏蔽掉了的话,就要在class.smtp.php中,
$this->smtp_conn = stream_socket_client("tcp://".$host.":".$port, $errno, $errstr, $tval);
用这个替代
$this->smtp_conn = @fsockopen($host, // the host of the server
$port, // the port to use
$errno, // error number if any
$errstr, // error message if any
$tval); // give up after ? secs
这里还有个重点就是,不要相信那些网上说在class.phpmailer.php中修改
public function IsSMTP() {
$this->Mailer = 'smtp';
}
把'smtp'改成'SMTP',这个是不行的,反而直接让程序挂了,这一点深有体会。
所以,如果你们也用的是阿里云服务器,用25端口无论如何都无法连接主机的时候,你们可以试一下我的方法,我觉得可以成功,你也能少走弯路。
要用到这个类,要先做几件事情。
第一,先去确定你的服务器的是否开启了两个相关的函数拓展。①socket ②openssl 如何看是否开启了这两个拓展呢
,同理可以测试到openssl是否开启,如果两个都已经开启,则不用去修改php.ini,如果还没开启,则要手动开启,到php.ini中,搜索
extension=php_sockets.dll或者是extension=php_openssl.dll,然后把它们前面的';’去掉,然后重启Apache。到此,第一步已经完成。
第二,我们要去开启我们QQ的smtp的服务,打开你的QQ邮箱,点击设置,点击账户,滚动进度条,拉到下面,如果还没开启的话,就会有“开启”两个字,点击开启之后,就会有一个授权码,记得要把这两项都要开启,两项都开启就有两个授权码(建议等下输入的时候用第二个授权码,这个是我测试的时候可以的,不过我认为这两个授权码的作用是一样的,也就是第一个应该也是可以用的)。到此,就完成了第二步。
第二,我们要去开启我们QQ的smtp的服务,打开你的QQ邮箱,点击设置,点击账户,滚动进度条,拉到下面,如果还没开启的话,就会有“开启”两个字,点击开启之后,就会有一个授权码,记得要把这两项都要开启,两项都开启就有两个授权码(建议等下输入的时候用第二个授权码,这个是我测试的时候可以的,不过我认为这两个授权码的作用是一样的,也就是第一个应该也是可以用的)。到此,就完成了第二步。
第三步,下载这个类,并进行配置。找这个类也不好找,网上流传这很多版本,所以我等下讲的方法是针对我这个版本的方法,所以在这里我先给大家链接先https://github.com/PHPMailer/PHPMailer/tree/5.2-stable(记得,是5.2的版本,这个创作者好像一直更新着他的版本,你们要在5.2的版本里面才能找到这几个文件)在里面找到src,找到class.phpmailer.php、class.phpmaileroauth.php、class.pop3.php、class.smtp.php、PHPMailerAutoload.php 这四个文件,并把它们下载下来,新建一个phpmailer文件夹,把下载好的文件放到文件夹中,然后我新建一个functions.php文件,让它与phpmailer这个文件夹同级,里面的内容是
SMTPDebug = 1;
//使用smtp鉴权方式发送邮件
$mail->isSMTP();
//smtp需要鉴权 这个必须是true
$mail->SMTPAuth=true;
//链接qq域名邮箱的服务器地址
$mail->Host = 'smtp.qq.com';
//设置使用ssl加密方式登录鉴权
$mail->SMTPSecure = 'ssl';
//设置ssl连接smtp服务器的远程服务器端口号,以前的默认是25,但是现在新的好像已经不可用了 可选465或587
$mail->Port = 465;
//设置smtp的helo消息头 这个可有可无 内容任意
// $mail->Helo = 'Hello smtp.qq.com Server';
//设置发件人的主机域 可有可无 默认为localhost 内容任意,建议使用你的域名
$mail->Hostname = 'http://www.zhangyingfeng.cn';
//设置发送的邮件的编码 可选GB2312 我喜欢utf-8 据说utf8在某些客户端收信下会乱码
$mail->CharSet = 'UTF-8';
//设置发件人姓名(昵称) 任意内容,显示在收件人邮件的发件人邮箱地址前的发件人姓名
$mail->FromName = 'dian_feng';
//smtp登录的账号 这里填入字符串格式的qq号即可
$mail->Username ='[email protected]';
//smtp登录的密码 使用生成的授权码
$mail->Password = 'xlksnqrmmfbebcfe';
//设置发件人邮箱地址 这里填入上述提到的“发件人邮箱”
$mail->From = '[email protected]';
//邮件正文是否为html编码 注意此处是一个方法 不再是属性 true或false
$mail->isHTML(true);
//设置收件人邮箱地址 该方法有两个参数 第一个参数为收件人邮箱地址 第二参数为给该地址设置的昵称 不同的邮箱系统会自动进行处理变动 这里第二个参数的意义不大
$mail->addAddress($to,'通知');
//添加多个收件人 则多次调用方法即可
// $mail->addAddress('[email protected]','通知');
//添加该邮件的主题
$mail->Subject = $title;
//添加邮件正文 上方将isHTML设置成了true,则可以是完整的html字符串 如:使用file_get_contents函数读取本地的html文件
$mail->Body = $content;
//为该邮件添加附件 该方法也有两个参数 第一个参数为附件存放的目录(相对目录、或绝对目录均可) 第二参数为在邮件附件中该附件的名称
// $mail->addAttachment('./d.jpg','mm.jpg');
//同样该方法可以多次调用 上传多个附件
// $mail->addAttachment('./Jlib-1.1.0.js','Jlib.js');
$status = $mail->send();
//简单的判断与提示信息
if($status) {
return true;
}else{
return false;
}
}
然后,我们再新建一个文件index.php,让这个文件和functions.php和phpmaile文件夹同级,也就是这个样子,然后我们在index里面写入一些内容,对这个类进行测试
,然后你就把整个文件放到你的服务器中,然后在你的电脑浏览器进行访问你的网站,然后就可以到你的邮箱去查看是否有收到邮件啦。
这里是列举了qq的465端口,我认为网易的465应该也是和这个差不多,换一下functions.php中$mail->Host = 'smtp.163.com';就可以了。
希望这篇文章对你们有所帮助。