Verifikasi Domain & DKIM untuk Email Transaksional — Setup SPF, DKIM, DMARC dari Nol
Email OTP kamu masuk spam? Invoice tidak sampai? Masalahnya hampir selalu sama: kamu kirim dari domain yang belum terverifikasi, atau record DKIM/SPF/DMARC belum terpasang.
MailAnvil menolak kirim dari domain yang dkim_status-nya belum verified — ini sengaja, untuk melindungi reputasi pengirim. Tutorial ini memandu dari nol sampai email pertama pakai domain sendiri.
Kenapa verifikasi domain itu wajib
Provider email (Gmail, Outlook) menilai setiap email dari tiga tanda tangan DNS:
- SPF (TXT) — daftar server yang boleh kirim atas nama domain kamu.
- DKIM (CNAME) — tanda tangan kriptografis yang membuktikan email tidak diubah di perjalanan.
- DMARC (TXT) — kebijakan: apa yang harus dilakukan penerima kalau SPF/DKIM gagal.
Tanpa ketiganya, email kamu terlihat seperti spoof. Dengan ketiganya, Gmail percaya email kamu asli — masuk Inbox, bukan spam.
Prasyarat
- API key MailAnvil (diawali
re_) — ambil di mailanvil.com - Sebuah domain yang kamu kontrol DNS-nya (Cloudflare, atau provider lain)
curlatau Node.js 18+
Step 1 — Tambah domain
POST /v1/domains memicu SES membuat email identity, lalu mengembalikan semua record DNS yang harus kamu pasang.
curl -X POST https://api.mailanvil.com/v1/domains \
-H "Authorization: Bearer re_your_api_key" \
-H "Content-Type: application/json" \
-d '{"domain": "mail.contoh.com"}'
Respons 201 berisi domain (dengan dkim_status: "pending") plus dns_records:
{
"domain": { "id": "dom_01j2x...", "domain": "mail.contoh.com", "dkim_status": "pending" },
"dns_records": [
{ "type": "CNAME", "name": "<token1>._domainkey.mail.contoh.com", "value": "<token1>.dkim.amazonses.com", "purpose": "DKIM" },
{ "type": "CNAME", "name": "<token2>._domainkey.mail.contoh.com", "value": "<token2>.dkim.amazonses.com", "purpose": "DKIM" },
{ "type": "CNAME", "name": "<token3>._domainkey.mail.contoh.com", "value": "<token3>.dkim.amazonses.com", "purpose": "DKIM" },
{ "type": "TXT", "name": "mail.contoh.com", "value": "v=spf1 include:amazonses.com ~all", "purpose": "SPF" },
{ "type": "MX", "name": "send.mail.contoh.com", "value": "feedback-smtp.ap-southeast-1.amazonses.com", "priority": 10, "purpose": "MAIL FROM" },
{ "type": "TXT", "name": "send.mail.contoh.com", "value": "v=spf1 include:amazonses.com ~all", "purpose": "MAIL FROM" },
{ "type": "TXT", "name": "_dmarc.mail.contoh.com", "value": "v=DMARC1; p=none; rua=mailto:[email protected]", "purpose": "DMARC (recommended)" }
]
}
Simpan dom_... — itu id yang dipakai untuk verifikasi nanti.
Step 2 — Pasang record DNS
Dua cara. Pilih salah satu.
Cara A — Auto-configure Cloudflare (paling cepat)
Kalau domain kamu di Cloudflare, MailAnvil bisa pasang semua record otomatis. Pertama hubungkan token Cloudflare (token dienkripsi saat disimpan, tidak pernah disimpan plaintext):
# 1. Hubungkan Cloudflare token (butuh izin DNS:Edit di zone)
curl -X POST https://api.mailanvil.com/v1/cloudflare/connect \
-H "Authorization: Bearer re_your_api_key" \
-H "Content-Type: application/json" \
-d '{"api_token": "CF_TOKEN_ANDA"}'
# 2. Auto-pasang semua record DKIM/SPF/DMARC
curl -X POST https://api.mailanvil.com/v1/domains/dom_01j2x.../cloudflare-auto-configure \
-H "Authorization: Bearer re_your_api_key"
Respons kedua:
{ "success": true, "zone": "contoh.com", "records_created": 7 }
Selesai — tidak perlu copas record manual.
Cara B — Pasang manual
Buka panel DNS provider kamu, tambahkan setiap dns_records persis seperti di atas. Catatan penting:
- Record MX dan TXT harus DNS-only (grey cloud di Cloudflare), jangan diproxy (orange).
- Record CNAME DKIM juga DNS-only — nilai
.dkim.amazonses.comharus terlihat apa adanya.
Step 3 — Verifikasi
Setelah record terpasang (tunggu 1-5 menit propagasi), panggil verifikasi ulang:
curl -X POST https://api.mailanvil.com/v1/domains/dom_01j2x.../verify \
-H "Authorization: Bearer re_your_api_key"
MailAnvil mengecek ulang SES identity, lalu memeriksa SPF dan DMARC lewat lookup DNS live. Respons:
{
"domain": {
"dkim_status": "verified",
"spf_status": "verified",
"dmarc_status": "verified"
}
}
Saat dkim_status jadi verified, kamu resmi boleh kirim dari domain itu. Kalau masih pending, cek typo nilai record — penyebab paling umum.
Step 4 — Kirim email pertama
await fetch("https://api.mailanvil.com/v1/send", {
method: "POST",
headers: {
"Authorization": "Bearer re_your_api_key",
"Content-Type": "application/json"
},
body: JSON.stringify({
from: "MailAnvil <[email protected]>",
to: ["[email protected]"],
subject: "Konfirmasi pemesanan #1234",
html: "<h1>Pesanan dikonfirmasi</h1><p>Terima kasih sudah memesan.</p>"
})
});
Respons 202 Accepted — email masuk antrian, ditandatangani DKIM dari domain terverifikasi kamu.
Pola pakai di dunia nyata
- OTP fintech (OVO/DANA/GoPay style) — domain khusus
otp.perusahaan.idterverifikasi DKIM, OTP masuk Inbox bukan spam. - Konfirmasi booking travel (Tiket.com/Traveloka style) — email booking + e-ticket dari domain sendiri, dipercaya penerima.
- Invoice food delivery (GoFood/GrabFood style) — struk + nota QRIS dari
[email protected], bukan alamat shared.
Satu domain bisa dipakai semua service — verifikasi sekali, kirim dari mana saja.
Kenapa MailAnvil
- Auto-DKIM untuk pengguna Cloudflare —
cloudflare-auto-configurepasang semua record dalam satu request, bukan copas manual. - IDR pricing + QRIS/GoPay — Rp0 untuk 500 email/bulan pertama, bayar Rupiah tanpa markup USD.
- Bahasa docs + support — tim kamu tidak perlu translate error message.
- CF Workers native — verifikasi domain dan kirim email jalan di edge, latensi rendah.
Next steps
Tambah domain produksi kamu, pasang record (auto-configure kalau di Cloudflare), verifikasi, lalu pindahkan semua from dari domain default ke domain sendiri. Referensi lengkap di docs.mailanvil.com.
Domain terverifikasi = email masuk Inbox. Auto-configure Cloudflare = 1 request, bukan 7 record manual.
Coba MailAnvil gratis di mailanvil.com — 500 email/bulan gratis, bayar pakai QRIS/GoPay.