
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の簡易的なメール送信方法についてでした。


Be the first to comment