SPF yang sudah benar tidak menjamin email masuk inbox. Ada empat layer terpisah yang Gmail dan provider lain pakai untuk putuskan nasib email: reputasi IP, SPF, DKIM, dan konten. Artikel ini kasih peta untuk setiap layer yang sering tidak terlihat developer Laravel, plus code checklist yang bisa langsung dijalankan.
Anda sudah menghabiskan waktu mengkonfigurasi SPF. Record baru ditambahkan, DNS propagate sudah dicek, hasil pengecekan menunjukkan pass. conviction: email Laravel dari aplikasi Anda sekarang aman.
Lalu user tetap report: “Email tidak masuk inbox.”
Masalahnya bukan di SPF. Masalahnya ada di empat layer terpisah yang Gmail pakai secara independen untuk nilai email Anda. SPF hanya satu dari empat. Kalau tiga lainnya bermasalah, email tetap masuk spam meskipun SPF pass 100%.
Daftar Isi
Kenapa SPF Pass Tidak Cukup untuk Masuk Inbox
SPF, singkatan dari Sender Policy Framework, adalah DNS record yang declare IP mana saja yang boleh kirim email atas nama domain Anda. Ketika server penerima menerima email, dia mengecek apakah IP pengiriman ada di daftar SPF record. Kalau ada, SPF pass. Kalau tidak, fail atau softfail.
Tapi pass tidak berarti inbox.
Gmail tidak pakai SPF sebagai penentu akhir. SPF adalah satu sinyal dari empat yang dievaluasi terpisah. Tiga sinyal lain ini yang sering jadi biang masalah padahal developer tidak pernah memriksanya:
Reputasi IP server pengiriman. Ini layer paling umum dan paling diabaikan. Kalau server Anda pakai shared hosting atau shared SMTP, IP yang sama dipakai puluhan atau ratusan pengguna lain. Satu neighbour spam massal tanpa autentikasi yang benar, seluruh IP kena blacklist, termasuk email Laravel Anda yang legit.
DKIM signature yang tidak ada. DKIM menambahkan tanda tangan kriptografis di level header. Email tidak bisa di-tamper dalam perjalanan dari server Anda ke inbox penerima tanpa signature invalid. Tanpa DKIM, email tidak punya integritas yang bisa diverifikasi. Banyak tutorial Laravel email yang tidak sentuh ini, jadi DKIM tidak pernah aktif.
Konten email. Even if your authentication is perfect, spam filters evaluate what the email actually says. Excessive links, ALL CAPS subject lines, missing list-unsubscribe headers, and suspicious HTML-to-text ratios all trigger content-based filtering before ML evaluation.
Layer 1: Reputasi IP Shared – Akar Masalah Terbesar
Kalau aplikasi Laravel Anda jalan di shared hosting atau pakai SMTP gratisan, kemungkinan besar email dikirim dari shared IP. Shared IP artinya puluhan hingga ratusan domain mengirim dari IP yang sama.
Seorang neighbour di IP tersebut pernah kirim email massal tanpa autentikasi yang benar. Reputasi IP itu jatuh. Filter spam tahu IP-nya sudah di-blacklist atau punya history spam, tapi tetap menerima koneksi karena port 25 terbuka. Email Anda yang sudah SPF-pass, DKIM-signed, dan kontennya bersih, tetap masuk spam karena IP reputation jatuh bukan karena email Anda bermasalah.
Cara pengecekan cepat:
# Cek apakah IP server ada di blacklist
nslookup $(dig +short yourdomain.com A) | head -1
# Lalu check di https://mxtoolbox.com/blacklists/
Atau pakai script pengecekan blacklist:
import socket
BLACKLISTS = [
'bl.spamcop.net',
'sbl.spamhaus.org',
'dnsbl.sorbs.net',
]
def check_ip_blacklist(ip):
results = []
reversed_ip = '.'.join(ip.split('.')[::-1])
for blacklist in BLACKLISTS:
try:
host = f"{reversed_ip}.{blacklist}"
answers = socket.getaddrinfo(host, None, socket.AF_INET)
results.append(f"FOUND on {blacklist}")
except socket.gaierror:
results.append(f"OK - {blacklist}")
return results
Kalau IP sudah ada di blacklist, satu-satunya solusi nyata: pindah ke dedicated IP atau pakai SMTP provider yang menyediakan dedicated IP dengan reputasi terkontrol. Shared IP yang sudah kena blacklist tidak bisa diperbaiki. Hanya dinetralisir dengan IP baru.
Layer 2: DKIM – Yang Sering Terlewat di Laravel
SPF mengecek IP. DKIM mengecek content integrity lewat signature kriptografis.
Mekanismenya: saat email dikirim, server Anda menandatangani header dan body email pakai private key yang tersimpan di server. Server penerima pakai public key yang dipublikasi di DNS record untuk memverifikasi signature. Kalau email berubah 1 byte pun dalam perjalanan, signature tidak cocok dan server penerima tahu email sudah di-tamper.
Tanpa DKIM, email tidak punya mekanisme integritas. Forwarder, mail server relay, atau pihak ketiga bisa mengubah konten email tanpa deteksi. Spam filter menandai ini karena tidak ada guarantee email tidak dimodifikasi.
Di Laravel, DKIM tidak otomatis aktif meskipun Anda sudah pakai custom SMTP.
Konfigurasi manual yang sering terlewat. Laravel tidak generate DKIM signing secara otomatis lewat php artisan make:mail. Anda perlu menambah signing configuration:
// config/mail.php
'mailers' => [
'smtp' => [
'transport' => 'smtp',
'host' => env('MAIL_HOST'),
'port' => env('MAIL_PORT', 587),
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
],
],
// DKIM signing tidak otomatis. Tambahkan ini:
'signing' => [
'domain' => env('MAIL_SIGNING_DOMAIN'),
'secret' => env('MAIL_DKIM_SECRET'),
],
DNS TXT record untuk DKIM public key:
mail._domainkey.yourdomain.com. TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC..."
Untuk cek apakah DKIM bekerja:
# Kirim test email ke akun yang bisa show original source
# Cek header email, harus ada line:
# DKIM-Signature: v=1; a=rsa-sha256; d=yourdomain.com; s=mail;
Kalau tidak ada header DKIM-Signature, DKIM tidak pernah dikirim oleh server Anda. Bukan berarti email masuk spam otomatis, tapi satu layer autentikasi hilang dan spam filter tidak punya referensi integritas.
Layer 3: DMARC Alignment – Dari Mana Email Seolah-olah Datang
SPF dan DKIM bekerja di level domain. Tapi email yang user lihat di inboxnya menunjukkan From header yang sering berbeda dari domain pengiriman.
DMARC memastikan SPF dan DKIM align dengan From header yang visible user.
Contoh skenario fail:
- Domain pengiriman (Envelope-From / Return-Path):
mail.yourdomain.com - Domain DKIM signing:
yourdomain.com - From header yang visible user:
[email protected]
SPF pass untuk mail.yourdomain.com. DKIM sign untuk yourdomain.com. Tapi From header adalah marketing.yourdomain.com. DMARC mengecek: apakah SPF atau DKIM align dengan marketing.yourdomain.com? Tidak. DMARC fail. Email masuk spam.
Konfigurasi DMARC yang benar minimum:
_dmarc.yourdomain.com. TXT "v=DMARC1; p=quarantine; rua=mailto:[email protected]"
p=quarantineartinya email yang fail DMARC ditandai sebagai spam, tidak di-reject langsungruaadalah aggregate report email – Anda dapat laporan rutin tentang bagaimana email dari domain Anda di-authenticate
Untuk cek DMARC:
# Via dig command
dig TXT _dmarc.yourdomain.com
Report dari rua paling penting. Laporan ini kasih tahu berapa persen email Anda yang SPF/DKIM pass versus fail, dan dari IP mana email-email itu datang. Ini insight yang tidak ada di tempat lain.
Layer 4: Konten Email dan Engagement Signals
Even if SPF, DKIM, dan DMARC semua pass, Gmail tetap pakai machine learning untuk menilai konten email. Sinyal yang dievaluasi:
Rasio link-to-text. Email dengan 10 link dalam 5 kalimat terlihat seperti phishing. Tautan harus relevan dan dalam proporsi yang wajar.
Subject line patterns. ALL CAPS, excess exclamation marks, subject yang tidak match content, dan emoji berlebihan trigger content-based filtering sebelum ML evaluation.
HTML-to-text ratio. Plain text yang sangat sedikit tapi HTML kompleks (nested tables, inline CSS yang tidak standard) signal spammy design.
List-Unsubscribe header. Untuk transactional email yang Gmail kategorikan sebagai bulk, header ini wajib ada. Tanpa ini, Gmail tidak punya cara clean untuk user unsubscribe, jadi opsi lainnya adalah menandai spam.
Implementasi List-Unsubscribe di Laravel:
// Dalam Mailable class
public function build()
{
$this->withSwiftMessage(function ($message) {
$message->getHeaders()->addTextHeader(
'List-Unsubscribe',
'<mailto:[email protected]?subject=unsubscribe>'
);
});
return $this->view('emails.your-template')
->from('[email protected]', 'Your App');
}
Engagement prediction. Gmail menggunakan data dari seluruh ecosystem: apakah user biasanya buka email dari domain ini, reply rate, delete tanpa baca rate. Domain baru tanpa history tidak punya reputation, jadi semua email dievaluasi dengan assumption netral sampai data terkumpul.
Laravel Email Deliverability Checklist
Debug layer per layer, dari yang paling impactful:
// Checklist ini taruh di route sementara untuk diagnosis
Route::get('/email-diagnostic', function () {
$checks = [];
// 1. Cek MX records - email routing benar
$mx = dns_get_record('yourdomain.com', DNS_MX);
$checks['mx_records'] = count($mx) > 0 ? 'OK' : 'MISSING';
// 2. Cek SPF record
$spf = dns_get_record('yourdomain.com', DNS_TXT);
$spf_text = collect($spf)->first(fn($r) => str_contains($r['txt'] ?? '', 'v=spf1'));
$checks['spf_record'] = $spf_text ? 'OK: ' . $spf_text['txt'] : 'MISSING';
// 3. Cek DKIM - ini tidak bisa dari PHP aja,
// harus verifikasi via external tool atau kirim test email
$checks['dkim'] = 'VERIFY_MANUALLY';
// 4. Cek DMARC
$dmarc = dns_get_record('_dmarc.yourdomain.com', DNS_TXT);
$checks['dmarc'] = count($dmarc) > 0 ? 'OK' : 'MISSING';
// 5. Cek PTR record (reverse DNS) - penting untuk IP reputation
$ip = request()->ip();
$ptr = gethostbyaddr($ip);
$checks['ptr_record'] = $ptr !== $ip ? "OK: $ptr" : 'MISSING';
return response()->json($checks);
});
Untuk hasil paling akurat, kirim test email ke mail-tester.com. Mereka kasih skor 0-10 dengan breakdown untuk setiap check:
- 8/10 atau lebih: authentication Anda solid
- 6-7/10: ada yang perlu diperbaiki
- Di bawah 6: multiple issues, authentication layers perlu dicek ulang
FAQ
Apakah SPF yang salah bikin email masuk spam?
Tidak selalu. SPF fail tidak secara otomatis kirim email ke spam. Tapi SPF fail adalah red flag yang menambah score ke arah spam classification. Selalu pastikan SPF record akurat dan tidak include IP yang tidak authorized.
Apakah saya wajib pakai DKIM untuk email Laravel?
Untuk production, ya. DKIM adalah satu-satunya mekanisme integritas yang bisa buktikan email tidak di-tamper dalam perjalanan. Tanpa DKIM, spam filter tidak punya referensi kriptografis dan harus rely pada signal lain yang kurang reliable.
Kenapa email test masuk inbox tapi email ke user nyata masuk spam?
Email test biasanya kirim ke domain yang sama dengan server pengiriman (misal: test dari yourdomain.com ke [email protected]). Ini melewati network yang sudah punya trust established. Email ke domain berbeda melewati filter publik yang evaluation secara terpisah.
Apakah dedicated IP benar-benar perlu?
Kalau volume email Anda di bawah 100 per hari dan tidak ada neighbour yang spam, shared IP masih bisa. Dedicated IP mulai jadi perlu ketika volume naik signifikan, atau ketika Anda mulai lihat pattern email masuk spam padahal authentication sudah benar.
Bagaimana cara cek reputasi IP email server?
Buka Google Postmaster Tools di https://postmaster.google.com. Anda butuh akses ke DNS domain untuk verify ownership, lalu data mulai muncul dalam 24-48 jam setelah Anda mulai kirim email dari domain tersebut. Postmaster Tools menunjukkan spam rate, domain reputation, authentication rates, dan delivery errors – semuanya secara real-time dari perspective Gmail.
Kesimpulan
SPF yang sudah benar tapi email tetap masuk spam bukan paradoks. Itu karena SPF hanya satu dari empat layer yang independently dievaluasi oleh filter spam modern.
Reputasi IP menentukan apakah server pengiriman sudah dipercaya. DKIM menyediakan integritas kriptografis. DMARC memastikan ketiga sinyal tersebut aligned dengan domain yang visible user. Konten menentukan apakah email terlihat seperti email yang user mau baca atau bulk promotion.
Laravel tidak mengkonfigurasi DKIM dan DMARC secara otomatis. Itu tugas developer. Selalu verifikasi dengan mail-tester.com sebelum assume email sudah aman.
Dan Jika Anda ingin mulai menggunakan KIRIM.EMAIL sebagai infrastruktur pengiriman email di perusahaan Anda, Anda bisa memulainya dari sini.
Hasbi Putra adalah Head of Marketing di KIRIM.EMAIL, email delivery infrastructure untuk developer dan tim IT di Indonesia. KIRIM.EMAIL mengirim lebih dari 11 juta email per hari dengan server yang sepenuhnya berlokasi di Indonesia.
- Kenapa Email Laravel Masuk Spam Padahal SPF Sudah Benar - April 5, 2026
- Cara Kirim OTP via Email di Node.js yang Tidak Delay dan Tidak Masuk Spam - April 3, 2026
- CAN-SPAM untuk Developer: Yang Harus Anda Implementasi di Kode Anda - April 2, 2026
