Laravelでメール送信機能をつける方法
Laravel 5.7でメール送信機能をつける方法を説明します。
今回は、コンテンツが投稿されたと同時にメールが送信されるような機能を想定しています。
今回やること
・Mailtrap登録
・Mailable クラスを作成
・Controllerの修正(メール送信ロジック追記)
・メールテンプレート作成
前提
・Laravelが動く環境がすでにあること
・こちらの記事で作成した投稿フォームを利用
(またはすでに投稿フォーム存在すること)
・Laravel のバージョンは5.7
それでは始めます。
--- 🖥 ---
メール送信設定
メールを送信するためには、 SMTP サーバーの設定が必要になります。
今回はテスト用のメール送信サービス『Mailtrap』を利用します。
こちらからアカウント登録をお願いします。
(Google アカウント、またはGitHubアカウントから登録可能です)
ログインすると、下記のような画面が表示されます。
「Demo Inbox」をクリックすると、SMTP接続情報が確認できます。
こちらを.evnファイルに記載します。(↑のUsernameとPasswordをメモしておいてください。)
.envファイルを開き、下記のように記載します。
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=先ほどメモしたUsername
MAIL_PASSWORD=先ほどメモしたPassword
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=test@example.com
MAIL_FROM_NAME=テストメール
こちらでメール送信設定完了です。
Mailable クラスを作成する
メールを利用するためにはMailable クラスを作成する必要があります。下記実行しMailable クラスを作成します。
今回はPostSentというクラス名にします。
php artisan make:mail PostSent
すると、『/app』配下にMailというディレクトリが作成され、PostSent.phpというファイルが作成されます。今回は下記のように修正します。
<?php
namespace App\Mail;
use App\Models\Post;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class PostSent extends Mailable
{
use Queueable, SerializesModels;
public $title;
public $data;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($user, $post)
{
$this->user = $user;
$this->post = $post;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->markdown('emails.posts.sents')
->subject('メール送信します')
->with($this->data);
}
}
メールテンプレート用bladeファイルを作成する
次にメールテンプレート用のbladeファイルを作成します。
テンプレートは先ほど書いたコードの
return $this->markdown('emails.posts.sents')
の箇所で指定しています。
今回は『resources/views/emails/posts』ディレクトリを作成し、『sents.blade.php』というファイルを作成します。
『sents.blade.php』は下記のようにします。
@component('mail::message')
#{{ $user->name ? $user->name : '' }}さん
@component('mail::panel')
{!! nl2br( $post->content ) !!}
@endcomponent
@endcomponent
コントローラーにメール送信のロジックを追記します。
今回はpost投稿時にメールを送信するようにしますので、『app/Http/Controllers/PostController.php』に下記のように修正します。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Post;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests\CreatePost;
// 追加
use Illuminate\Support\Facades\Mail;
use App\Mail\PostSent;
class PostController extends Controller
{
public function showCreateForm()
{
return view('posts/create');
}
public function create(CreatePost $request)
{
// Postモデルのインスタンスを作成する
$post = new Post();
// タイトル
$post->title = $request->title;
//画像アップロード
$time = date("Ymdhis");
$post->image_url = $request->image_url->storeAs('public/post_images', $time.'_'.Auth::user()->id . '.jpg');
//コンテンツ
$post->content = $request->content;
//登録ユーザーからidを取得
$post->user_id = Auth::user()->id;
// インスタンスの状態をデータベースに書き込む
$post->save();
// 追加
$user = Auth::user();
Mail::to($user)->send(new PostSent($user, $post));
//「投稿する」をクリックしたら投稿情報表示ページへリダイレクト
return redirect()->route('posts.detail', [
'id' => $post->id,
]);
}
/**
* 詳細ページ
*/
public function detail(Post $post)
{
return view('posts/detail', [
'title' => $post->title,
'content' => $post->content,
'user_id' => $post->user_id,
'image_url' => str_replace('public/', 'storage/', $post->image_url),
]);
}
}
まず、下記追加します。
// 追加
use Illuminate\Support\Facades\Mail;
use App\Mail\PostSent;
また、saveとredirectの間にメール送信のロジックを追加しています。
// 追加
$user = Auth::user();
Mail::to($user)->send(new PostSent($user, $post));
以上です。
メール送信テスト
それではpostを投稿してメールが送信されるか確認します。
post画面を開きます。
フィールドに記入し投稿します。
投稿後mailtrapを確認すると、メールが送信されていることが確認できます。
以上で対応完了です。お疲れ様でした。
GitHubリポジトリ
今回作成したソースはGithubにて公開しています。下記リンクよりご確認ください。(lerning-6ブランチです。)
https://github.com/KoushiKagawa/laravel-learning/tree/learning-6
間違いや、もっとこう書いた方が良いよ!といったご指摘はコメント欄かtwitterのDMいただけると喜びます!
読んでいただきありがとうございます。