解决phpmailer后的总结

这两天,在开发一个登陆注册系统,要做好一个注册系统,我想验证码肯定是必不可少的,毕竟设置这个验证码有很多的用途,其一,可以防止被人恶意注册,防止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 如何看是否开启了这两个拓展呢

<?php
if(extension_loaded('sockets')){
  echo "已开启";
}else{
  echo "未开启";
}
?>

,同理可以测试到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这个文件夹同级,里面的内容是

<?php
/*发送邮件方法
 *@param $to:接收者 $title:标题 $content:邮件内容
 *@return bool true:发送成功 false:发送失败
 */

function sendMail($to,$title,$content){

    //引入PHPMailer的核心文件 使用require_once包含避免出现PHPMailer类重复定义的警告
    require_once("phpmailer/class.phpmailer.php"); 
    require_once("phpmailer/class.smtp.php");
    //实例化PHPMailer核心类
    $mail = new PHPMailer();

    //是否启用smtp的debug进行调试 开发环境建议去掉前面的斜杠就行了  默认关闭debug调试模式
    //$mail->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 ='1234567@qq.com';

    //smtp登录的密码 使用生成的授权码
    $mail->Password = 'xlksnqrmmfbebcfe';

    //设置发件人邮箱地址 这里填入上述提到的“发件人邮箱”
    $mail->From = '1234567@qq.com';

    //邮件正文是否为html编码 注意此处是一个方法 不再是属性 true或false
    $mail->isHTML(true); 

    //设置收件人邮箱地址 该方法有两个参数 第一个参数为收件人邮箱地址 第二参数为给该地址设置的昵称 不同的邮箱系统会自动进行处理变动 这里第二个参数的意义不大
    $mail->addAddress($to,'通知');

    //添加多个收件人 则多次调用方法即可
    // $mail->addAddress('xxx@163.com','通知');

    //添加该邮件的主题
    $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里面写入一些内容,对这个类进行测试

<?php
require_once("./functions.php");
$flag = sendMail('********@163.com','通知','你收到了一封来自你自己的邮件!');
if($flag){
    echo "发送邮件成功!";
}else{
    echo "发送邮件失败!";
}
?>

,然后你就把整个文件放到你的服务器中,然后在你的电脑浏览器进行访问你的网站,然后就可以到你的邮箱去查看是否有收到邮件啦。

 

这里是列举了qq的465端口,我认为网易的465应该也是和这个差不多,换一下functions.php中$mail->Host = 'smtp.163.com';就可以了。

希望这篇文章对你们有所帮助。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页