使用yii2发送邮件
前言:
收到网站发送的邮件,在我们的生活中经常遇到,那么,我们在网站开发当中,如何向用户发送邮件呢
下面我就来介绍下如何在yii2框架中发送邮件
目录:
- mailer组件的配置
- 封装发送邮件的方法
- mailer里的坑
- 我们使用mailer插件来发送邮件
这是这个插件的github地址https://github.com/PHPMailer/PHPMailer
但是yii2中内置了mailer组件,我们只需要将它配置下就可以了
//我们在config中的main.php中进行配置,
如果觉得前后台都要用到的话,我们可以在common里来配置
//这里要注意的是组件必须在键名为components的数组中配置
'mailer' => [
'class' => \yii\swiftmailer\Mailer::className(),
]
//这样我们就配置好了一个最基本的配置
但是这样配置,并不能发送一封邮件.我们知道在yii2中组件类中的public属性我们都是可以自行配制的.我们来看看这个mailer类中,有哪里需要我们配置的数据
mailer中的注释当我们进入mailer类中,我们可以看到开发者为我们准备了这样的注释
我们注意到,开发者让我们配置一个属性名为transport的属性.让后我们往下面找,并没有发现这个共有的属性,但是我们找到了一个魔术方法
这个魔术方法,从命名中可以看出是一个写入方法,方法有一个形参,数据类型为数组或者Swift_Transport对象
我们看了注释,也看了方法,我们现在就可以开始配置了
- 第一个参数class 我们跟着注释写,Swift_SmtpTransport
- 第二个参数填写邮件的服务器
我们以qq邮箱为例:
我们进入邮箱
image.png点击设置
找到这个设置选项
image.png
看看他的说明
image.png
这里找到我们需要的配置信息
我们要发送邮件,那么发送邮件的服务器就是smtp.qq.com
- 第三个参数 和第四个参数,在自己的邮箱里去设置,一般邮箱会发一个专门的密码来用于外部使用
- 第四个参数就是用于传递数据的端口号,注意加密和不加密的端口是不同的
- 第五个参数就是加密的方式
这些在邮箱的帮助文档中都有很详细的说明
下面是我的配置,不同的邮箱配置是不一样的
'mailer' => [
'class' => \yii\swiftmailer\Mailer::className(),
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.qq.com',
'username' => '********@qq.com',
'password' => '%%%%%%%%%',
'port' => '465',
'encryption' => 'ssl',
]
- 当我们配置完成后,我们就要开始使用了
通常我们会将发送邮件的操作封装到一个方法里,方便我们在不同的地方使用
/**
* 向用户发送邮件的方法
* @param $toMember
* 用户的邮件地址
* @param $subject
* 邮件主题
* @param $body
* 邮件内容
* @return bool
* 发送结果
*/
private function sendEmail($toMember, $subject, $body)
{
//1构造对象
$emailObj = Yii::$app->mailer->compose();
//设置发件人的邮件地址
return $emailObj->setFrom(Yii::$app->params['adminEmail'])
->setTo($toMember)//设置收件人的地址
->setSubject($subject)//设置邮件主题
->setHtmlBody($body)//设置邮件的内容的html
->send();//发送方法
}
构造mailer对象的写法是固定写法,感情兴趣的朋友可以看看底层源码是如何写的.是在mailer的基类中继承了一个MailerInterface接口
setHtmlBody注意了,里面需要写html代码,如果不想写html的话,还有一个setTextBody方法可以不用写html代码
当我们按照上面的代码写好之后,send方法会返回一个bool值,代表是否发送成功
- 细心的朋友应该发现了,send之后命名返回的true,却没有收到发送的邮件.这个就是一个坑了.我们在配置中还有一个需要配置的地方.
那就是
'useFileTransport' => false
这是一个在mailer基类中的一个属性
官方给的注释是whether to save email messages as files under [[fileTransportPath]] instead of sending them
* to the actual recipients. This is usually used during development for debugging purpose.
意思是,是否将邮件以文件的形式保存,而不是发送给实际的接收者.
是个用来调试用的开关.但是我们发现
它默认是关闭的.也就是没有开启本地调试.
这里我的解决方法就是在组件中,再次配置一次.
'mailer' => [
'class' => \yii\swiftmailer\Mailer::className(),
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.qq.com',
'username' => '*********@qq.com',
'password' => '%%%%%%%%',
'port' => '465',
'encryption' => 'ssl',
],
'useFileTransport' => false
],
也就是这样,一个完整的mailer组件的配置就是这样.这样配置好了之后就可以正常的发送邮件了.
如果有不正确的地方欢迎大家指正,共同学习.谢谢
以上.