將PHPMailer整合到ThinkPHP 3.2 中實現SMTP發送郵件

將PHPMailer整合到ThinkPHP 3.2 中實現SMTP發送郵件

ThinkPHP沒有郵件發送的功能,因而,我就想了想,就將PHPMailer整合到ThinkPHP中吧。php

PHPMailer是不符合ThinkPHP規範的插件程序,因此,咱們須要先將PHPMailer程序放到ThinkPHP的 Library/Vendor目錄下,我這裏是最新版的ThinkPHP 3.2,若是是是ThinkPHP 3.2以前的版本,可能就是Lib目錄了。Vendor目錄專門用於存放非標準ThinkPHP插件的目錄,以下:thinkphp

PHPMailer整合到ThinkPHP中的存放目錄

PHPMailer整合到ThinkPHP中的存放目錄數組

接下來爲了方便發送郵件,咱們能夠定義一個專門發送郵件的函數sendMail(),這個函數能夠只接受郵件發送的最基本的參數,發送到哪一個郵 箱$id,郵件的主題$subject,郵件的內容$content。不過爲了方便咱們修改SMTP郵件發送服務器,咱們先在config.php文件中 定義好郵件發送服務器,內容以下:xcode

config.php服務器

<?php
return array(   
    // 配置郵件發送服務器
    'MAIL_SMTP'                     =>TRUE,
    'MAIL_HOST'                     =>'郵件發送SMTP服務器',
    'MAIL_SMTPAUTH'                 =>TRUE,
    'MAIL_USERNAME'                 =>'SMTP服務器登錄用戶名',
    'MAIL_PASSWORD'                 =>'SMTP服務器登錄密碼',
    'MAIL_SECURE'                   =>'tls',
    'MAIL_CHARSET'                  =>'utf-8',
    'MAIL_ISHTML'                   =>TRUE,
);
?>

具體的配置能夠根據本身的須要添加。根據PHPMailer的規則本身定義就能夠了,而後再在定義函數中使用大C(‘CONF_NAME’)方法來調用就能夠了。函數

再接下來就須要在common文件夾下的function.php文件中定義郵件發送函數sendMail(),若是function.php文件 不存在的話新建一個就能夠了。並且這個function.php文件中的方法能夠在全局使用,不須要先引入function.php文件。url

在方法中須要引入PHPMailer時,不是經過import關鍵字來實現的,而是經過公共方法vendor()方法來實現的。具體內容以下:spa

view source插件

<?php
/**
 * 郵件發送函數
 */
function sendMail($to, $subject, $content) {
    vendor('PHPMailer.class#PHPMailer');
    $mail = new PHPMailer();
    // 裝配郵件服務器
    if (C('MAIL_SMTP')) {
        $mail->IsSMTP();
    }
    $mail->Host = C('MAIL_HOST');
    $mail->SMTPAuth = C('MAIL_SMTPAUTH');
    $mail->Username = C('MAIL_USERNAME');
    $mail->Password = C('MAIL_PASSWORD');
    $mail->SMTPSecure = C('MAIL_SECURE');
    $mail->CharSet = C('MAIL_CHARSET');
    // 裝配郵件頭信息
    $mail->From = C('MAIL_USERNAME');
    $mail->AddAddress($to);
    $mail->FromName = '憨豆兒笑園';
    $mail->IsHTML(C('MAIL_ISHTML'));
    // 裝配郵件正文信息
    $mail->Subject = $subject;
    $mail->Body = $content;
    // 發送郵件
    if (!$mail->Send()) {
        return FALSE;
    } else {
        return TRUE;
    }
}
?>

到這一步,咱們已經將PHPMailer整合到了ThinkPHP中了,如今能夠在程序中任何地方使用sendMail()方法就好了,不須要引入function.php文件,由於ThinkPHP會自動到這個文件中尋找。code



ThinkPHP 3.2中vendor()方法的深刻研究及PHPMailer的正確擴展


當咱們想在ThinkPHP中引入第三方擴展,而第三方擴展又沒有按照ThinkPHP的規範在編寫的時候時,就須要將第三方擴展放置到Library/Vendor目錄下,固然,這是針對ThinkPHP 3.2而言,低版本則根據狀況來看了。

而後須要在Controller或function中使用第三方擴展時,就能夠直接使用vendor()方法來進行引用了。

不過當我將PHPMailer放在Vendor目錄下後(具體能夠參考前面的一篇博客:http://www.xcoder.cn/index.php/archives/889),在本機運行得好好得,最近將程序上傳到服務器上時,直接提示

Class ‘PHPMailer’ not found

而後又在本機運行,仍是正確!經過前面這片博客能夠知道,我是經過

vendor('PHPMailer.class#PHPMailer');

這行代碼將PHPMailer引入的。既然提示找不到PHPMailer類,說明沒有被正確引入。這是爲何呢?就粗略看了一下vendor()方 法的源碼,這才發現其實vendor()方法也就是對import()方法進行了一次參數組裝,而後仍是交給了import()方法處理。

查看import()方法的源碼又發現,在import()方法中,對於上面傳入參數的解析其實就是將’.’替換成’/’,將’#’替換成 了’.’,baseurl則由vendor()方法自動補充上了,指向Vendor目錄。因此上面vendor()方法中的參數最終仍是被解析成了以下目 錄:

Library/Vendor/PHPMailer/class.PHPMailer.php

而PHPMailer的入口文件的實際目錄地址爲:

Library/Vendor/phpmailer/class.phpmailer.php

內容都同樣的嘛!不過我用的是Linux的服務器,因此對大小寫是嚴格區分的,這樣固然不能成功導入這個類。而解決辦法就是將vendor()引入改成:

vendor(‘phpmailer.class#phpmailer’)

另外對於PHPMailer使用時還要注意一點,PHPMailer若是使用SMTP方式發送郵件,須要PHP對fsockopen的支持,因此咱們須要修改php.ini中disable_functions中將fscokopen刪除,不然會出現運行錯誤:

fsockopen() has been disabled

經過PHPMailer的ErrorInfo屬性能夠獲取到!

相關文章
相關標籤/搜索