こんにちはーむちょこです。
今日はLaravelのイベントとメール配信機能を使って、会員登録が完了したときにメールを送る方法をご紹介します☆
こういうやつです。
Laravelのバージョンは5.7.13を使っていきます。
前編では1~4のメール部分について解説します☆
会員登録機能自体は既に作成済みのものとしますので、その部分の解説を見たい方はこちらをどうぞ。
Laravelでサクッとログイン機能を実装する方法1. Mailgunの設定
まずはメール配信のためのドライバを設定していきましょう。
今回はMailgunを使おうと思います。
他にもLaravelは様々なドライバを提供しているので、もし他のドライバを使いたい場合はこちらを参考に設定してみてください。
今回のようにMailgunを利用する場合は、Guzzleが必要です。
composerで追加インストールします。
$ composer require guzzlehttp/guzzle
Guzzleがインストールできたら、Mailgunの情報を.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クラスを編集して、テンプレートやビューデータの準備をしていきます。
class RegisteredMail extends Mailable
{
public function build()
{
return $this->subject('登録完了のお知らせ')
->view('emails.registered');
}
}
viewメソッドの引数に’emails.registered’を渡すことで、views/emails/registered.blade.phpがメールの本文として使えるようになります。
テンプレート内では登録したユーザのデータを使いたいので、ビューデータとして渡せるようにしておきます。
use App\User;
class RegisteredMail extends Mailable
{
/**
* ユーザインスタンス
* @var User
*/
public $user;
/**
* 新しいメッセージインスタンスの生成
*
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
}
ビューデータとして渡す方法は、publicプロパティにデータをセットするだけです。
3. テンプレート作成
ディレクトリとファイルは新規作成してください。
<p>
{{ $user->name }}様<br>
ご登録ありがとうございます!
</p>
4. テスト
メール配信機能が実装できたので、軽くテストしておきます。
php artisan make:test Mail/RegisteredMailTest --unit
このコマンドを実行すると、tests/Unit/Mail/RegisteredMailTest.phpにユニットテスト用の初期ファイルが生成されます。
自動で生成されるtestExampleメソッドは消してしまっても構いません。
メールが送信されるか確認するテストコードを追記していきます。
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で会員登録完了メールを送る方法[後編]