Laravel 5 & PHP 5.6 发送邮件问题解决方案
PHP 5.6 上有一个更新:
Stream wrappers now verify peer certificates and host names by default when using SSL/TLS
这个更新导致 Laravel 中使用的 Swift Mailer 无法发送邮件
在网上看了很多解决方案,没有找到一个靠谱的,不过最后还是根据每个地方的一点点的提示,成功的用 Laravel 发送了我的第一封邮件!
有两个解决方案:一个是使用 SSL 协议发送邮件,另一个是不使用 SSL,只使用普通的 25 号端口去发送邮件
第一个方案更安全,但不灵活,需要修改 swift mailer 的源代码(下面主要说这个方案)
第二个方案很简单,但不够安全
SSL 的方案
-
配置
.env
文件 (我用的是 QQ 企业邮箱)MAIL_DRIVER=smtp MAIL_HOST=smtp.exmail.qq.com MAIL_PORT=465 MAIL_USERNAME=your_name@your_company.com MAIL_PASSWORD=your_password
-
配置
config/mail.php
(主要是将encryption
的值从tls
改成ssl
)'from' => ['address' => '你的发件人地址', 'name' => '你的发件人名称'], 'encryption' => 'ssl',
-
修改
swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php
在文件的 259 行,
_establishSocketConnection
中有个$options = array();
,只需要在它下面加上:$options['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true);
-
基本完成了,现在可以发邮件了:
use Illuminate\Support\Facades\Mail; Mail::send('mails.welcome', ['key' => 'value'], function($message) { $message->to('710067681@qq.com', 'Mora')->subject('Welcome!'); });
非 SSL 方案
上面的 第 1 步
中的 MAIL_PORT
换成 25
上面的第 2 步
中只需要注释掉 encryption
这一行
不用修改上面的 第 3 步
中的代码
完成
如果您有更好的方案,欢迎赐教!