LoginSignup
46
48

More than 3 years have passed since last update.

Laravel5.6 メール送信機能の作成方法

Last updated at Posted at 2018-07-17

やりたいこと

Laravelでメール送信機能を実装する方法について記載します。
コントローラーで作成したメーラーを呼び出し、メールテンプレートにデータを反映させて送信する。

例として、ContactControllerというコントローラーがあり、お問い合わせ機能のようなものがあったとして、進めます。

環境

  • PHP 7.1
  • Laravel 5.6

参考

MailtrapでLaravelの簡単メール送信テストこちらを参考にメール送信機能を実装し、テストメールを送ることをゴールとします。
@ubonsa さんわかりやすい記事をありがとうございます:bow_tone2:

以下の内容は上記記事でMailtrapのアカウント作成が終わり、.envファイルも書き換えていることが前提となります。

1. ContactController

フォームがあり、送信ボタンがあると、storeアクションが実行されると仮定します。
送られてくるパラメーターは以下とします。

送信者 メールアドレス 内容
name email body

ContactController

public function store(Request $request){
  // フォームからのリクエストデータ全てを$contactに代入
  $contact = $request->all();
}

2. メールクラスを作成

$ php artisan make:mail ContactMail

上記コマンドを実行すると、app/MailContactMail.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)); // 引数にリクエストデータを渡す
}

自分の環境下ではMailファサードがnot foundとエラーとなったので、use Illuminate\Support\Facades\Mail;を加えています。

以上で、フォームからメール送信を行えばリクエスト内容を反映させたメール送信機能が出来るかと思います。

46
48
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
48