Laravel8 メール送信をやってみよう

| 対象となる方

  • Laravel を学習されている方(初学者の方でも大丈夫です!)
  • Laravel からSMTP経由のメールを送信する方法が知りたい方
  • Mailtrap を使ってテスト送信を確認したい方

| 環境構築

今回は基本的にメールを送信するだけなので、データベースを必要としません。なので、PHPが使える環境であればどの場所に設置していただいても構いません。ビルトインサーバーというものでプログラムを動かそうと思います。
例としてデスクトップに構築しますね。cd Desktopでデスクトップに移動します。その後、send-mailというプロジェクト名でLaravelをインストールします。

composer create-project --prefer-dist laravel/laravel send-mail "8.*"


2021年4月現在、Laravel の最新バージョンは8なので"8.*"を記入しなくても最新のものが入ります。
インストールが完了したら1度LaravelのTOP画面を見ておきましょうcd send-mail でプロジェクト内に入り、php artisan serve でサーバーを起動してください。起動が完了すると、URLが指定される(おそらくhttp://127.0.0.1:8000)と思いますので、そこにアクセスするとTOP画面が見れると思います!

| では開発していきましょう!

Mailtrapアカウントの作成と設定ファイル

開発の前に、今回はMailtrap というサービスを使ってメール送信テストを行いますので、Mailtrapのアカウントを作成しておいてください。
アカウントが作成できましたら、下の画像のようにDemoInboxというところから、「Laravel 7+」を選択し、環境変数をまるっとコピーしてLaravelプロジェクト内にある.env ファイルのMAILの設定部分に貼り付けてください。これでMailtrapを使ってのメール送信環境が整いました!

Mailableクラスの作成、メールテンプレートの作成

今回は、簡易的にメールの送信を行いたいと思いますので、ModelやControllerを作成せず、ルーティングファイル内(routes/web.php)で書いてしまいます(こういう事をする開発現場はないかと思いますが…ご容赦を…)。
まずはメールを送信するための諸々の設定や操作を担当する Mailable クラスの作成をおこなっていきましょう!プロジェクト内ターミナル上で以下のコマンドを叩いてください!

php artisan make:mail MailTest

今回はMailTest という名前で生成しました!どこに生成されたかというとapp ディレクトリの中にあるMail ディレクトリ内にあります!早速開いて確認してみましょう!中には以下のように2つのファンクションが書かれています。

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('view.name');
    }

__construct() は、このMailTestクラスが生成された時に呼び出されるファンクションで、メールの文面などで使いたいデータの設定を事前にしておくことができます。(例:お問い合わせフォームなど入力された内容などをメールの文面に記述し、「以下の内容で受け付けました」のような内容で送信したい時)

build() はその字の如し、メールを構築するファンクションです。初期の生成時に$this->view('view.name') と記述されていますが、これは、テンプレートの指定はこうやってやりますよ!というサンプルです。実際にはresourcesディレクトリ内のviewsディレクトリ内にemailsディレクトリなどを作成し、その中にbladeテンプレートを作成してメールのテンプレート管理を行います。(実際に後ほどやります!)

では、メール送信機能の構築をおこなっていきましょう!
先程の__construct() ファンクションとbuild() ファンクションを以下のように変更してください!

<?php

namespace App\Mail;

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

class MailTest extends Mailable
{
    use Queueable, SerializesModels;

    public $mail_text;

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

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from('from_address@example.com')
                    ->view('emails.test')
                    ->subject('メールテストタイトル');
    }
}

次にメールのテンプレートを作成します。先ほども少し触れましたが、resourcesディレクトリ内のviewsディレクトリ内にemailsディレクトリを作成し、その中にtest.blade.phpファイルを作成してください。(ややこしいですが、作る場所大事 resources→views→emails→test.blade.php )
で作成した blade ファイル内を以下のように書いてください。

↓このしたのテキストは動的に取得↓<br>
{{ $mail_text }}<br>

↓ここから下は固定の文書↓<br>
このような文面でメールを送信しますよ!

これで送信する準備はできました!次のセクションで実際に送信テストをやっていきましょう!

メール送信テスト

では、メールの送信をするためのルーティングを確保していきましょう!routesディレクトリ内にあるweb.phpに以下のようにコードを追記してください。

<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Mail;
use App\Mail\MailTest;

Route::get('/', function () {
    return view('welcome');
});

Route::get('/mail', function () {
    $mail_text = "メールテストで使いたい文章";
    Mail::to('to_address@example.com')->send(new MailTest($mail_text));
});

これで準備はできました。ブラウザで /mail にアクセスするとメールが送信されるようにしていますので、アクセスして見てください。その後真っ白な画面になりますので、Mailtrapのサイトの方に移動すると送信内容が確認できると思います。
今回は以上になります。その他、アレンジは色々できるかと思いますので、公式サイト の確認をしながら開発をしてみてください!!

よかったらシェアしてね!

この記事を書いた人

Web Developer / Educator