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

2016.05.19

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時間ほど・・。メール送信処理、いつも何かしら躓いている気がします。

関連する記事

CATEGORY

ARCHIVE

NEW