Bird
Raised Fist0
Laravelframework~5 mins

Mailable classes in Laravel

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Mailable classes help you send emails easily by organizing email content and settings in one place.

When you want to send a welcome email after user registration.
When you need to send password reset instructions.
When sending order confirmation emails in an online store.
When notifying users about important updates or alerts.
When you want to customize email content with dynamic data.
Syntax
Laravel
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.

Examples
A simple Mailable class that sends a welcome email using a Blade view.
Laravel
<?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');
    }
}
This Mailable class accepts order data and passes it to the email view.
Laravel
<?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');
    }
}
Sample Program

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.

Laravel
<?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));
OutputSuccess
Important Notes

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.

Summary

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

(1/5)
1. What is the main purpose of a Mailable class in Laravel?
easy
A. To organize email content and settings in one place
B. To handle database migrations
C. To manage user authentication
D. To define API routes

Solution

  1. Step 1: Understand the role of Mailable classes

    Mailable classes are designed to organize email content and settings such as subject, recipients, and views.
  2. Step 2: Compare with other Laravel features

    Database migrations, authentication, and routing are handled by other parts of Laravel, not Mailable classes.
  3. Final Answer:

    To organize email content and settings in one place -> Option A
  4. Quick Check:

    Mailable class purpose = Organize email content [OK]
Hint: Mailable classes bundle email setup and content [OK]
Common Mistakes:
  • Confusing Mailable with database or routing features
  • Thinking Mailable handles user login
  • Assuming Mailable manages API endpoints
2. Which method must you define inside a Laravel Mailable class to set the email's view and subject?
easy
A. send()
B. compose()
C. build()
D. render()

Solution

  1. Step 1: Recall Mailable class structure

    The build() method is where you define the email's view and subject in Laravel Mailable classes.
  2. Step 2: Eliminate incorrect methods

    Methods like send(), compose(), and render() are not used in Laravel Mailable classes for this purpose.
  3. Final Answer:

    build() -> Option C
  4. Quick Check:

    Set email view and subject = build() method [OK]
Hint: Use build() to configure email content and subject [OK]
Common Mistakes:
  • Using send() instead of build()
  • Confusing build() with render()
  • Trying to use compose() which is not a Laravel Mailable method
3. Given this Mailable class snippet, what will be the subject of the sent email?
class OrderShipped extends Mailable {
  public function build() {
    return $this->subject('Your order has shipped')->view('emails.shipped');
  }
}
medium
A. Your order has shipped
B. emails.shipped
C. OrderShipped
D. No subject set

Solution

  1. Step 1: Analyze the build() method

    The build() method sets the subject using subject('Your order has shipped').
  2. Step 2: Understand what the subject() method does

    This method sets the email's subject line to the given string.
  3. Final Answer:

    Your order has shipped -> Option A
  4. Quick Check:

    Email subject = 'Your order has shipped' [OK]
Hint: Subject is set by subject() inside build() [OK]
Common Mistakes:
  • Confusing view name with subject
  • Assuming class name is subject
  • Thinking no subject is set without explicit call
4. Identify the error in this Mailable class code:
class WelcomeUser extends Mailable {
  public $user;

  public function __construct($user) {
    $this->user = $user;
  }

  public function build() {
    return $this->view('emails.welcome')->with('user');
  }
}
medium
A. Wrong method name instead of build()
B. Incorrect property declaration
C. Missing return statement in constructor
D. Missing argument in with() method

Solution

  1. Step 1: Check the with() method usage

    The with() 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.
  2. Step 2: Verify other parts of the class

    Property declaration and constructor are correct, and the method name build() is correct.
  3. Final Answer:

    Missing argument in with() method -> Option D
  4. Quick Check:

    with() needs key and value [OK]
Hint: with() needs key and value to pass data [OK]
Common Mistakes:
  • Passing only key without value to with()
  • Forgetting to return in build()
  • Misnaming build() method
5. You want to send an email with a Mailable class that passes a user's name and order ID to the view. Which is the correct way to pass this data inside the build() method?
hard
A. return $this->view('emails.order')->with('name', $this->name, 'orderId', $this->orderId);
B. return $this->view('emails.order')->with(['name' => $this->name, 'orderId' => $this->orderId]);
C. return $this->view('emails.order')->with('name', $this->name)->with('orderId');
D. return $this->view('emails.order')->with(['name', $this->name, 'orderId', $this->orderId]);

Solution

  1. Step 1: Understand how to pass multiple data items

    The with() method accepts an associative array to pass multiple variables to the view.
  2. 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.
  3. Final Answer:

    return $this->view('emails.order')->with(['name' => $this->name, 'orderId' => $this->orderId]); -> Option B
  4. Quick Check:

    Pass multiple data as associative array in with() [OK]
Hint: Use associative array in with() for multiple data [OK]
Common Mistakes:
  • Passing multiple arguments instead of one array
  • Omitting values for keys in with()
  • Using numeric array instead of associative