📧 Tutorial Mengirim Email di Laravel dengan CID Image

Dalam tutorial ini, kita akan belajar cara mengirim email di Laravel dengan gambar statis menggunakan **CID (Content-ID)**. Dengan metode ini, gambar tetap dapat ditampilkan meskipun penerima email dalam kondisi offline.

Tags:
  • #Laravel
  • #Email
  • #CID Image
  • #PHP
  • #Mail
Learning Path: | Category: Laravel Tips

📌 Table of Contents

  1. Pendahuluan
  2. Persiapan
  3. Membuat Helper Email
  4. Membuat View Email dengan CID Image
  5. Menggunakan Helper untuk Mengirim Email
  6. Kesimpulan

🔧 Persiapan

  1. Pastikan Laravel sudah terinstall.
  2. Konfigurasi SMTP di .env:
    MAIL_MAILER=smtp
    MAIL_HOST=smtp.example.com
    MAIL_PORT=587
    MAIL_USERNAME=your_email@example.com
    MAIL_PASSWORD=your_password
    MAIL_ENCRYPTION=tls
    MAIL_FROM_ADDRESS=your_email@example.com
    MAIL_FROM_NAME="Your Name"
  3. Jalankan php artisan storage:link agar bisa mengakses gambar dari storage.

📌 Membuat Helper Email

Buat file app/Helpers/EmailHelper.php:

<?php

namespace App\Helpers;

use Illuminate\Support\Facades\Mail;
use Exception;

class EmailHelper
{
    public static function sendEmail($to, $subject, $message, $attachments = [], $cc = [], $bcc = [])
    {
        try {
            Mail::send([], [], function ($messageObj) use ($to, $subject, $message, $attachments, $cc, $bcc) {
                $messageWithInlineImages = self::processInlineImages($message, $messageObj);
                
                $messageObj->to($to)
                           ->subject($subject)
                           ->html($messageWithInlineImages);
                
                if (!empty($cc)) $messageObj->cc($cc);
                if (!empty($bcc)) $messageObj->bcc($bcc);
                if (!empty($attachments)) {
                    foreach ($attachments as $attachment) {
                        $messageObj->attach($attachment);
                    }
                }
            });

            return true;
        } catch (Exception $e) {
            logger("EmailHelper: " . $e->getMessage());
            throw new Exception("Gagal mengirim email: " . $e->getMessage());
        }
    }

    private static function processInlineImages($body, $messageObj)
    {
        return preg_replace_callback('/<img[^>]+src=["\'](.*?)["\']/i', function ($matches) use ($messageObj) {
            $imagePath = $matches[1];
            
            if (strpos($imagePath, '/storage') === 0) {
                $filePath = storage_path('app/public' . parse_url($imagePath, PHP_URL_PATH));
                
                if (file_exists($filePath)) {
                    $cid = 'cid_' . uniqid();
                    $messageObj->embed($filePath, ['content-id' => $cid]);
                    return 'src="cid:' . $cid . '"';
                }
            }
            
            return $matches[0];
        }, $body);
    }
}

🖼 Membuat View Email dengan CID Image

Buat file resources/views/emails/sample.blade.php:

<!DOCTYPE html>
<html>
<head>
    <title>Email dengan Gambar CID</title>
</head>
<body>
    <h2>Halo, ini email dengan gambar CID</h2>
    <p>Berikut adalah gambar inline:</p>
    <img src="/storage/email/logo.png" alt="Logo">
</body>
</html>

Pastikan gambar disimpan di storage/app/public/email/logo.png


🔍 Memahami processInlineImages

Fungsi processInlineImages bertanggung jawab untuk mengonversi gambar dari path lokal (/storage/...) menjadi Content-ID (CID) agar dapat disertakan sebagai attachment inline di email.

Cara Kerja:

  1. Mendeteksi tag <img> dalam email menggunakan preg_replace_callback.
  2. Mengambil src dari tag <img> untuk mengecek apakah gambar berasal dari storage Laravel (/storage/...).
  3. Mengubah path gambar ke path absolut di server menggunakan storage_path().
  4. Menyematkan gambar ke dalam email dengan $messageObj->embed() agar dikodekan sebagai CID Image.
  5. Mengganti src gambar dalam HTML menjadi cid:unique_id, sehingga gambar ditampilkan dari email, bukan dari URL eksternal.

Contoh Perubahan dalam HTML Email:

Sebelum:

<img src="/storage/email/logo.png" alt="Logo">

Sesudah:

<img src="cid:cid_123456789" alt="Logo">

Dengan metode ini, gambar tetap tampil meskipun penerima email dalam keadaan offline.


📤 Menggunakan Helper untuk Mengirim Email

Di dalam controller atau service, gunakan kode berikut untuk mengirim email:

use App\Helpers\EmailHelper;

EmailHelper::sendEmail(
    'penerima@example.com',
    'Subject Email',
    view('emails.sample')->render()
);

✅ Kesimpulan

Dengan metode ini, gambar dalam email tetap tampil meskipun penerima dalam kondisi offline. Ini berguna untuk mengirim email dengan branding atau gambar penting tanpa bergantung pada sumber eksternal.

Selamat mencoba! 🎉

Logo Adib

© 2025 Adib

GitHub