Mailables

ตัวอย่าง Code ในการ Send Email โดยทำ Template Email ของแต่ละ Status เก็บไว้ใน Database พร้อมทั้งดึงข้อมูลจาก Template ส่งไปทาง Email ด้วย

1️⃣ Database Migrations

create_envelopes_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('envelopes', function (Blueprint $table) {
            $table->id();
            $table->string('subject');
            $table->text('body');
            $table->enum('type', ['user', 'admin']);
            $table->boolean('is_sendmail');
            $table->unsignedBigInteger('status_id');
            $table->foreign('status_id')->references('id')->on('statuses');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('envelopes');
    }
};
create_statuses_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('statuses', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('user');
            $table->string('notes');
            $table->string('description');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('statuses');
    }
};

2️⃣ Model

Models/Envelopes.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Envelopes extends Model
{
    use HasFactory;

    protected $fillable = [
        'subject',
        'body',
        'type',
        'is_sendmail',
        'status_id',
    ];
}
Models/Status.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Status extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
        'user',
        'notes',
        'description'
    ];
}

3️⃣ Mailable Class

Mail/UserEmail.php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
use App\Models\Envelopes;
use App\Models\Statuses;

class UserEmail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     */
    public function __construct($status_id)
    {
        $data = Envelopes::join('statuses', 'envelopes.status_id', '=', 'statuses.id')->where('envelopes.id', $status_id)->select('envelopes.*', 'statuses.name as status_name')->first();
        $this->subject = $data->subject;
        $this->body = $data->body;
        $this->status = $data->status_name;
    }

    /**
     * Get the message envelope.
     */
    public function envelope(): Envelope
    {
        return new Envelope(
            subject: 'NIDA: ' . $this->subject,
        );
    }

    /**
     * Get the message content definition.
     */
    public function content(): Content
    {
        return new Content(
            markdown: 'emails.user',
            with: ['subject' => $this->subject, 'body' => $this->body, 'status' => $this->status]
        );
    }

    /**
     * Get the attachments for the message.
     *
     * @return array<int, \Illuminate\Mail\Mailables\Attachment>
     */
    public function attachments(): array
    {
        return [];
    }
}

4️⃣ Controller

SendmailController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Mail\UserEmail;
use App\Models\Envelopes;

class SendmailController extends Controller
{
    public function update($email, $id, $status_id)
    {
        $envelope = Envelopes::find($status_id);

        $envelope->is_sendmail == 1 ? Mail::to($email)->send(new UserEmail($status_id)) : '';
        return True;
    }
}

5️⃣ View

views/emails/user.blade.php
<x-mail::message>
# สถานะ: {!! $status !!}<br>
# {!! $subject !!}<br>

เรียน ({{ Auth::user()->name }})

{!! $body !!}

<x-mail::button :url="'https://nida.ac.th/'">
Link
</x-mail::button>

<hr>

ขอแสดงความนับถือ<br>
สถาบันบัณฑิตพัฒนบริหารศาสตร์<br>
https://idt.nida.ac.th/<br>
0 2727 3777, 0 2727 3778<br>

</x-mail::message>

Last updated