## 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上传插件