📌 Table of Contents
- Pendahuluan
- Persiapan
- Membuat Helper Email
- Membuat View Email dengan CID Image
- Menggunakan Helper untuk Mengirim Email
- Kesimpulan
🔧 Persiapan
- Pastikan Laravel sudah terinstall.
- 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"
- 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:
- Mendeteksi tag
<img>
dalam email menggunakanpreg_replace_callback
. - Mengambil
src
dari tag<img>
untuk mengecek apakah gambar berasal dari storage Laravel (/storage/...
). - Mengubah path gambar ke path absolut di server menggunakan
storage_path()
. - Menyematkan gambar ke dalam email dengan
$messageObj->embed()
agar dikodekan sebagai CID Image. - Mengganti
src
gambar dalam HTML menjadicid: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! 🎉