Laravel5 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 的方案

  1. 配置 .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
  2. 配置 config/mail.php (主要是将 encryption 的值从 tls 改成 ssl

    'from' => ['address' => '你的发件人地址', 'name' => '你的发件人名称'],
    'encryption' => 'ssl',
  3. 修改 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);
  4. 基本完成了,现在可以发邮件了:

    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 步 中的代码

完成

如果您有更好的方案,欢迎赐教!

转载请注明:代码家园 » Laravel5 PHP 5.6 发送邮件问题解决方案

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)