## Yii2使用不同的方式進行郵件發送邏輯處理
[TOC]
郵件發送在日常開發中十分常見的一個功能,而Yii2已經集成了基于 SwiftMailer 庫提供了一套干凈清爽的郵件API,利用它可以很方便的進行配置發送郵件。
這里以**Advanced**版本為例操作。
### 發送前的簡單配置
在配置文件中`/common/config/main.php`修改**components**數組中的`mailer`項。
```
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'useFileTransport' => false,
'viewPath' => '@common/mail',
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.qiye.163.com',
'username' => 'username@****.com',
'password' => '********',
'port' => '25',
'encryption' => 'tls',
],
'messageConfig' => [
'charset' => 'UTF-8',
'from' => ['username@****.com' => 'luo']
],
],
```
#### 發送郵件所用模板
`common/mail/test.php`內容如下
```
這是一封測試郵件,郵件內容為:<?= $data['key']; ?>
```
### 使用Components組件
#### 編寫組件
使用**components**組件將發送郵件的業務邏輯從控制器中分離出來。
例如這里在后臺創建文件,`backend\components\EmailComponent.php`,代碼如下:
```
<?php
namespace backend\components;
use yii\base\Component;
class EmailComponent extends Component
{
public function send(array $request)
{
if (!isset($request['to']) || !isset($request['subject'])) {
\Yii::error('錯誤的郵箱配置');
return false;
}
return \Yii::$app->mailer->compose('test', ['data' => $request['data']])
->setTo($request['to'])
->setSubject($request['subject'])
->send();
}
}
```
#### 配置組件
配置文件在`bakcend\config\main.php`中在**components**數組中新增如下內容:
```php
'EmailComponent' => [
'class' => 'backend\components\EmailComponent',
],
...
'urlManager' => [
],
```
#### 調用組件 發送郵件
```php
$request['to'] = '****@qq.com';
$request['subject'] = '感謝注冊';
$request['data'] = ['key' => 'value'];
Yii::$app->EmailComponent->send($request);
```
### 使用Services依賴注入方式
#### 編寫Services文件
文件在`backend\services\EmailService.php`,內容如下:
```php
<?php
namespace backend\services;
use yii\swiftmailer\Mailer;
class EmailService
{
public $mail;
/**
* EmailService constructor.
* @param Mailer $mail
*/
public function __construct(Mailer $mail)
{
$this->mail = $mail;
}
/**
* 發送Email
* @param array $request
*/
public function send(array $request)
{
$message = \Yii::$app->mailer->compose('test',['data'=>$request['data']]); // 使用common/mail/test.php模板,使用$request['data']傳遞的數據到模板
$message->setTo($request['to']);
$message->setSubject($request['subject']);
return $message->send();
}
}
```
#### 調用Services
將EmailService依賴注入控制器,然后調用Service中的`send()`方法發送郵件。代碼如下:
```php
<?php
namespace backend\controllers;
user backend\serivces\EmailService;
user Yii\web\Controller;
user Yii;
class ExampleController extends Controller
{
protected $emailService;
public function __construct($id, $module, EmailService $emailService)
{
parent::__construct($id, $module);
$this->emailService = $emailService;
}
public function actionIndex()
{
$request['to'] = '****@qq.com';
$request['subject'] = '感謝注冊';
$request['data'] = ['key' => 'value'];
$this->emailService->send($request);
}
}
```
### 在Model中書寫發送郵件邏輯
參考**Advanced**高級版的`frontend/models/ConcatForm.php`相關實現代碼。
- 開始
- Yii2開發小技巧
- Yii2使用不同的方式進行郵件發送邏輯處理
- Yii2 Serialization of 'Closure' is not allowed 錯誤
- Yii創建應用
- Yii應用結構和流程
- Yii的路徑別名
- Yii的請求
- Yii的響應
- Sessions 和 Cookies
- Yii自定義全局工具函數
- Yii2模型
- Yii2視圖
- Yii2控制器
- 大數據節省內存處理
- 關聯查詢hasMany、hasOne
- Yii2 URL地址美化
- Yii2整合AdminLTE后臺主題
- Yii2模型中的場景
- Yii2中的RBAC
- Yii2項目后臺整合yii2-admin模塊
- RBAC集成AdminLTE后臺主題對菜單進行控制
- Yii2自定義Gii模板
- 修復AdminLTE引用外部字體文件導致訪問變慢的情況
- Yii2事件簡單使用
- Yii2模型事件
- Yii2使用GridView新增操作按鈕
- Yii2向loyout模板文件中傳值
- Yii2數據緩存
- Yii2緩存
- Yii2數據緩存之增刪改查
- Yii2拓展
- Yii2日期時間插件-datetimepicker
- kartik-v/yii2-widget-fileinput上傳插件