0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

備忘録:メール送信機能の実装(Laravel8)

Posted at

はじめに

備忘録として、メール送信機能の実装方法についてまとめた

開発環境

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.phpresources/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();
}

以上

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?