はじめに
備忘録として、メール送信機能の実装方法についてまとめた
開発環境
Laravel 8
Laravel-permission
※宛先判定のため、Laravel-permissionパッケージを導入
実装したいこと
ブラウザ上で送信したい本文を入力し、指定する宛先に送信する
環境構築
.envファイルにメールサービスの設定を追加する。
.env
#Gmailを使用する例
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your_email@gmail.com
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=from@example.com
MAIL_FROM_NAME="${APP_NAME}"
Markdown Mailableクラスの作成
Mailableクラスを作成
同時にMarkdownを使用することを指定する
bash
php artisan make:mail SendEmail --markdown=emails.notification
App\Mail\SendEmail.php とresources/views/emails/notification.blade.php が作成される
入力ページの作成
作成されたresources/views/emails/notification.blade.phpに、宛先の選択と本文を入力できるように記述する
notification.blade.php
<form action="/send-notification" method="post">
@csrf
<div>
<p>宛先</p>
<select name="destination">
<option value="all">全員</option>
<option value="user">ユーザー</option>
</select>
</div>
<div>
<p>本文</p>
<textarea name="message"></textarea>
</div>
<div>
<button type="submit">メール送信</button>
</div>
</form>
Mailableクラスの編集
SendEmail.php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendEmail extends Mailable
{
use Queueable, SerializesModels;
public $details;
public function __construct($user,$message)
{
$this->user = $user;
$this->message = str_replace("\n","\n",$message);
}
public function build()
{
return $this->subject('メールのタイトル')
->markdown('emails.notification')->with('[message => $this->message]';
}
}
Markdown ビューの編集
resources/views/emails/notification.blade.phpを編集し、Markdown形式でメールの内容を記述する
notification.blade.php
@component('mail::message')
# タイトル
{{ $message }}
@component('mail::button', ['url' => ''])
Button Text
@endcomponent
Thanks,<br>
{{ config('app.name') }}
@endcomponent
メール送信機能の処理
メール送信機能の処理をControllerに記述する
Controller
use App\Mail\Notification;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use Spatie\Permission\Models\Role;
public function sendNotification(Request $request) {
$destination = $request->input('destination');
$message = $request->input('message');
if ($destination === 'all') {
$users = User::all();
} elseif ($destination === 'user') {
#rolesを持っていないuserを取得
$users = User::doesntHave('roles')->get();
}
foreach ($users as $user) {
Mail::to($user->email)->send(new Notification($user, $message));
}
return back();
}