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. 郵件防火牆 不少郵件服務器運行在郵件防火牆以後,這些防火牆會共同地使用各類過濾器和黑名單,再加上自行研究的一些算法,來鑑別和剔除垃圾郵件。這些防火牆的算法更復雜,而且不與他人分享細節,對正常的郵件送達也可能有致命的影響,如部分郵件服務器要求有人工添加確認功能,針對大部分陌生地址郵件,華思郵件告訴各位咱們應將採用拒收的策略。

相關文章
相關標籤/搜索