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