使用yii2发送邮件

2017-07-20  本文已影响0人  祥哥去哪里

前言:
收到网站发送的邮件,在我们的生活中经常遇到,那么,我们在网站开发当中,如何向用户发送邮件呢
下面我就来介绍下如何在yii2框架中发送邮件


目录:

  1. mailer组件的配置
  2. 封装发送邮件的方法
  3. mailer里的坑

  1. 我们使用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的属性.让后我们往下面找,并没有发现这个共有的属性,但是我们找到了一个魔术方法

transport魔术方法

这个魔术方法,从命名中可以看出是一个写入方法,方法有一个形参,数据类型为数组或者Swift_Transport对象

我们看了注释,也看了方法,我们现在就可以开始配置了

我们以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',
            ]

  1. 当我们配置完成后,我们就要开始使用了

通常我们会将发送邮件的操作封装到一个方法里,方便我们在不同的地方使用

   /**
     * 向用户发送邮件的方法
     * @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值,代表是否发送成功


  1. 细心的朋友应该发现了,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.

意思是,是否将邮件以文件的形式保存,而不是发送给实际的接收者.
是个用来调试用的开关.但是我们发现

image.png

它默认是关闭的.也就是没有开启本地调试.
这里我的解决方法就是在组件中,再次配置一次.

        '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组件的配置就是这样.这样配置好了之后就可以正常的发送邮件了.

如果有不正确的地方欢迎大家指正,共同学习.谢谢
以上.

上一篇下一篇

猜你喜欢

热点阅读