Laravel 5.7 でメール送信

メモ:

Laravel 5.7 でメール送信を行うために、標準で SwiftMailer ライブラリーが用意されています。 SwiftMailer ライブラリーでは、SMTP、Mailgun、SparkPost、Amazon SES、sendmail等を使用してメールを送信することができますが、ここでは SMTP を使ったメール送信を行います。

準備

.env ファイルを修正してメール送信のための環境を設定します。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=********
MAIL_PASSWORD=********
MAIL_ENCRYPTION=null

ドキュメントには、 config/mail.php ファイルが設定ファイルと書かれていますが config/mail.php の中は .env を見ています。共通の from アドレスを使用したい場合は、 .env ファイルに MAIL_FROM_ADDRESS と MAIL_FROM_NAME を追加します。

MAIL_FROM_ADDRESS=bnote@hoge.net
MAIL_FROM_NAME=BBB

内容に応じて from アドレスを変えたい場合は、プログラム中で指定することができるので用途に応じて設定を行います。

mailable クラスの作成

Laravel 5.7 では、送信するメールを mailable クラスで管理します。 artisan コマンドを使用して mailable クラスを継承したメール管理クラスを作成します。ここでは、 Contact クラスを作成します。

$ php artisan make:mail Contact

コマンドを実行すると、 app ディレクトリに Mail ディレクトリが作成され Contact.php (Mailable を継承した Contact クラス)が作成されます。

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class Contact 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');
    }
}

フォームから受け取ったリクエストデータからメールを構築したいため Contact.php のコンストラクタで値を受け取ります。

次に build メソッドでメールの形を構築します。ここでは、件名のセットとメール本文に使用するテンプレートを指定しています。

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class Contact extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */

    public $contact;

    public function __construct($contact)
    {
        //
        $this->contact = $contact;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->subject('【問い合わせ】'.$this->contact['subject'])
                    ->view('contact.mail'); 
    }
}

mailable クラスで定義した public 変数(プロパティ)は、ビューでそのまま利用できるとのことですので public $contact を宣言しています。

メール本文用テンプレートの作成

メール本文のテンプレートを次のように作成します。

<p>
E-Mail:{{ $contact['email'} }}
</P>
<p>
件名:{{ $contact['subject'} }}
</P>
<p>
メッセージ:{{ $contact['message'} }}
</P>

コントローラーにメール送信機能を追加

コントローラに use App\Mail\Contact; と use Illuminate\Support\Facades\Mail; を追加し、メール送信を実行する send を用意します。

<?php

namespace App\Http\Controllers;

use App\Mail\Contact;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class ContactController extends Controller
{
    //
    public function send(Request $request){
        $validationData = $request->validate([
            'email' => 'required|email',
            'subject' => 'required|max:255',
            'message' => 'required',
        ]);

        $contact = $request->all();

        Mail::to('hogehoge@gmail.com')->send(new Contact($contact));

        return 'メッセージを送信しました。';
    }
}

to で指定した宛先へ Contact mailable クラスで作成したメールを送信します。

おまけ

メールドライバーを log に指定すると、メール送信ではなく strage/logs/laravel.log へ吐き出されるようになります。

.env ファイル:

MAIL_DRIVER=log