Laravel 5.5 ECサイト ユーザーにメールを送る


LaravelでMailableを使った簡単なメール通知を行う方法を書きます。


ECサイトで受注後にユーザーにメールを送るという設定です。
Laravel5.5です。

参考にしたサイト　https://readouble.com/laravel/5.5/ja/mail.html

<h2>mailableクラスを作成</h2>

make:mailコマンドを使用して、mailableクラスを生成します。

```
$ php artisan make:mail OrderAccepted
```

<br>

app/Mail/OrderAccepted.phpというファイルが作られます。

~~~php: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');
    }
}

~~~


<br>
以下のように書き加えます。



~~~php:app/Mails/OrderAccepted.php</font>

<?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/以下のディレクトリ名とファイル名を記入します。

<h2>コントローラー</h2>

$orderにデータを入れます。

~~~php:app/Http/Controller/OrderController.php

//省略

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にも送信可能です。

~~~php:
Mail::to($user->email)
    ->cc($moreUsers)
    ->bcc($evenMoreUsers)
    ->send(new OrderAccepted($order));
~~~


<h2>View</h2>
Viewを準備します。
こちらはviewの一例です。

~~~PHP:resources/views/emails/orderAccepted.blade.php
<!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クラスのコンストラクタへ渡す変数を増やせばいいだけです。


<h2>メール送信の設定</h2>
こちらはgmailの設定です。

~~~php:.env
//メール送信設定
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にアプリパスワードを入力する必要があります。
こちらを参考にしてください。
<a href="https://support.google.com/mail/answer/185833?hl=ja&visit_id=637553923249734549-1441058964&rd=1">アプリ パスワードでログインする</a>


以上です！
簡単にメール送信ができました。