やりたいこと
Laravelでメール送信機能を実装する方法について記載します。
コントローラーで作成したメーラーを呼び出し、メールテンプレートにデータを反映させて送信する。
例として、ContactController
というコントローラーがあり、お問い合わせ機能のようなものがあったとして、進めます。
環境
- PHP 7.1
- Laravel 5.6
参考
MailtrapでLaravelの簡単メール送信テストこちらを参考にメール送信機能を実装し、テストメールを送ることをゴールとします。
@ubonsa さんわかりやすい記事をありがとうございます
以下の内容は上記記事でMailtrapのアカウント作成が終わり、.env
ファイルも書き換えていることが前提となります。
1. ContactController
フォームがあり、送信ボタンがあると、store
アクションが実行されると仮定します。
送られてくるパラメーターは以下とします。
送信者 | メールアドレス | 内容 |
---|---|---|
name | body |
ContactController
public function store(Request $request){
// フォームからのリクエストデータ全てを$contactに代入
$contact = $request->all();
}
2. メールクラスを作成
$ php artisan make:mail ContactMail
上記コマンドを実行すると、app/Mail
にContactMail.php
ファイルが作成されます。
app/Mail/ContactMail.php
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class ContactMail 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');
}
}
3. ContactMail.phpを編集
フォームから受け取ったリクエストデータをテンプレート内で展開させたいので、ContactMail.php
を編集します。
app/Mail/ContactMail.php
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class ContactMail extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
// 引数で受け取ったデータ用の変数
protected $contact;
public function __construct($contact)
{
// 引数で受け取ったデータを変数にセット
$this->contact = $contact;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this
->from('hoge@hoge.com') // 送信元
->subject('テスト送信') // メールタイトル
->view('contact.mail') // どのテンプレートを呼び出すか
->with(['contact' => $this->contact]); // withオプションでセットしたデータをテンプレートへ受け渡す
}
}
4. テンプレートを作成
->view('contact.mail')
と上記で定義を行なったのですが、これはresources/views
からのパスとなっているので、resources/views/contact/mail.blade.php
というようにファイルを作成します。
こんにちわ{{$contact->name}}さん
問い合わせ内容は以下で受け取りました
{{$contact->body}}
5. ContactControllerを編集
// 作成したメールクラスをuseする
use App\Mail\CotactMail;
use Illuminate\Support\Facades\Mail;
public function store(Request $request){
// フォームからのリクエストデータ全てを$contactに代入
$contact = $request->all();
Mail::to($contact->email)
->send(new ContactMail($contact)); // 引数にリクエストデータを渡す
}
自分の環境下では
use Illuminate\Support\Facades\Mail;
を加えています。
以上で、フォームからメール送信を行えばリクエスト内容を反映させたメール送信機能が出来るかと思います。