LaravelでMailableを使った簡単なメール通知を行う方法を書きます。
ECサイトで受注後にユーザーにメールを送るという設定です。
Laravel5.5です。
参考にしたサイト https://readouble.com/laravel/5.5/ja/mail.html
mailableクラスを作成
make:mailコマンドを使用して、mailableクラスを生成します。
$ php artisan make:mail OrderAccepted
app/Mail/OrderAccepted.phpというファイルが作られます。
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class OrderAccepted extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('view.name');
}
}
以下のように書き加えます。
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class OrderAccepted 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->subject('ご注文を承りました。')->view('emails.orderAccepted');//追記
}
}
subject()にはメールのタイトル、
view()にはresouce/view/以下のディレクトリ名とファイル名を記入します。
コントローラー
$orderにデータを入れます。
//省略
use App\Mail\OrderAccepted;//追記
use Illuminate\Support\Facades\Mail;//追記
class OrderController extends Controller {
//省略
public function order(Request $request, $id)
{
//省略 データベースに注文内容を保存したり、決済処理など。
$order = (new Order)->find($order_id);//例:$orderに注文内容を格納
$user = User::find(Auth::id());//メールの宛先
Mail::to($user->email)->send(new OrderAccepted($order));
return redirect(route('index'))->with('message', 'ご購入ありがとうございました!ご注文内容をメールにてお送りしました。');
}
Mailファサードのtoメソッドに宛先を、
sendメソッドにmailableクラスのインスタンスを渡します。
メソッドチェーンで繋ぐとccとbccにも送信可能です。
Mail::to($user->email)
->cc($moreUsers)
->bcc($evenMoreUsers)
->send(new OrderAccepted($order));
View
Viewを準備します。 こちらはviewの一例です。<!DOCTYPE html>
<html lang="ja">
<body>
<p>下記のご注文を承りました。</p>
<p>オーダーID:{{ $order->id}}</p>
<p>注文日:{{ $order->created_at }}</p>
<p>合計金額:{{ $order->amount }}円</p>
<p>配送先:{{ $order->address_name }} 様</p>
<p>ご住所{{ $order->address }}</p>
<p>電話番号:{{ $order->tel }}</p>
<p>この度は<a href="{{ config('app.url') }}">{{ config('app.name') }}</a>をご利用いただきありがとうございました。</p>
</body>
</html>
内容は使用するテーブルのカラムに合わせて変えてください。
注文内容に紐づく注文詳細も載せたい!という場合は、mailableクラスのコンストラクタへ渡す変数を増やせばいいだけです。
メール送信の設定
こちらはgmailの設定です。//メール送信設定
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=xxxxxx@gmail.com
MAIL_PASSWORD=xxxxxxxxxxxxxxx
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=from@email.com
MAIL_FROM_NAME=ECサイト名
メール送信時にエラーが表示される場合は2段階認証プロセスを有効にしてMAIL_PASSWORDにアプリパスワードを入力する必要があります。
こちらを参考にしてください。
アプリ パスワードでログインする
以上です!
簡単にメール送信ができました。