說明
原文發(fā)表在我的個人網(wǎng)站:利用 Composer 完善自己的 PHP 框架(二)——發(fā)送郵件
本教程示例代碼見 https://github.com/johnlui/My-First-Framework-based-on-Composer
回顧上一篇文章中,我們手工建造了一個簡易的視圖加載器,順便引入了錯誤處理包,讓我們的 MFFC 框架在 M、V、C 三個方面都達(dá)到了“好用”的水平。View 是一個可插拔組件,在本篇文章中我們要創(chuàng)建另一個可插拔組件——郵件發(fā)送模塊。
正文我們采用 nette/mail 包作為我們的郵件發(fā)送基礎(chǔ)模塊,在它的基礎(chǔ)上封裝一個 Mail 類,暴露出簡潔的 API 給控制器使用,下面我們正式開始。
引入 nette/mail 包,修改 composer.json:
"require": { "codingbean/macaw": "dev-master", "illuminate/database": "*", "filp/whoops": "*", "nette/mail": "*" },
運(yùn)行 composer update,等待安裝完成。nette/mail 的文檔位于:http://doc.nette.org/en/2.2/mailing 讓我們閱讀它,然后設(shè)計 Mail 類:
新建 services/Mail.php 文件,內(nèi)容如下:
config = require BASE_PATH."/config/mail.php"; $this->setFrom($this->config["username"]); if ( is_array($to) ) { foreach ($to as $email) { $this->addTo($email); } } else { $this->addTo($to); } } public function from($from=null) { if ( !$from ) { throw new InvalidArgumentException("郵件發(fā)送地址不能為空!"); } $this->setFrom($from); return $this; } public static function to($to=null) { if ( !$to ) { throw new InvalidArgumentException("郵件接收地址不能為空!"); } return new Mail($to); } public function title($title=null) { if ( !$title ) { throw new InvalidArgumentException("郵件標(biāo)題不能為空!"); } $this->setSubject($title); return $this; } public function content($content=null) { if ( !$content ) { throw new InvalidArgumentException("郵件內(nèi)容不能為空!"); } $this->setHTMLBody($content); return $this; } }
Mail 類和 View 類工作的方式基本一致:
$this->mail = Mail::to(["ooxx@gmail.com", "ooxx@qq.com"]) ->from("MotherFucker") ->title("Fuck Me!") ->content(" Hello~~
");
上面這段代碼位于 HomeController 中, View::make() 那行代碼的下面。
新建 MFFC/config/mail.php,請自行替換郵件地址和密碼:
"smtp.163.com", "username" => "ooxx@163.com", "password" => "password", "secure" => "" ];
Mail 和 View 一樣也在 BaseController 的析構(gòu)函數(shù) __destruct() 函數(shù)中處理,現(xiàn)在這個 function 長這樣:
public function __destruct() { $view = $this->view; if ( $view instanceof View ) { extract($view->data); require $view->view; } $mail = $this->mail; if ( $mail instanceof Mail ) { $mailer = new NetteMailSmtpMailer($mail->config); $mailer->send($mail); } }
OK,準(zhǔn)備的差不多了,運(yùn)行 composer dump-autoload 把 Mail 類加入自動加載,刷新頁面!
如果你看到以上頁面,恭喜你!郵件發(fā)送成功了!
趕快去檢查一下收件箱有木有郵件!:-D 這次頁面加載可能會稍慢,因為郵件是同步發(fā)送的。異步的隊列系統(tǒng)我們會在以后講到。
分析郵件發(fā)送的整體流程想必大家已經(jīng)輕車熟路了,現(xiàn)在主要敘述一下 Mail 類的設(shè)計過程:
郵件發(fā)送的核心參數(shù)是 目標(biāo)地址,即郵件要發(fā)送到的 E-mail 地址,所以我們設(shè)計 Mail::to("oo@xx.me") 作為發(fā)送的 觸發(fā) API。
目前我們采用最簡單的 SMTP 方式發(fā)送郵件,文檔在 這里。配置文件放置在 MFFC/config/mail.php 中,依舊返回一個數(shù)組。
Mail 類繼承了 NetteMailMessage 類。Mail::to() 的時候創(chuàng)建一個 Mail 類的實例(對象)并返回,這時候其實 BaseController 中的析構(gòu)函數(shù)中的代碼已經(jīng)會被觸發(fā)并處理這個對象了。默認(rèn)的發(fā)送人是從配置文件中讀取的 username。
Mail::to() 支持 字符串 或者數(shù)組作為參數(shù),可以一次發(fā)送一封或多封郵件。
from()、title() 和 content() 方法用于豐富郵件內(nèi)容。content() 方法可以直接傳遞 HTML 代碼。
from() 配置不一定都能夠成功,部分郵件服務(wù)商不支持修改發(fā)送人地址。
這個變量全部組裝完成后,被賦值給控制器的 $mail 成員變量,然后被析構(gòu)函數(shù)處理,郵件被發(fā)送,成功后頁面代碼被發(fā)送回客戶端,流程結(jié)束。
預(yù)告下一步:利用 Composer 完善自己的 PHP 框架(三)——Redis 緩存(待更新)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/20851.html
摘要:我們先從目前用著最不爽的地方視圖裝載下手。實現(xiàn)裝載器完成基礎(chǔ)準(zhǔn)備以后我們正式開始制造視圖裝載器。下一步利用完善自己的框架二發(fā)送郵件 原文發(fā)表在我的個人網(wǎng)站:利用 Composer 完善自己的 PHP 框架(一)——視圖裝載 本教程示例代碼見 https://github.com/johnlui/My-First-Framework-based-on-Composer 回顧 經(jīng)...
摘要:原文發(fā)表在我的個人網(wǎng)站利用完善自己的框架三緩存本教程示例代碼見回顧上兩篇文章中我們完成了視圖加載類和郵件發(fā)送類的設(shè)計,完成了兩個可插拔組件。相比使用文件作為緩存,擁有更高的性能更好地可維護(hù)性和更強(qiáng)大的操作。 原文發(fā)表在我的個人網(wǎng)站:利用 Composer 完善自己的 PHP 框架(三)——Redis 緩存 本教程示例代碼見 https://github.com/johnlui/My...
摘要:原文發(fā)表在我的個人網(wǎng)站利用完善自己的框架三緩存本教程示例代碼見回顧上兩篇文章中我們完成了視圖加載類和郵件發(fā)送類的設(shè)計,完成了兩個可插拔組件。相比使用文件作為緩存,擁有更高的性能更好地可維護(hù)性和更強(qiáng)大的操作。 原文發(fā)表在我的個人網(wǎng)站:利用 Composer 完善自己的 PHP 框架(三)——Redis 緩存 本教程示例代碼見 https://github.com/johnlui/My...
摘要:消費(fèi)者開發(fā)本例我們使用的多進(jìn)程開發(fā)工具來完成這個需求,通常使用常駐進(jìn)程來處理隊列的消費(fèi),所以我們使用的類型,模式。中進(jìn)程負(fù)責(zé)執(zhí)行郵件發(fā)送任務(wù)。此時終端將打印成功收到測試郵件官網(wǎng) 注意:這個是 MixPHP V1 的范例 郵件發(fā)送是很常見的需求,由于發(fā)送郵件的操作一般是比較耗時的,所以我們一般采用異步處理來提升用戶體驗,而異步通常我們使用消息隊列來實現(xiàn)。 傳統(tǒng) MVC 框架由于缺少多進(jìn)程...
閱讀 3237·2021-11-24 09:39
閱讀 3166·2021-10-21 09:38
閱讀 2404·2019-08-29 15:28
閱讀 3743·2019-08-26 12:23
閱讀 2622·2019-08-26 12:19
閱讀 1366·2019-08-23 12:44
閱讀 2133·2019-08-23 12:02
閱讀 1006·2019-08-22 17:05