Webアプリケーションで会員登録完了時やパスワードリセット時などの際にメールを送信するといった機能がよく利用されています。
最近ではメール送信機能が全くないWebアプリケーションの方が珍しいのではないでしょうか?
メール送信機能を実装するには一見ハードルが高そうに思えますが、Laravelではメール送信機能を実装するための仕組みがあるので、実際にはすごく簡単に実装することができます。
この記事ではメール送信機能を実装する方法を紹介していきます。
Mailableクラスを使って、メール送信
まずはLaravelのMailableクラスを継承したクラスを作成して、メール送信機能を実装していきましょう。
後述で説明するMailファサードを利用した実装方法より、こちらのMailableクラスを使った実装方法が一般的なようです。
また、メール送信の処理をコントローラーやサービスクラスとはまた別ファイルで実装していくのでこちらの実装方法の方がコードの見通しが良くなったり、共通化して使い回すことができるので筆者もお勧めします。
Mailableクラスを作成
下記コマンドでMailableクラスのファイルを生成します。
$ php artisan make:mail TestMail
appディレクトリ直下にMailディレクトリが作成されて、その中にTestMail.phpファイルが作成されています。
TestMail.phpには下記のように実装します。
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class TestMail extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($name, $email)
{
$this->name = $name;
$this->email = $email;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->to($this->email)
->subject('テストタイトル')
->view('test.mail')
->with([
'name' => $this->name,
]);
}
}
コンストラクタで事前にメール送信に必要な情報を設定します。今回はメール送信する相手の名前とメールアドレスをコンストラクタで設定しています。
buildメソッドに実際のメール送信処理を記述していきます。
戻り値として該当のインスタンスを返します。そのインスタンスに対して、メソッドチェーン形式で必要な情報を設定していきます。
toメソッドでは送信先のメールアドレス、subjectメソッドではメールのタイトルを設定しています。
viewメソッドではメール本文のテンプレートを記述したbladeファイルを指定します。後ほどbladeファイルは作成していきます。
withメソッドで、bladeファイルで使用する変数を指定することもできます。
メール本文用のbladeファイルの作成
次にメール本文のテンプレートを定義したbladeファイルを作成します。
{{ $name }}さん
テストメールの本文です。
Mailableクラスのbuildメソッドの中のwithメソッドで指定した$name変数をbladeファイルの中で使用することができます。
コントローラーでメールを送信
では最後に、コントローラーの中でMailableクラスを利用してメール送信機能を実装しましょう。
ルーティングの設定を行います。
Route::get('/mail/send', 'MailController@send');
コントローラーではシンプルなメール送信処理を実装しています。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Mail\TestMail;
class MailController extends Controller
{
public function send(Request $request)
{
$name = 'テスト ユーザー';
$email = 'test@example.com';
Mail::send(new TestMail($name, $email));
return view('welcome');
}
}
送信先の名前やメールアドレスは本来であればフォームなどからのリクエストの値やデータベースに登録されているユーザー情報に関するテーブルからのデータの値などを使用することが一般的ですが、今回は簡単に文字列リテラルで定義した値を使用しています。
メール送信処理はMailファサードを利用します。
sendメソッドの引数には先ほど定義したTeseMailクラスのインスタンスを渡してあげます。
たったこれだけでメール送信機能を実装することができます。
Mailableクラスを使わずMailファサードのみでメール送信
ここではMailableクラスを使わず、Mailファサードのみを使ってメール送信を実装してみたいと思います。
サクッとメール送信機能を実装したい場合にはこちらのやり方でも良いですね。
ルーティングは下記のように設定しています。
Route::get('/mail/sendMail', 'MailController@sendMail');
コントローラーでMailファサードを使って、メール送信処理を実装します。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
class MailController extends Controller
{
public function sendMail(Request $request)
{
$name = 'テスト ユーザー';
$email = 'test@example.com';
Mail::send('test.mail', [
'name' => $name,
], function ($message) use ($email) {
$message->to($email)
->subject('テストタイトル');
});
return view('welcome');
}
}
Mailableラクスを使用したときと同様にMailファサードのsendメソッドを利用してメール送信を行います。
第1引数には、メール本文のテンプレートを定義したbladeファイルを指定します。
第2引数には、bladeファイルで使用する変数を連想配列の形式で指定します。
第3引数には、メール送信処理をクロージャーの中で定義していきます。
クロージャーは$messageが引数で渡ってくるので$messageに対してtoメソッドに送信先メールアドレスとsubjectメソッドにメールのタイトルをメソッドチェーンで定義してあげます。
メール送信機能の実装は以上です。
MailHogを使って、メール送信の動作確認
メール送信機能の実装が完了したので、メール送信が行えているか動作確認してみましょう。
このままメール送信を実行しても下記のようなエラー画面となって、メール送信を行うことができません。
SMTPサーバーやメールツールを準備していないためにエラー画面となるのです。
ここではMailHogというツールを使って、動作確認を行います。
MailHogでは実際にメール送信を行うのではなく、メール送信が行われた内容を確認することができます。実際にメールは送信されないので、開発環境でも安心してメール送信の動作確認を行うことができます。
mailhogコンテナの起動
Laradockを使っている場合はコンテナ起動時にmailhogを指定してあげるだけでMailHogが使えるようになります。
$ docker-compose up -d nginx mysql phpmyadmin mailhog
Laradockを使った開発環境の構築方法は下記の記事で紹介しているので、ぜひ参考にしてみてください。
.envファイルの修正
mailhogコンテナを起動したら、LaravelでMailHogを利用できるように.envファイルを修正します。
MAIL_MAILER=smtp
MAIL_HOST=mailhog # ホスト
MAIL_PORT=1025 # ポート番号
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=from@example.com # 送信元メールアドレス
MAIL_FROM_NAME="${APP_NAME}"
MailHogを使用するには、3つの項目を修正します。
MAIL_HOSTにはホストとしてmailhogを指定します。
MAIL_PORTにはポート番号の1025を指定します。
MAIL_FROM_ADDRESSにはメールを送信した際の送信元メールアドレスを指定します。
MailHogを利用するための準備はこれだけです。
ブラウザで確認
それでは実際にメール送信が行えているか動作確認をしていきましょう。
実装したメール送信機能を実行してから、MailHogの画面を確認していきましょう。
MailHogの画面はlocalhost:8025にアクセスすることで確認することができます。
すると、送信されたメールが「メール送信元の名前」「メール送信元のメールアドレス」「メールタイトル」の一覧で表示されているのが、確認できます。
リストをクリックすると、詳細が表示されてメール本文を確認することができます。
無事に実装したメール送信機能が動作していることが確認できましたね。
まとめ
Laravelでメール送信機能を実装する方法を紹介してきました。
Laravelの仕組みを利用すればとても簡単にメール送信機能を実装することができましたね。
冒頭でも説明したように、メール送信機能を実装しているWebアプリケーションは非常に多いので、ぜひこの記事を参考にして実装できるようにしておきましょう。