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

來源:互聯網
上載者:User

標籤:style   http   color   使用   os   io   strong   檔案   


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

PHPMailer是不符合ThinkPHP規範的外掛程式程式,所以,我們需要先將PHPMailer程式放到ThinkPHP的 Library/Vendor目錄下,我這裡是最新版的ThinkPHP 3.2,如果是是ThinkPHP 3.2之前的版本,可能就是Lib目錄了。Vendor目錄專門用於存放非標準ThinkPHP外掛程式的目錄,如下:

PHPMailer整合到ThinkPHP中的存放目錄

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

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檔案。

在方法中需要引入PHPMailer時,不是通過import關鍵字來實現的,而是通過公用方法vendor()方法來實現的。具體內容如下:

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會自動到這個檔案中尋找。



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屬性可以擷取到!


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.