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

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

完成

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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 2
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!