Mailable classes help you send emails easily by organizing email content and settings in one place.
Mailable classes in Laravel
Start learning this pattern below
Jump into concepts and practice - no test required
php artisan make:mail ClassName // Inside the Mailable class public function build() { return $this->view('emails.example') ->with(['key' => 'value']) ->subject('Email Subject'); }
Use php artisan make:mail to create a new Mailable class.
The build method defines the email content, view, and subject.
<?php namespace App\Mail; use Illuminate\Mail\Mailable; class WelcomeMail extends Mailable { public function build() { return $this->view('emails.welcome') ->subject('Welcome to Our Site'); } }
<?php namespace App\Mail; use Illuminate\Mail\Mailable; class OrderShipped extends Mailable { public $order; public function __construct($order) { $this->order = $order; } public function build() { return $this->view('emails.shipped') ->with(['order' => $this->order]) ->subject('Your Order Has Shipped'); } }
This example shows a Mailable class that sends a notification email with dynamic content passed through the constructor. The email view receives the content to display.
<?php namespace App\Mail; use Illuminate\Mail\Mailable; class NotificationMail extends Mailable { public $messageContent; public function __construct($messageContent) { $this->messageContent = $messageContent; } public function build() { return $this->view('emails.notification') ->with(['content' => $this->messageContent]) ->subject('Important Notification'); } } // Usage example in a controller or route: use App\Mail\NotificationMail; use Illuminate\Support\Facades\Mail; $message = 'Hello! This is a test notification.'; Mail::to('user@example.com')->send(new NotificationMail($message));
Always create a Blade view file for your email content inside resources/views/emails/.
You can chain methods like cc(), bcc(), and attach() inside build() to customize the email further.
Test emails locally using tools like Mailtrap or log driver to avoid sending real emails during development.
Mailable classes organize email logic and content in one place.
Use the build() method to set the view, subject, and data.
Pass dynamic data via the constructor to customize emails.
Practice
Mailable class in Laravel?Solution
Step 1: Understand the role of Mailable classes
Mailable classes are designed to organize email content and settings such as subject, recipients, and views.Step 2: Compare with other Laravel features
Database migrations, authentication, and routing are handled by other parts of Laravel, not Mailable classes.Final Answer:
To organize email content and settings in one place -> Option AQuick Check:
Mailable class purpose = Organize email content [OK]
- Confusing Mailable with database or routing features
- Thinking Mailable handles user login
- Assuming Mailable manages API endpoints
Solution
Step 1: Recall Mailable class structure
Thebuild()method is where you define the email's view and subject in Laravel Mailable classes.Step 2: Eliminate incorrect methods
Methods likesend(),compose(), andrender()are not used in Laravel Mailable classes for this purpose.Final Answer:
build() -> Option CQuick Check:
Set email view and subject = build() method [OK]
- Using send() instead of build()
- Confusing build() with render()
- Trying to use compose() which is not a Laravel Mailable method
class OrderShipped extends Mailable {
public function build() {
return $this->subject('Your order has shipped')->view('emails.shipped');
}
}Solution
Step 1: Analyze the build() method
Thebuild()method sets the subject usingsubject('Your order has shipped').Step 2: Understand what the subject() method does
This method sets the email's subject line to the given string.Final Answer:
Your order has shipped -> Option AQuick Check:
Email subject = 'Your order has shipped' [OK]
- Confusing view name with subject
- Assuming class name is subject
- Thinking no subject is set without explicit call
class WelcomeUser extends Mailable {
public $user;
public function __construct($user) {
$this->user = $user;
}
public function build() {
return $this->view('emails.welcome')->with('user');
}
}Solution
Step 1: Check the with() method usage
Thewith()method requires a key-value pair or an array to pass data to the view, but here it only has a key string without a value.Step 2: Verify other parts of the class
Property declaration and constructor are correct, and the method namebuild()is correct.Final Answer:
Missing argument in with() method -> Option DQuick Check:
with() needs key and value [OK]
- Passing only key without value to with()
- Forgetting to return in build()
- Misnaming build() method
build() method?Solution
Step 1: Understand how to pass multiple data items
Thewith()method accepts an associative array to pass multiple variables to the view.Step 2: Analyze each option's syntax
return $this->view('emails.order')->with(['name' => $this->name, 'orderId' => $this->orderId]); correctly uses an array with keys and values. return $this->view('emails.order')->with('name', $this->name)->with('orderId'); misses value for 'orderId'. return $this->view('emails.order')->with('name', $this->name, 'orderId', $this->orderId); passes too many arguments. return $this->view('emails.order')->with(['name', $this->name, 'orderId', $this->orderId]); uses a numeric array instead of associative.Final Answer:
return $this->view('emails.order')->with(['name' => $this->name, 'orderId' => $this->orderId]); -> Option BQuick Check:
Pass multiple data as associative array in with() [OK]
- Passing multiple arguments instead of one array
- Omitting values for keys in with()
- Using numeric array instead of associative
