Laravel5で入力フォームの内容を使ったメール送信を試す

Laravelのメール送信でハマりました。同じミスをしないために、Laravelでのメール送信方法をメモしておきます。

各バージョン

  • XAMPP 3,2,1
  • PHP 5.6.12
  • Laravel 5.2.29

 

Laravelでメール送信

最終的に作りたい物は「お問い合わせフォーム」です。

なのですが、いきなりアレコレしようとして混乱、時間を無駄にしました。千里の道も一歩から。急がば回れ。まずは最低限の設定のみでメール送信を試してみます。

宛先・本文をベタ書きでメール送信

宛先、タイトル、本文をベタ書きしてメールを送信してみましょう。

ルート設定

 // app/Http/routes.php

Route::get('mail','MailController@sendMail');

コントローラでメール送信処理を実装

// app/Http/Controllers/MailController.php

public function sendMail(){
	$data = [];
	Mail::send(['text' => 'mail.temp'], $data, function($message){ 
		$message->to("maillアドレス")->subject("タイトル");
	});
	return view('mail.complete');
}
Mail::send(ビューの名前,データの配列,無名関数)
第一引数(ビューの名前)
ビューを指定します。このビューの内容がメール本文になります。テキストメールを送信したいので記述は[‘text’ => ‘ビューの名前’]になります。
第二引数(データの配列)
ビューへ渡すデータ配列を指定します。今回は特に使わないので空の配列です。
第三引数(無名関数)
オプションを指定できます。メール送信先(TO)とタイトル(SUBJECT)を指定しています。

メール本文に使うビューを作成

// resources/views/mail/temp.blade.php

テストメール:本文

メール送信完了画面を作成

// resources/views/mail/complete.blade.php



<div>


<h1>メール送信完了!</h1>


</div>

以上で設定は完了です。

メールを送信するため「http:// ドメイン /mail」を表示すると、無事に宛先へメールが送られました。
※「index.blade.php」が無い状態でもメール送信出来ました。

躓きポイント
・メールの設定ミスが複数あった→「/config/database.php」「.env」の設定を確認
・SMTPのポート番号の指定ミス
・Google設定ミス→「2段階認証プロセス」が有効になっていた為エラーになっていた

Googleメールを使ってメール送信テストを行ったのですが、ポート番号だー認証方式だー、で結構ハマりました。幸いGoogleメールに関する情報はネット上にゴロンゴロン転がっているので、エラーが出ても検索すれば何かしら情報が得られるのが救いでした。

入力フォームの内容を使ったメール送信

続いて今回の本命、お問合せフォームの内容を使ったメールの送信を行いたいと思います。

メールの宛先は入力されたメールアドレス、メール本文に入力された内容を出力します。

ルート設定の内容を変更

 // app/Http/routes.php

Route::get('mail','MailController@index');  // 新規追加
Route::post('mail','MailController@sendMail');  // getをpostに変更

入力フォームを作成

// resources/views/mail/index.blade.php

{!! Form::open(array('files' => true)) !!}


<div>
	{!! Form::label('title', '件名:') !!}
	{!! Form::text('title') !!}
</div>


<div>
	{!! Form::label('email', 'メールアドレス:') !!}
	{!! Form::email('email') !!}
</div>


<div>
	{!! Form::label('body', 'ご質問内容:') !!}
	{!! Form::textarea('body') !!}
</div>


<div>
	{!! Form::submit("Send") !!}
</div>


{!! Form::close() !!}

メール本文に使うビューの内容を変更

// resources/views/mail/temp.blade.php

以下のお問い合わせがありました。
件名:{{$title}}
メールアドレス:{{$email}}
ご質問内容:{{$body}}

コントローラの内容を変更、処理を追加

// app/Http/Controllers/MailController.php

public function index(){
    return view('mail.index');
}

public function sendMail(Request $request){
	$data = $request->all();
	Mail::send(['text' => 'mail.temp'], $data, function($message) {
		$message->to($data["email"])->subject($data["title"]);
	});
	return view('mail.complete');
}

以上で設定は完了です。入力フォームに情報を入力して「Send」ボタンを押します。すると…

ErrorException in ContactController.php line 10:
Undefined variable: data

エラーが出ました。「data」ってなんやねん!そんなん知らんで!と怒られているようです。

こちらのサイトを参考にコントローラを以下のように修正しました。

// app/Http/Controllers/MailController.php

public function index(){
    return view('mail.index');
}

public function sendMail(Request $request){
	$data = $request->all();
	Mail::send(['text' => 'mail.temp'], $data, function($message) use($data){ // useを追加
		$message->to($data["email"])->subject($data["title"]);
	});
	return view('mail.complete');
}

修正して、再度送信を試します。

無事、入力されたメールアドレスに対してメールの送信を確認できました。

躓きポイント
・ルート設定の『host』『get』が間違ってた
・useを忘れると怒られる
・リクエスト(入力内容)の取得方法が何種類かあって混乱する

以上、Laravel5でのメール送信処理でした。
意外と時間が掛かりました。約3時間ほど・・。メール送信処理、いつも何かしら躓いている気がします。

新着記事

最新の記事

アーカイブ

トップへ戻る