php使用邮箱发送验证码

若是看着文字眼乏就去看看视频吧->php

如何注册腾讯企业邮箱git

https://www.bilibili.com/video/av14351397/github

如何在项目中使用算法

https://www.bilibili.com/video/av14351961/docker

下面是我本身在采坑的过程当中遇到的问题数据库

首先咱们下载PHPMailer的,下载地址:https://github.com/PHPMailer/PHPMailerapi

将文件部入到咱们的TP框架中,放到extend/org中。bash

第一步咱们应该准备发送邮箱的帐号,我这里用的是腾讯企业邮箱服务器

没有的能够直接注册一个:https://exmail.qq.comapp

将类文件PHPMailer.php第1760行的方法里的if判断中添加include_once 'SMTP.php';

if (!is_object($this->smtp)) {
include_once 'SMTP.php';
$this->smtp=new SMTP();
}

 

 在控制器里面代码

<?php
namespace app\api\controller;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use think\Controller;
use think\Loader;
class Mailsms  extends Controller
{
    //发送商,,,QQ企业邮箱地址都是smtp.exmail.qq.com
    const HOST='smtp.exmail.qq.com';
    //发件人邮箱....企业邮箱中一个成员的帐号
    const USERNAME='youname@youyuming.top';
    //发件箱受权码。。。。。。这里是成员帐号的登陆密码
    const PASSWORD='passworld';
    //发送模板
    const TEMPLATE='您的验证码是{code},请在10分钟内填写。';
    //是否debug 测试环境使用
    const DEBUG=true;
    //实例
    protected $mail;
    public function _initialize(){
        Loader::import("org.PHPMailer.src.Exception",EXTEND_PATH,".php");
    Loader::import("org.PHPMailer.src.PHPMailer",EXTEND_PATH,".php");
    Loader::import("org.PHPMailer.src.SMTP",EXTEND_PATH,".php");
       $this->mail=new PHPMailer();
    }
    /**
     * target 发送给谁 收件人的邮箱
     * subject 主题
     * code 验证码apiMailsms/index
     */
    public function sendMail($target,$subject,$code)
    {
        $content = str_replace('{code}',$code,self::TEMPLATE);
        try{
            $this->mail->SMTPDebug=self::DEBUG;
            $this->mail->isSMTP();
            $this->mail->Host=self::HOST;//服务器
            $this->mail->SMTPAuth=true;//是否开启SMTP认证
            $this->mail->Username=self::USERNAME;//发件人邮箱
            $this->mail->Password=self::PASSWORD;//发件箱受权码
           // $this->mail->SMTPSecure='tls';//启用TLS加密,' ssl '也接受
          //  $this->mail->Port='25';//端口
      //注意使用阿里域名的须要使用ssl加密,465端口,
$this->mail->SMTPSecure='ssl';//启用TLS加密,' ssl '也接受 $this->mail->Port='465';//端口 $this->mail->CharSet='UTF-8';//设置邮件内容编码 $this->mail->setFrom(self::USERNAME); //发件人 //$this->mail->addAttachment('/var/tmp/file.tar.gz');//附件 //$this->mail->addAttachment('/tmp/image.jpg', 'new.jpg');//附件重命名 $this->mail->addAddress($target);//发送给谁 $this->mail->isHTML(true); $this->mail->Subject=$subject; $this->mail->Body=$content; //$this->mail->AltBody ='This is the body in plain text for non-HTML mail clients'; if($this->mail->send()){ echo "发送成功!"; }else{ echo "发送失败!"; } }catch(Exception $e) { echo "异常抛出"; } } public function index(){ $this->sendMail('收件人的邮箱','邮箱标题',自定义数据); } }

 

 

能够看出链接超时致使邮件发送失败,初步怀疑测试环境宿主机没法访问外网,进入bash后 curl http://baidu.com可正常响应,排除此种状况,而后一样方法到部署的具体容器环境(docker)控制台 curl http://baidu.com 一样能够正常响应,判断应用环境没有问题,则判断是否腾讯邮件服务器问题,到宿主机访问:Telnet smtp.exmail.qq.com 25,访问超时。后咨询PE答复阿里云ECS为管控垃圾邮件,屏蔽了25端口号的服务,因此致使该访问超时,尝试使用ssl方式的465端口,修改代码以下以后成功发送邮件:

邮件直接进入垃圾箱缘由:1. 以触发式的过滤算法鉴别垃圾邮件 这种垃圾邮件过滤器一般安装在电子邮件客户端软件或者邮件服务器上,其过滤垃圾邮件原理是过滤软件检查邮件发送人、标题、正文内容、邮件中出现的连接和域名,甚至电话号码。当发现带明显垃圾邮件的典型特征,则给予这封邮件必定的垃圾邮件特征分数。当分数达到必定数值,邮件将被标记为垃圾邮件,直接过滤到邮件垃圾箱。 好比,邮件标题中出现¥、$符号,则能够给予2分垃圾邮件分数;邮件内容中出现“免费”、“发票”、“促销”等典型垃圾邮件词汇,给予1分;邮件中如包含已经被确认为常常发送垃圾邮件的域名,再加1分;甚至邮件内容中出现被确认与垃圾邮件相关的电话号码,也给个分数。当这些垃圾分数相加达到某一个数值时,好比达到10分,这封邮件将被标识为垃圾邮件,将会被ISP商丢进垃圾邮箱2. 以黑名单为基础 有些建立和维护邮件黑名单的组织,专门接受用户的垃圾邮件投诉,若是确认是垃圾邮件,黑名单管理者将把发送垃圾邮件的服务器和用户IP地址放入黑名单。比较知名的垃圾邮件黑名单一般都与其余ISP商共享黑名单数据库。一旦某个IP地址被列入黑名单,世界上不少ISP都将拒收来自这个IP地址的全部邮件。 有时候用户投诉,其实收到的邮件并非垃圾邮件,而是用户忘记了曾经注册过相关电子杂志。若是你的IP地址被错误的投诉而列入黑名单,Jeasin.com建议您,惟一的办法就是联系黑名单维护组织,说明状况,提出证据,要求把你的IP地址从黑名单中删除,此过程比较复杂困难。3. 邮件防火墙 不少邮件服务器运行在邮件防火墙以后,这些防火墙会共同地使用各类过滤器和黑名单,再加上自行研究的一些算法,来鉴别和剔除垃圾邮件。这些防火墙的算法更复杂,而且不与他人分享细节,对正常的邮件送达也可能有致命的影响,如部分邮件服务器要求有人工添加确认功能,针对大部分陌生地址邮件,华思邮件告诉各位咱们应将采用拒收的策略。