標籤: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
‘MAIL_HOST‘ =>‘郵件發送SMTP伺服器‘, |
‘MAIL_USERNAME‘ =>‘SMTP伺服器登陸使用者名稱‘, |
‘MAIL_PASSWORD‘ =>‘SMTP伺服器登陸密碼‘, |
‘MAIL_CHARSET‘ =>‘utf-8‘, |
具體的配置可以根據自己的需要添加。根據PHPMailer的規則自己定義就可以了,然後再在定義函數中使用大C(‘CONF_NAME’)方法來調用就可以了。
再接下來就需要在common檔案夾下的function.php檔案中定義郵件發送函數sendMail(),如果function.php檔案 不存在的話建立一個就可以了。而且這個function.php檔案中的方法可以在全域使用,不需要先引入function.php檔案。
在方法中需要引入PHPMailer時,不是通過import關鍵字來實現的,而是通過公用方法vendor()方法來實現的。具體內容如下:
view source
function sendMail($to, $subject, $content) { |
vendor(‘PHPMailer.class#PHPMailer‘); |
$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->FromName = ‘憨豆兒笑園‘; |
$mail->IsHTML(C(‘MAIL_ISHTML‘)); |
$mail->Subject = $subject; |
到這一步,我們已經將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屬性可以擷取到!