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