見出し画像

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いただけると喜びます!


読んでいただきありがとうございます。