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));
}
}