yii2 swift mailer 发送邮件不成功的问题

2016-4-14 liyangweb.com 李杨 PHP

今天调试yii2自带的swift mailer发邮件,开始调试时,发送用的send()方法始终返回true,但是就是没有收到邮件,很是纳闷,于是开始了半个晚上的调试之旅,我把调试过程发出来,希望后面的小伙伴能少走一些弯路。
首先,根据热心网友的文章,配置邮箱的基础信息,我用的base项目,所以我的配置文件是web.php,配置内容为:
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => 'smtp.163.com',
                'username' => 'xxx@163.com',
                'password' => 'xxx',
                'port' => '25',
                'encryption' => 'tls',//    tls | ssl

            ],
            'messageConfig'=>[
                'charset'=>'UTF-8',
                'from'=>['xxx@163.com'=>'admin']
            ],
            'useFileTransport' => false,
        ],
然后开始写了一个测试用的控制器,内容如下:
    public function actionMailer()
    {
        $mail= Yii::$app->mailer->compose();
        $mail->setTo('10000@qq.com');
        $mail->setSubject("Test title");
        $mail->setTextBody('Test content');
        //$mail->setHtmlBody("Test HTML");
        var_dump($mail->send());
    }
好了,信心满满的开始测试了,执行链接,满心欢喜的去查看QQ邮箱了,但是左等右等,前等后等,丫的就是没有,重新发送,还是没有,但是send()的返回值明明就是true!
 于是开始排错,总结了一下,出错的可能位置在以下几点:
 不同邮箱的host是不同的
如果是163邮箱,password是授权码
userFileTransport要设置成false,否则只会在runtime下生成缓存文件,不会真正发送
一一排查,确信没有错误,太奇怪了,于是我决定直接调用swiftmailer试一下,于是新建了下面的控制器:
    public function actionMailer2()
    {
        $mailer = new \yii\swiftmailer\Mailer();
        $mailer->transport=[
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.163.com',
            'username' => 'xxxx@163.com',
            'password' => 'xxxx',
            'port' => '25',
            'encryption' => 'tls',//    tls | ssl
        ];
        $mailer->messageConfig=[
            'charset'=>'UTF-8',
            'from'=>['xxxx@163.com'=>'admin']
        ];
        $mailer->useFileTransport = false;
        $mail= $mailer->compose();
        $mail->setTo('10000@qq.com');
        $mail->setSubject("Test title");
        $mail->setTextBody('Test content');
        var_dump($mail->send());
    }

哎哟我去!发送成功了!这是为啥呢?首先证明这个类确是是可以发送邮件的了,那么下一步要细细的分析这两段代码区别在何处了。
我分别打印了两个类构造完成后的结果:
    public function actionMailer()
    {
        echo '<pre>';
        var_dump(Yii::$app->mailer);
    }



    public function actionMailer2()
    {
        $mailer = new \yii\swiftmailer\Mailer();
        $mailer->transport=[
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.163.com',
            'username' => 'xxxx@163.com',
            'password' => 'xxxx',
            'port' => '25',
            'encryption' => 'tls',//    tls | ssl
        ];
        $mailer->messageConfig=[
            'charset'=>'UTF-8',
            'from'=>['xxxx@163.com'=>'admin']
        ];
        $mailer->useFileTransport = false;
        echo '<pre>';
        var_dump($mailer);
    }

在长长的内容中慢慢的对比,终于发现了端倪,
第一个方法中:["useFileTransport"]=>bool(true)
第二个方法中:["useFileTransport"]=>bool(false)
上面也说过了,useFileTransport必须设置成false才能发送成功,那问题总算是找到了,那为什么会出现这样的问题呢?我上面明明是设置过的,为什么没生效?难道是测试环境的原因吗?
我测试使用的url是http://goonwin.com/index-test.php?r=liyang/mailer,注意那个index-test.php,就是他的原因了,于是我把index-test.php改成index.php立马发送成功了,丫的,这么隐蔽一个坑啊!!!
但是我还是希望测试环境可以发送邮件的,于是,稍微改动了一下调用的方法:
    public function actionMailer()
    {
        $mail = Yii::$app->mailer;
        $mail->useFileTransport = false;
        $mail= $mail->compose();
        $mail->setTo('10000@qq.com');
        $mail->setSubject("Test title");
        $mail->setTextBody('Test content');
        var_dump($mail->send());
    }

Oh,终于可以发送了,看到论坛中有些朋友也在问同样的问题,估计现在你已经可以解决了。洋洋洒洒写了这么多,其实就一个目的,希望能给新手一点调试的经验吧,老手你当然乐呵乐呵就得了。
浪费一晚上青春,睡觉!









标签: yii2

评论:

海上钢琴师
2017-04-25 11:37
大神,谢了,正好解决了我调试半天的问题,一抹一样的问题
学习者
2017-05-12 18:55
@海上钢琴师:棒棒哒

发表评论:

Powered by emlog 冀ICP备13011830号-1