【Laravel】viewを指定しない簡易的なメールの送信方法【Mail::raw】

Laravelでの簡易的なメール送信方法について

Laravelの基本的なメール送信方法

ここではLaravel9での試みであったため、Laravel8以前で使用してきたSwift Mailerから、Laravel9以降で用いるSymfony Mailerを導入してから行います。最初からLaravel9で始める方は、下記コマンドについては飛ばしてください。

下記コマンドを実行してライブラリを入れておきましょう。

$ composer require symfony/mailgun-mailer symfony/http-client

まずは、よくある簡易送信方法が下記のようなコードになります。

どこにでもある、よく紹介されるような例です。

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class SendMailController extends Controller
{
    public static function exampleSendMail($data = "")
    {
        Mail::raw($data, function ($message) {
            $message->to('mail@example.com')->subject('ここにメールタイトル');
        });
        return;
    }
}

冒頭付近の「use Illuminate\Support\Facades\Mail;」でLaravelが備えているファサードを呼び出し、viewを使用しない簡易的なメール送信のメソッド「Mail::raw」を用いるのがポイントです。ちなみにviewを使用する場合は、「Mail::send」を用いて引数にviewを指定します。

ここまでは本当によくある「いかかがでしたでしょうか!?」的な技術ブログでよく見るやつです(笑)

Mail::rawのメールタイトルやメールアドレスを変数で操る

ここからは中々検索に見つからずに、以前何人かに実際に質問された内容の答えをざっくりとご紹介します。

先ほどの「'mail@example.com'」や「'ここにメールタイトル'」の部分を変数にして、動的に値がセットされるようにするにはどうしたらいいのか。そのまま変数にしてしまうとエラーになってしまいます。既に作法を知っている方ならば直ぐに答えがわかるでしょうが、とりあえずここは勿体ぶらずに下記にコードを示しておきます。

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class SendMailController extends Controller
{
    public static function exampleCustomSendMail($dataArray = array()){
        $res = FALSE;
        if (
            Mail::raw($dataArray['message_data'], function ($message) use($dataArray){
                $message->to($dataArray['email'])->subject($dataArray['subject']);
            })
        ) {
            $res = TRUE;
        }
        return $res;
    }
}

ポイントは「use($dataArray)」でメソッド内に引き継ぐところです(※グローバルなスコープで対応する方法もあります)。

実際の使い方として、この「exampleCustomSendMail」を呼び出すところで、事前に下記のように「$dataArray」の引数配列にデータをセットしておきます。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\SendMailController;

class ContactController extends Controller
{

    // 一部省略

    public function contactRequest(Request $request){
        $resArray = array();

        // 一部省略

        $dataArray['message_data']  = "送信内容(例:$request->data)";
        $dataArray['email']         = "送信者のメールアドレス(例:$request->email)";
        $dataArray['subject']       = "メールタイトル(例:$request->subject)";

        $res = SendMailController::exampleCustomSendMail($dataArray);
        if ($res == FALSE) {
            // 送信エラー時
            $resArray['err'] = "送信エラーだよ!";
        } else {
            // 送信成功時
            $resArray['res'] = "送信成功だよ!";
        }
        return json_encode($resArray);
    }

}

別のコントローラーからメソッドを呼び出す際は上記のように冒頭付近にて「use App\Http\Controllers\SendMailController;」として、実行箇所にて「SendMailController::exampleCustomSendMail」のようにします。

補足ですが、メールのレスポンスエラーチェックのためにLaravel8以前で使えた「Mail::failures()」がありましたが、Laravel9では使えなかったので、急遽if文の条件の中に「Mail::raw」を仕込んで成功または失敗を返すようにしました。

以上、Laravelの簡易的なメール送信方法についてでした。

About Naoki 24 Articles
デザインを含めたフロントエンドから、インフラ含めたバックエンドまで広く浅く活動しているエンジニアです。主にSaasの開発・営業・運営管理などをしております。毎日デスマーチがモットーなブラックエンジニアです。 私が管理しているクラウドソフトウェアがこちらです→まとめツール倶楽部『MTCsystem』

Be the first to comment

Leave a Reply

Your email address will not be published.


*


CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)