咱們採用 'nette/mail' 包做爲咱們的郵件發送基礎模塊,在它的基礎上封裝一個 'Mail' 類,暴露出簡潔的 API 給控制器使用,下面咱們正式開始。php
引入 'nette/mail' 包,修改 'composer.json':git
"require": { "codingbean/macaw": "dev-master", "illuminate/database": "*", "filp/whoops": "*", "nette/mail": "*" }
運行 'composer update',等待安裝完成。'nette/mail' 的文檔位於:http://doc.nette.org/en/2.2/mailing 讓咱們閱讀它,而後設計 Mail 類:github
新建 'services/Mail.php' 文件,內容以下:json
<?php use Nette\Mail\Message; date_default_timezone_set('PRC'); /** * Mail */ class Mail { public $config; // [String] e-mail protected $from; // [Array] e-mail list protected $to; protected $title; protected $body; protected $mail; /** * Mail constructor. * @param $to */ function __construct($values) { $this->mail = new Message; $this->config = require_once BASE_PATH . '/config/mail.php'; $this->mail->setFrom($this->config['username']); if ( !is_array($values) ) { $values = [$values]; } foreach ($values as $email) { $this->mail->addTo($email); } } /** * 發件人 * @param null $from * @return $this */ public function from($from=null) { if ( !$from ) { throw new InvalidArgumentException("郵件發送地址不能爲空!"); } $this->mail->setFrom($from); return $this; } /** * 收件人 * @param null $to * @return Mail */ public static function to($values=null) { if ( !$values ) { throw new InvalidArgumentException("郵件接收地址不能爲空!"); } return new Mail($values); } /** * 郵件標題 * @param null $title * @return $this */ public function title($title=null) { if ( !$title ) { throw new InvalidArgumentException("郵件標題不能爲空!"); } $this->mail->setSubject($title); return $this; } /** * 郵件內容 * @param null $content * @return $this */ public function content($content=null) { if ( !$content ) { throw new InvalidArgumentException("郵件內容不能爲空!"); } $this->mail->setHTMLBody($content); return $this; } function __destruct() { $mailer = new Nette\Mail\SmtpMailer($this->config); $mailer->send($this->mail); } }
Mail 類和 View 類工做的方式基本一致,在homecontroller.php中添加:數組
function mail() { Mail::to(['xxxxx@qq.com']) ->from('Evai <xxx@163.com>') ->title('Hello World') ->content('<h1>Hello World !</h1>'); echo '發送郵件成功'; }
新建 'MFFC/config/mail.php',請自行替換郵件地址和密碼:composer
<?php return [ 'host' => 'smtp.163.com', 'username' => 'Evai <xxx@163.com>', 'password' => 'password', 'secure' => '', 'context' => [ 'ssl' => [ ], ], ];
routs.php中添加一條路由:
Route::get('mail', 'HomeController@mail');
OK,準備的差很少了,運行 'composer dump-autoload' 把 Mail 類加入自動加載,刷新頁面!異步
若是你看到以上頁面,恭喜你!郵件發送成功了!函數
趕快去檢查一下收件箱有木有郵件!此次頁面加載可能會稍慢,由於郵件是同步發送的。異步的隊列系統咱們會在之後講到。oop
郵件發送的總體流程想必你們已經輕車熟路了,如今主要敘述一下 Mail 類的設計過程:ui