美文网首页
使用yii2发送邮件

使用yii2发送邮件

作者: 祥哥去哪里 | 来源:发表于2017-07-20 22:01 被阅读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对象

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

    • 第一个参数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',
                ]
    

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

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

    相关文章

      网友评论

          本文标题:使用yii2发送邮件

          本文链接:https://www.haomeiwen.com/subject/ekwjkxtx.html