LARAVEL

Laravel Mailable and MailChimp Integration Guide

February 25, 2024 14 min read

Introduction

Laravel's Mailable class provides a clean, elegant way to send emails from your application. Combined with MailChimp for marketing campaigns, you can build comprehensive email communication systems.

Creating Mailables

Generate a mailable class:

php artisan make:mailable OrderShipped
// app/Mail/OrderShipped.php
namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class OrderShipped extends Mailable
{
    use Queueable, SerializesModels;

    public $order;

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

    public function build()
    {
        return $this->subject('Your Order Has Shipped')
                    ->view('emails.orders.shipped');
    }
}

Email Views

<!-- resources/views/emails/orders/shipped.blade.php -->
<!DOCTYPE html>
<html>
<head>
    <title>Order Shipped</title>
</head>
<body>
    <h1>Your order has shipped!</h1>
    
    <p>Order Number: {{ $order['order_number'] }}</p>
    <p>Tracking: {{ $order['tracking_number'] }}</p>
    
    <p>Thank you for your purchase!</p>
</body>
</html>
// Adding attachments
public function build()
{
    return $this->subject('Your Order Has Shipped')
                ->view('emails.orders.shipped')
                ->attach('/path/to/file.pdf', [
                    'as' => 'invoice.pdf',
                    'mime' => 'application/pdf',
                ]);
}

Sending Emails

// Basic sending
use App\Mail\OrderShipped;
use Illuminate\Support\Facades\Mail;

Mail::to($user->email)->send(new OrderShipped($order));
// Multiple recipients
Mail::to([
    'primary@example.com',
    'secondary@example.com'
])->send(new OrderShipped($order));
// With CC/BCC
Mail::to($user)
    ->cc('manager@example.com')
    ->bcc('archive@example.com')
    ->send(new OrderShipped($order));
// Queueing emails
Mail::to($user)->queue(new OrderShipped($order));

// Delayed queue
Mail::to($user)->later(
    now()->addMinutes(10),
    new OrderShipped($order)
);

MailChimp Integration

Install the MailChimp package:

composer require spatie/laravel-mailchimp-api
// config/services.php
'mailchimp' => [
    'api_key' => env('MAILCHIMP_API_KEY'),
    'list_id' => env('MAILCHIMP_LIST_ID'),
],
// Adding subscriber
use Spatie\MailchimpApi\Facades\MailchimpApi;

public function subscribe(Request $request)
{
    MailchimpApi::lists()->addMember(
        config('services.mailchimp.list_id'),
        [
            'email_address' => $request->email,
            'status' => 'subscribed',
            'merge_fields' => [
                'FNAME' => $request->first_name,
                'LNAME' => $request->last_name,
            ]
        ]
    );
}
// Sending campaign
public function sendCampaign($subject, $content)
{
    // Create campaign
    $campaign = MailchimpApi::campaigns()->create([
        'type' => 'regular',
        'recipients' => [
            'list_id' => config('services.mailchimp.list_id')
        ],
        'settings' => [
            'subject_line' => $subject,
            'title' => $subject,
            'from_name' => 'Your Company',
            'reply_to' => 'noreply@example.com'
        ]
    ]);
    
    // Set content
    MailchimpApi::campaigns()->setContent($campaign['id'], [
        'html' => $content
    ]);
    
    // Send
    MailchimpApi::campaigns()->send($campaign['id']);
}

Summary

Laravel Mailables provide a powerful way to send emails from your application, while MailChimp integration enables marketing campaigns. Together, they form a comprehensive email solution.

For more information, check out our other tutorials on Form Request Validation and Custom Helpers.