thinkphp5中使用phpmailer實現發送郵件功能


一、開啟SMTP服務(使用php發送郵件需要用到SMTP服務,這里以163郵箱的SMTP服務為例)。

1.登錄163郵箱,在首頁上找到“設置”。

 

2.選擇開啟的服務,一般都全選,POP3/SMTP/IMAP,開啟SMTP服務就得先開通客戶授權碼。

3.點擊開通客戶授權碼,選擇開啟

 

 

4.需要手機驗證碼,需要綁定手機號。

5.SMTP服務需要輸入客戶端授權密碼,這個密碼就是是你在第三方客戶端上的郵箱登錄密碼(在后面使用phpmailer發送郵件時會用到),如果在第三方客戶端上輸入之前的郵箱登錄密碼就會出錯。

6.設置完客戶端授權密碼后就成功開通了SMTP服務

 

二、首先下載phpmailer壓縮包。

phpmailer的下載地址PHPMailer。解壓之后,里面的許多文件都沒有用到,然后再thinkphp5的項目中的extend目錄下新建一個phpmailer文件夾,然后把class.phpmailer.PHP和class.smtp.php文件復制到phpmailer目錄下。

三、phpmailer的代碼實現

1、使用phpmailer時,需要用到php的openssl擴展,在php.ini中開啟。

2.首先注意,thinkphp5中的extend下的擴展類庫使用的是命名空間必須在class.phpmailer.php和class.smtp.php最開頭加上

 

[php]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. namespace phpmaier;  

如下圖:

 



3、在class.phpmailer.php中的2315行使用到了php的Exception異常類,在thinkphp框架中直接繼承,thinkphp找不到Exception所以要修改如下;

4、在使用phpmailer時,實例化PHPMailer(),需要使用命名空間。

這里有一個問題,thinkphp5的擴展類的定義是,類文件命名為:phpmailer.php而不是class.phpmailer.php。所以要把class.phpmailer.php重命名為phpmailer.php。

然后,在控制器中用use引入。

 

[php]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. use phpmailer\phpmailer;  

例如在index控制器中調用phpmailer:

 

 

[php]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <?php   
  2.     namespace app\admin\controller;  
  3.     use think\Controller;  
  4.     use phpmailer\phpmailer;  
  5.     class Index extends Controller  
  6.     {  
  7.           
  8.         //發送郵箱驗證碼  
  9.         public function email()  
  10.         {  
  11.             $toemail = 'xxx@qq.com';//定義收件人的郵箱  
  12.   
  13.             $mail = new PHPMailer();  
  14.   
  15.             $mail->isSMTP();// 使用SMTP服務  
  16.             $mail->CharSet = "utf8";// 編碼格式為utf8,不設置編碼的話,中文會出現亂碼  
  17.             $mail->Host = "smtp.163.com";// 發送方的SMTP服務器地址  
  18.             $mail->SMTPAuth = true;// 是否使用身份驗證  
  19.             $mail->Username = "xxx@163.com";</span><span style="color:#ff6666;">// 發送方的163郵箱用戶名,就是你申請163的SMTP服務使用的163郵箱</span><span style="color:#333333;">  
  20.             $mail->Password = "xxxxxx";</span><span style="color:#ff6666;">// 發送方的郵箱密碼,注意用163郵箱這里填寫的是“客戶端授權密碼”而不是郵箱的登錄密碼!</span><span style="color:#333333;">  
  21.             $mail->SMTPSecure = "ssl";</span><span style="color:#ff6666;">// 使用ssl協議方式</span><span style="color:#333333;">  
  22.             $mail->Port = 994;// 163郵箱的ssl協議方式端口號是465/994  
  23.   
  24.             $mail->setFrom("xxx@163.com","Mailer");// 設置發件人信息,如郵件格式說明中的發件人,這里會顯示為Mailer(xxxx@163.com),Mailer是當做名字顯示  
  25.             $mail->addAddress($toemail,'Wang');// 設置收件人信息,如郵件格式說明中的收件人,這里會顯示為Liang(yyyy@163.com)  
  26.             $mail->addReplyTo("xxx@163.com","Reply");// 設置回復人信息,指的是收件人收到郵件后,如果要回復,回復郵件將發送到的郵箱地址  
  27.             //$mail->addCC("xxx@163.com");// 設置郵件抄送人,可以只寫地址,上述的設置也可以只寫地址(這個人也能收到郵件)  
  28.             //$mail->addBCC("xxx@163.com");// 設置秘密抄送人(這個人也能收到郵件)  
  29.             //$mail->addAttachment("bug0.jpg");// 添加附件  
  30.   
  31.   
  32.             $mail->Subject = "這是一個測試郵件";// 郵件標題  
  33.             $mail->Body = "郵件內容是 <b>您的驗證碼是:123456</b>,哈哈哈!";// 郵件正文  
  34.             //$mail->AltBody = "This is the plain text純文本";// 這個是設置純文本方式顯示的正文內容,如果不支持Html方式,就會用到這個,基本無用  
  35.   
  36.             if(!$mail->send()){// 發送郵件  
  37.                 echo "Message could not be sent.";  
  38.                 echo "Mailer Error: ".$mail->ErrorInfo;// 輸出錯誤信息  
  39.             }else{  
  40.                 echo '發送成功';  
  41.             }  
  42.         }  
  43.     }  
  44.  ?>  


四、常見的錯誤處理

 

1、瀏覽器出現如下,說明php中沒有開啟openssl擴展(去掉php.ini中extension=php_openssl.dll前面的分號(;),記得重啟Apache服務)Windows下有時可能會開啟不了服務,可以用Windows的服務開啟:

SMTP Error: Could not connect to SMTP host. Message could not be sent.Mailer Error: SMTP Error: Could not connect to SMTP host.
2、瀏覽器中出現如下,說明phpmailer類庫中沒有沒有寫命名空間(namespace phpmailer;)

3、瀏覽器中出現如下,說明class.smtp.php類庫中沒有沒有寫命名空間(namespace phpmailer;)


4、瀏覽器中出現如下,說明在控制器中沒有用use(use phpmailer\phpmailer;)引入:

5、瀏覽器中出現如下,說明thinkphp框架找不到Exception異常類:在Exception前面加上反斜杠"\"(參考上文)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM