Mailableでのメール送信を書く(Laravel)

2 min read読了の目安(約2600字

今回はLaravelでメール送信といえば頻繁に出てくるMailableでのメール送信のやり方と、そのテストの書き方について解説していきます!

mailableでメールを送信する

今回はお問い合わせのメール送信APIを作成していきます。

1. ルーティング

api.php にお問い合わせメール送信APIのルーティングを記述します。

↓ルーティングもLaravel8でいろいろ変わったので、お使いのバージョンに合ったように記述してください。

Route::post('contact', 'App\Http\Controllers\Api\ContactController@sendContactMail');

2. Controllerを作成する

このコマンドを実行します。

php artisan make:Controller Api/ContactController

3. Mailableクラスを拡張してメールを作成する

このコマンドを実行します。

php artisan make:Mail ContactMail

app/Mail/ContactMail.php というファイルができます。こちらのファイル内を書き換えていきます。

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class ContactMail extends Mailable
{
    use Queueable, SerializesModels;

    public $content;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(string $content)
    {
        $this->content = $content;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from('******@example.com') // 送信元
        ->subject('お問い合わせ完了のお知らせ') // メールタイトル
        ->view('emails.contact') // どのテンプレートを呼び出すか
        ->with(['content' => $this->content]); // withオプションでセットしたデータをテンプレートへ受け渡す
    }
}

4. メールの本文を定義する

メールの本文を定義していきます。

先程の↓の部分で emails.contact と書いていますが、これはviewsディレクトリ配下の emails ディレクトリの中の contact.blade.php を呼び出すという意味です。

        ->view('emails.contact') // どのテンプレートを呼び出すか

なので、 resources/views/emails/contact.blade.php を作成していきます。
こちらは現在はとてもシンプルにしていますが、サービス開発とかになると、もうちょっとちゃんと作り込んであげてください。bladeなのでテンプレを作って@extendで拡張することもできますし、cssをあてて華やかに見せることもできます。

<p>
  下記の内容でお問い合わがありました!!!!わーーーい!!<br>
</p>


<p>
  <br>
  【お問い合わせ内容】<br>
  {{ $content }}<br>
</p>

5. Controllerにメール送信のロジックを書く

ここでようやくメール送信のロジックを書いていきます。

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use App\Mail\ContactMail;

class ContactController extends Controller
{
    public function sendContactMail(Request $request)
    {
        $content = $request->input('content'); 
        $user = auth()->user();
	
	Mail::to($user->email)->send(new ContactMail($content));
	
	.
	.
	.
	// メール送信後の処理
	
    }
}

5. 最後にリクエストを送ってみる

/contact に対してPOSTで、パラメータは「content」でリクエストを送るとメール送信することができます。

メール設定をした上で試してみてください。

終わりに

今回はお問い合わせ送信を例にメール送信してみました。

続きのメール送信の結合テストも執筆中なので、そちらもお楽しみに!