Lumen 5.2 中配置邮件

Lumen中的邮件配置好了之后还是很简单的,但是配置过程官方文档省略了太多。

先来扒一扒遇到的坑:

  1. Class mailer does not exist -- 这个是由于没有注册mailer导致的。

  2. Missing argument 1 for Illuminate\Support\Manager::createDriver(), called in .../vendor/illuminate/support/Manager.php on line 87 and defined -- 没有mail.*相关的配置导致的,要记得加载下配置文件 —— Lumen中的配置文件不会自动加载的!有没有觉得特坑!

  3. Connection to tcp://手动打码:465 Timed Out -- 邮件配置参数中的mail.encryption不正确导致的。现在好多网站都开启了SSL,要用ssl.

最后总结一个完整的配置邮件的过程:

首先, 安装邮件功能所依赖的包:
composer require illuminate/mail
composer require guzzlehttp/guzzle
composer require jeremeamia/SuperClosure

其中,illuminate/mail提供了最关键的Mailer,如果想通过把邮件放到队列里面,则需要安装jeremeamia/SuperClosure

其次,增加或编辑config/mail.php配置文件,里面的内容形如下:
<?php

return [
    'driver' => "smtp",
    'host' => "smtp.xxxxmail.com", // 根据你的邮件服务提供商来填
    'port' => "465", // 同上
    'encryption' => "ssl", // 同上 一般是tls或ssl
    'username' => env('MAIL_USERNAME'),
    'password' => env('MAIL_PASSWORD'),
    'from' => [
        'address' => env('MAIL_FROM_ADDRESS'),
        'name' => env('MAIL_FROM_NAME'),
    ],
];

其中有一些用户名和密码之类的,我就直接放到环境变量里面了,防止误提交到版本库里面造成安全隐患。

p.s.如果放到环境变量里面,则在.env中添加对应的值。勿忘。

然后,注册mailer -- 在bootstrap/app.php中, return $app;之前,增加以下内容:
$app->singleton('mailer', function () use ($app) {
    return $app->loadComponent('mail', Illuminate\Mail\MailServiceProvider::class, 'mailer');
});

有人也许会问,为啥不能直接$app->register( Illuminate\Mail\MailServiceProvider::class)?
一开始,我也是直接这样做的,然后就遇到了坑#2 -- Lumen中不像Laravel,配置文件不会自动加载,所以这个地方建议使用loadComponent来搞,或者也可以自行加载对应的mail.*配置。

最后,终于可以发送邮件了
use Illuminate\Support\Facades\Mail;

Mail::send('emails.welcome', ['key' => 'value'], function($message)
{
    $message->to('我的QQ@qq.com', '我')->subject('Welcome!');
});

啥?出现了View [emails.welcome] not found的错误? 肯定是你忘了加对应的视图文件了,请自行添加resources/views/emails/welcome.php.

参考:
  1. http://lumen.learnku.com/docs/mail
  2. 分享:Laravel5 & PHP 5.6 发送邮件问题解决方案
本帖已被设为精华帖!
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5
jasonjiang123

mark

7年前 评论

其实用注册 Provider 也行

$this->app->register(\Illuminate\Mail\MailServiceProvider::class);

不过要自己加载一下配置文件:

// 写在 bootstrap/app.php 后面一些的位置
$app->configure(base_path('config/mail'));
5年前 评论

很好的学习,但是只有前半部分,没有结果展示

2年前 评论

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