一、開啟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最開頭加上
- 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引入。
- use phpmailer\phpmailer;
例如在index控制器中調用phpmailer:
- <?php
- namespace app\admin\controller;
- use think\Controller;
- use phpmailer\phpmailer;
- class Index extends Controller
- {
- //發送郵箱驗證碼
- public function email()
- {
- $toemail = 'xxx@qq.com';//定義收件人的郵箱
- $mail = new PHPMailer();
- $mail->isSMTP();// 使用SMTP服務
- $mail->CharSet = "utf8";// 編碼格式為utf8,不設置編碼的話,中文會出現亂碼
- $mail->Host = "smtp.163.com";// 發送方的SMTP服務器地址
- $mail->SMTPAuth = true;// 是否使用身份驗證
- $mail->Username = "xxx@163.com";</span><span style="color:#ff6666;">// 發送方的163郵箱用戶名,就是你申請163的SMTP服務使用的163郵箱</span><span style="color:#333333;">
- $mail->Password = "xxxxxx";</span><span style="color:#ff6666;">// 發送方的郵箱密碼,注意用163郵箱這里填寫的是“客戶端授權密碼”而不是郵箱的登錄密碼!</span><span style="color:#333333;">
- $mail->SMTPSecure = "ssl";</span><span style="color:#ff6666;">// 使用ssl協議方式</span><span style="color:#333333;">
- $mail->Port = 994;// 163郵箱的ssl協議方式端口號是465/994
- $mail->setFrom("xxx@163.com","Mailer");// 設置發件人信息,如郵件格式說明中的發件人,這里會顯示為Mailer(xxxx@163.com),Mailer是當做名字顯示
- $mail->addAddress($toemail,'Wang');// 設置收件人信息,如郵件格式說明中的收件人,這里會顯示為Liang(yyyy@163.com)
- $mail->addReplyTo("xxx@163.com","Reply");// 設置回復人信息,指的是收件人收到郵件后,如果要回復,回復郵件將發送到的郵箱地址
- //$mail->addCC("xxx@163.com");// 設置郵件抄送人,可以只寫地址,上述的設置也可以只寫地址(這個人也能收到郵件)
- //$mail->addBCC("xxx@163.com");// 設置秘密抄送人(這個人也能收到郵件)
- //$mail->addAttachment("bug0.jpg");// 添加附件
- $mail->Subject = "這是一個測試郵件";// 郵件標題
- $mail->Body = "郵件內容是 <b>您的驗證碼是:123456</b>,哈哈哈!";// 郵件正文
- //$mail->AltBody = "This is the plain text純文本";// 這個是設置純文本方式顯示的正文內容,如果不支持Html方式,就會用到這個,基本無用
- if(!$mail->send()){// 發送郵件
- echo "Message could not be sent.";
- echo "Mailer Error: ".$mail->ErrorInfo;// 輸出錯誤信息
- }else{
- echo '發送成功';
- }
- }
- }
- ?>
四、常見的錯誤處理
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前面加上反斜杠"\"(參考上文)