版本:laravel 5.3
发送邮箱:QQ邮箱
根据官网以及别人的教程配置邮件发送,并且对配置过程中遇到的坑进行填补,做一总结,留待参考。
一.开启stmp
进入QQ邮箱,设置-服务,开启smtp。
开启后会出现一个授权码,记下来,要用
打开【如何使用Foxmail等软件收发邮件】,可以找到到smtp服务器地址和端口号,记下来,要用
二.在Laravel中配置邮件发送
配置涉及到两个文件:config/mail.php 和 .env,因为mail.php读取的是.env的配置,所以我把mail.php中的环境变量默认值都去掉(除了mail_from_name),然后只在.env中配置
main.php
return [ 'driver' => env('MAIL_DRIVER'), 'host' => env('MAIL_HOST'), 'port' => env('MAIL_PORT'), 'from' => [ 'address' => env('MAIL_FROM_ADDRESS'), 'name' => env('MAIL_FROM_NAME','火星大人'), // 经测试,.env中的中文会被忽略,所以此变量不在.env中设置 ], 'encryption' => env('MAIL_ENCRYPTION'), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'sendmail' => '/usr/sbin/sendmail -bs', ];
.env
MAIL_DRIVER=smtp MAIL_HOST=smtp.qq.com // STMP服务器地址 MAIL_PORT=465 // 端口 [email protected] // 登陆邮箱的账号 MAIL_PASSWORD=xxxxxxxx // 授权码 [email protected] // 发件人邮箱 MAIL_ENCRYPTION=ssl
三.代码文件
创建路由:
Route::get('mail/send','MailController@send');
创建控制器:php artisan make:controller MailController
MailController.php
php namespace App\Http\Controllers; use Illuminate\Support\Facades\Mail; class MailController extends Controller { public function send() { $name = '王宝花'; // emails.test 指向\resources\views\emails\test.blade.php Mail::send('emails.test',['name'=>$name],function($message){ $to = '[email protected]'; $message->to($to)->subject('邮件测试'); }); } }
创建视图:\views\emails\test.blade.php
{{$name}}你好,这是一封测试文件。
发送:http://localhost/mail/send
四.验证结果
"火星大人"就是 MAIL_FROM_NAME 的值
五.配置过程中遇到的两个错误
1.报错:Missing argument 1 for Illuminate\Support\Manager::createDriver(), called in G:\WWW\blog\vendor\laravel\framework\src\Illuminate\Support\Manager.php on line 87 and defined
原因:经测试发现是.env文件中的邮件配置项存在xxx=null的问题,把null改成具体值,或者去掉xxx,把xxx放到mail.php中赋值,可解决
2.报错:Failed to authenticate on SMTP server with username "[email protected]" using 1 possible authenticators
原因:邮箱账号授权码之类的信息不正确,修改之。我原先以为mail_password是登陆密码,其实是授权码
3.控制器中,mail::send()没有返回值。网上的一些信息是通过返回值来判断是否发送成功,这个不对。那么如何判断是否发送成功呢?未解,可能没报错就是成功吧。
4.配置项或者环境变量修改后不生效问题:
先:php artisan config:clear
再:php artisan config:cache
ok。
所以每次修改main.php 或者 .env 的值后,都要这般操作一下