Laravelで会員登録完了メールを送る方法[前編]

Laravelで登録完了メールを送る方法

こんにちはーむちょこです。

今日はLaravelのイベントとメール配信機能を使って、会員登録が完了したときにメールを送る方法をご紹介します☆

こういうやつです。

登録完了メール

Laravelのバージョンは5.7.13を使っていきます。

前編では1~4のメール部分について解説します☆

会員登録機能自体は既に作成済みのものとしますので、その部分の解説を見たい方はこちらをどうぞ。

Laravelでサクッとログイン機能を実装する方法

1. Mailgunの設定

まずはメール配信のためのドライバを設定していきましょう。

今回はMailgunを使おうと思います。

MEMO

他にもLaravelは様々なドライバを提供しているので、もし他のドライバを使いたい場合はこちらを参考に設定してみてください。

https://readouble.com/laravel/5.7/ja/mail.html

今回のようにMailgunを利用する場合は、Guzzleが必要です。
composerで追加インストールします。

コマンド
$ composer require guzzlehttp/guzzle

Guzzleがインストールできたら、Mailgunの情報を.envファイルに設定していきます。

.env
MAIL_DRIVER=mailgun
MAIL_HOST=(SMTP Hostnameの値)
MAIL_USERNAME=(Default SMTP Loginの値)
MAIL_PASSWORD=(Default Passwordの値)
MAIL_FROM_ADDRESS=(送信メールアドレス)
MAIL_FROM_NAME=(送信者名)

MAILGUN_DOMAIN=(Default SMTP Loginのドメイン部分)
MAILGUN_SECRET=(API Key)

()になっているところは、適宜自分の環境の値を入れてくださいね。

2. Mailableクラス準備

Laravelで提供されているMailableクラスを利用して、メール送信機能を作っていきます。

まずMailableクラスを継承したクラスを生成してくれる便利コマンドを実行します。

コマンド
$ php artisan make:mail RegisteredMail

これでapp/Mail/RegisteredMail.phpが生成されます。

次に生成されたRegisteredMailクラスを編集して、テンプレートやビューデータの準備をしていきます。

app/Mail/RegisteredMail.php
class RegisteredMail extends Mailable
{
    public function build()
    {
        return $this->subject('登録完了のお知らせ')
            ->view('emails.registered');
    }
}

viewメソッドの引数に’emails.registered’を渡すことで、views/emails/registered.blade.phpがメールの本文として使えるようになります。

テンプレート内では登録したユーザのデータを使いたいので、ビューデータとして渡せるようにしておきます。

app/Mail/RegisteredMail.php
use App\User;

class RegisteredMail extends Mailable
{
    /**
     *  ユーザインスタンス
     *  @var User
     */
    public $user;

    /**
     * 新しいメッセージインスタンスの生成
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }
}

ビューデータとして渡す方法は、publicプロパティにデータをセットするだけです。

3. テンプレート作成

ディレクトリとファイルは新規作成してください。

resources/views/emails/registered.blade.php
<p>
    {{ $user->name  }}様<br>
    ご登録ありがとうございます!
</p>

4. テスト

メール配信機能が実装できたので、軽くテストしておきます。

コマンド
php artisan make:test Mail/RegisteredMailTest --unit

このコマンドを実行すると、tests/Unit/Mail/RegisteredMailTest.phpにユニットテスト用の初期ファイルが生成されます。
自動で生成されるtestExampleメソッドは消してしまっても構いません。

メールが送信されるか確認するテストコードを追記していきます。

tests/Unit/Mail/RegisteredMailTest.php<br />
use App\Mail\RegisteredMail;
use Illuminate\Support\Facades\Mail;

class RegisteredMailTest extends TestCase
{
    public function testBuild()
    {
        $user = factory(\App\User::class)->make();

        Mail::fake();

        Mail::to($user)
            ->send(new RegisteredMail($user));

        //メールを指定のメールアドレスに送ったことをアサート
        Mail::assertSent(RegisteredMail::class, function ($mail) use ($user) {
            //メールの件名をアサート
            $mail->build();
            $this->assertEquals('登録完了のお知らせ', $mail->subject);

            return $mail->hasTo($user->email);
        });

        //1回だけ送信されたことをアサート
        Mail::assertSent(RegisteredMail::class, 1);
    }
}

分割して解説していきます。

$user = factory(\App\User::class)->make();

factoryというグローバル関数は、引数のモデルインスタンスを生成します。
そしてmakeメソッドは適当なモデルを自動生成し、DBには保存しません。

今回はユーザモデルを生成して、この場限りのユーザ情報として利用しています。

 Mail::fake();

Mailファサードのfakeメソッドを使っています。

「ここで行うメール送信はfake(偽物)ですよー」というメソッドで、実際にはメールが送信されなくなります。

//メールを指定のメールアドレスに送ったことをアサート
Mail::assertSent(Registration::class, function ($mail) use ($user) {
    return $mail->hasTo($user->email);
});

中に別の処理が入って少々わかりづらくなってしまったのですが、この部分でメールを指定のメールアドレスに送ったことをアサートしています。

//メールの件名をアサート
$mail->build();
$this->assertEquals('登録完了のお知らせ', $mail->subject);

この部分はメールの件名をアサートしています。
buildメソッドはメールの件名を取得するために必要です。

それでは中身が分かったところで、次のコマンドでテストを実行してみましょう。

コマンド
./vendor/bin/phpunit  tests/Unit/Mail/RegisteredMailTest.php

OK (1 test, 3 assertions)と出たらテスト合格です!

お疲れ様でした✨

次回はこのメールを、イベント機能を使って会員登録成功時に送信できるようにしていきます。

Laravelで登録完了メールを送る方法 Laravelで会員登録完了メールを送る方法[後編]