在 Laravel 5.6 使用SMTP驱动实现邮件发送
1. 配置文件
Laravel集成了SwiftMailer库进行邮件发送,邮件配置文件位于config/mail.php
<?php
return [
'driver' => env('MAIL_DRIVER', 'smtp'), //配置默认的邮件发送驱动
//host是邮箱所在主机,比如我们使用163邮箱,对应值是smtp.163.com,
//使用QQ邮箱的话,对应值是smtp.qq.com
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
//port用于配置邮箱发送服务端口号,比如一般默认值是25,但如果设置SMTP使用SSL加密,该值为465
'port' => env('MAIL_PORT', 587),
'from' => [
'address' => env('MAIL_FROM_ADDRESS', '[email protected]'), //发送邮箱
'name' => env('MAIL_FROM_NAME', 'Example'), //发送邮件使用的用户名
],
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'sendmail' => '/usr/sbin/sendmail -bs',
'markdown' => [
'theme' => 'default',
'paths' => [
resource_path('views/vendor/mail'),
],
],
];
我的配置:
2. 定义路由
为我们的测试在routes.php定义路由规则:
Route::get('mail/send','[email protected]');
3. 创建邮件发送控制器
php artisan make:controller MailController
纯文本邮件发送可以使用Mail::raw方法
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Mail;
class MailController extends Controller
{
public function send()
{
Mail::raw('这是一封测试邮件', function ($message) {
$to = '[email protected]';
$message ->to($to)->subject('测试邮件222222');
});
}
}
Mail::send需要传递三个参数,第一个是邮件视图,第二个是传入视图的数据,第三个是一个闭包,该闭包中定义了收件人、抄送人(如果有的话)、邮件主题、附件等信息。邮件的主体内容位于局部视图中,下面我们就来定义这个局部视图,在resources/views/emails目录下新建test.blade.php,编辑其内容如下:
{{ $name }} 哈哈哈哈
使用Mail::send发送视图邮件
public function send()
{
$name = '我叫liang 你好啊';
$flag = Mail::send('emails.test',['name'=>$name],function($message){
$to = '[email protected]';
$message->to($to)->subject('测试邮件22222');
});
if( count(Mail::failures()) > 0 ){
echo '发送邮件失败,请重试!';
}else{
echo '发送邮件成功,请查收!';
}
}
使用make:mail生成邮件
php artisan make:mail OrderShipped
该命令会在 app/mail 目录下生成一个继承于Mailable的邮件类。类中的build方法用于构建邮件。
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.test');
}
那么怎么向视图传递数据呢?有两种方法
- Mailable 类任何公共属性都可以在视图中使用
- 使用 with 方法来传递数据给模板
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class OrderShipped extends Mailable
{
use Queueable, SerializesModels;
public $data;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($data)
{
$this->data = $data;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.test')->subject('Order Shipped')
->with(['other' => '这是通过with方法携带的数据']);
}
}
发送邮件
使用 Mail 门脸的 to 方法。 to 方法接受一个邮件地址,一个 user 实现或一个 users 集合。如果传递一个对象或集合,mailer 将自动使用 email 和 name 属性来设置邮件收件人,所以确保你的对象里有这些属性。一旦指定收件人,你可以传递一个实现到 Mailable 类的 send 方法
public function send()
{
$data = '通过公共属性发送的数据';
Mail::to('[email protected]')
->send(new OrderShipped($data));
}