Laravel 基于 SwiftMailer 库提供了一套干净、清爽的邮件 API。Laravel 为 SMTP、Mailgun、Postmark、Amazon SES,以及 sendmail 提供了驱动,从而允许你快速通过本地或云服务发送邮件。
由于sendmail需要安装配置Sendmail/Postfix,其他要么付费要么不能用。所以这里driver的配置是smtp。
使用QQ邮箱的话,需要开启POP3和SMTP服务。开启方式如下:
QQ邮箱 > 设置 > 账户
开启所有SMTP服务,开启成功会生成密钥,这个密钥会在后面的MAIL_PASSWORD中用到
host是邮箱所在主机,比如我们使用QQ邮箱,对应值是smtp.163.com,使用QQ邮箱的话,对应值是smtp.qq.com。
port用于配置邮箱发送服务端口号,比如一般默认值是25,但如果设置SMTP使用SSL加密,该值为465。
from配置项包含address和name,前者表示发送邮箱,后者表示发送邮件使用的用户名。
encryption表示加密类型,可以设置为null表示不使用任何加密,也可以设置为tls/ssl。
username表示邮箱账号,比如12345@qq.com
password表示上述邮箱登录对应登录密码。
sendmail是在设置driver为sendmail时使用,用于指定sendmail命令路径。
pretend用于配置是否将邮件发送记录到日志中,默认为false则发送邮件不记录日志,如果为true的话只记录日志不发送邮件,这一配置在本地开发中调试时很有用。
基础配置:
// 代码演示 // 配置可以选择在config/mail.php中配置也可以选择在.env中配置,这里选择在.env中配置 MAIL_FROM_ADDRESS=555666@qq.com
MAIL_FROM_NAME=发件人称呼 MAIL_DRIVER=smtp MAIL_HOST=smtp.qq.com MAIL_PORT=25 MAIL_USERNAME=555666@qq.com MAIL_PASSWORD=zklafekkjkabbmlc MAIL_ENCRYPTION=null
安装 Guzzle HTTP 函数库
composer require guzzlehttp/guzzle
方案一:
添加路由规则
Route::get('mail/send','MailController@send');
生成控制器
php artisan make::controller MailController
控制器中代码
<?php namespace App\Http\Controllers; use Mail; use Illuminate\Support\Facades\Storage; class MailController { public function send() { $name = '小码哥'; // Mail::send()的返回值为空,所以可以其他方法进行判断 $image = Storage::disk('public')->get('images/test.png'); // 存放在自己创建目录storage\app\public\images Mail::send('emails.test',['image'=>$image, 'name'=>$name],function($message){ $to = '55555@qq.com'; $message->to($to)->subject('邮件测试'); $attachment = storage_path('file/test.txt'); // 存放在自己创建目录storage\file // 在邮件中上传附件 // $message->attach($attachment,['as'=>'中文文档.txt']); // 如果乱码请改用下面的方式 $message->attach($attachment,['as'=>"=?UTF-8?B?".base64_encode('中文文档')."?=.txt"]); }); // 返回的一个错误数组,利用此可以判断是否发送成功 if(count(Mail::failures()) < 1){ echo '发送邮件成功,请查收!'; }else{ echo '发送邮件失败,请重试!'; } } }
在resources/emails下创建一个模板文件。test.blade.php,添加代码
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{$name}},这是一封测试邮件 <br> <img src="{{$message->embedData($image,'我的自拍照.png')}}"> </body> </html>
方案二:
生成 Mailables(可邮寄类)
php artisan make:mail OrderShipped
代码:
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class OrderShipped extends Mailable { use Queueable, SerializesModels; public $order; /** * Create a new message instance. * * @return void */ public function __construct($order) { $this->order = $order; } /** * Build the message. * * @return $this */ public function build() { return $this->view('email'); } }
创建email.blade.php视图
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>BroadcastService</title> </head> <body> 邮件测试 {{$order->price}} </body> </html>
发送邮件
<?php namespace App\Http\Controllers; use App\Mail\OrderShipped; use App\Models\Order; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Mail; use Laravel\Socialite\Facades\Socialite; class IndexController extends Controller { public function send() { $order = Order::first(); Mail::to("888999@qq.com")->send(new OrderShipped($order)); } }