ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 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`相关实现代码。