Panduan

Panduan13 menit baca

Kirim hasil formulir HTML ke email Anda

Terima setiap kiriman formulir di inbox tanpa mail server: mengapa mailto: dan mail() PHP gagal, dan setup yang menyaring spam serta memungkinkan Anda membalas.

Preet SutharPendiri, Ikiform

Formulir HTML tidak bisa mengirim email sendiri, karena browser tidak punya cara untuk berbicara dengan mail server. Arahkan action formulir ke form backend, yang menerima kiriman, menyaring spam, menyimpannya, lalu mengirim email ke Anda dan tim. Beri nama field email email, dan menekan Reply di inbox akan langsung membalas ke orang yang mengisi formulir.

Kebanyakan situs hanya butuh satu hal dari formulir kontak: pesannya masuk ke inbox yang dibaca seseorang. Ternyata itu lebih sulit dari kelihatannya. HTML punya elemen <form> tetapi tidak punya cara mengirim email, dan jalan pintas lama entah melempar tugasnya kembali ke pengunjung atau berakhir di folder spam. Panduan ini menjelaskan alasannya, membandingkan pilihan yang ada secara jujur, dan menyiapkan formulir yang mengirimi Anda email di situs dan stack apa pun.

Mengapa formulir tidak bisa mengirim email sendiri

Saat pengunjung menekan Send, browser membuat satu request HTTP ke URL di action formulir. Hanya itu yang bisa dilakukan formulir. Mengirim email butuh percakapan SMTP dengan mail server, dari mesin yang dipercaya oleh server penerima. Browser tidak bisa membuka koneksi itu, dan seandainya bisa pun, email dari laptop pengunjung acak akan ditolak. Jadi selalu ada sesuatu di server di antara formulir dan inbox Anda: kode Anda sendiri, skrip di hosting Anda, atau sebuah layanan.

Dengan form backend, sesuatu itu adalah sebuah URL. Formulir mengirim ke https://ikiform.com/f/<id>, dan Ikiform mengerjakan sisanya:

Bagaimana kiriman formulir menjadi email di inbox AndaformulirAndasitus ataustack apa punIkiformvalidasi,skor spam,simpansatu emailperpenerimareply-toadalahpengiriminbox AndaReply kepengunjungdisimpansebagaispamtanpa email,tanpa webhookkirimbukan spamdetikskor spam tercapaiBagaimana kiriman formulir menjadi email di inbox Andaformulir Andasitus atau stack apapunIkiformvalidasi, skor spam,simpansatu email perpenerimareply-to adalahpengiriminbox AndaReply ke pengunjungdisimpansebagaispamtanpa email,tanpawebhookkirimbukan spamdetikskor spam tercapai
  1. Pengunjung mengirim formulir Anda, lalu browser atau server Anda mengirimnya ke endpoint Ikiform Anda.
  2. Ikiform memeriksa field terhadap definisi formulir, memberi skor spam pada kiriman, lalu menyimpannya.
  3. Kiriman yang mencapai batas skor spam disimpan sebagai spam. Kiriman itu mendapat jawaban sukses yang sama, tetapi tidak memicu email maupun webhook.
  4. Setiap kiriman lainnya mengirim satu email ke setiap penerima, dengan alamat pengunjung sebagai reply-to.
  5. Email tiba di inbox Anda beberapa detik kemudian. Menekan Reply akan membalas ke pengunjung.
Pengunjung tidak pernah melihat alamat email dan tidak pernah membuka aplikasi email. Satu-satunya yang ada di halaman Anda adalah formulir.

Enam cara memasukkan formulir ke inbox Anda

Masing-masing cocok untuk seseorang. Tabel ini membahas apa biayanya bagi Anda begitu pengunjung sungguhan, dan bot sungguhan, mulai memakai formulir.

PendekatanUnggul dalamKekurangan
action="mailto:you@example.com"Tanpa server, tanpa akun, satu atribut.Tidak ada yang terkirim. Browser membuka aplikasi email pengunjung dengan draf, atau tidak melakukan apa-apa jika tidak ada aplikasi email yang disiapkan. Alamat Anda tertera di halaman untuk para scraper. Lihat panduan Gmail.
Skrip PHP dengan mail()Berjalan di hampir semua shared hosting PHP, tanpa pihak ketiga.Bergantung pada setup email hosting, dan email yang mengaku berasal dari domain Anda sering gagal SPF atau DMARC lalu masuk spam. Tidak ada penyaringan spam, tidak ada penyimpanan, dan sama sekali tidak ada PHP di hosting statis. Lihat tanpa PHP.
SDK email di browser, seperti EmailJSTanpa server. Template email yang Anda desain di dashboard mereka.Key dan ID template ada di JavaScript halaman Anda, jadi siapa pun bisa mengirim template Anda dengan teks mereka sendiri. Lihat alternatif EmailJS.
Route Anda sendiri ditambah API email, seperti Resend, Postmark, Amazon SES, atau Nodemailer lewat SMTPKendali penuh: subjek Anda, HTML Anda, konfirmasi ke pengunjung.Anda membangun sendiri validasi, penyaringan spam, rate limit, penyimpanan, dan percobaan ulang, memverifikasi domain pengirim, dan butuh server bahkan untuk situs statis. Lihat panduan Next.js.
Google Apps Script sebagai web appBerjalan di akun Google yang sudah Anda punya.Kuota skrip membatasi berapa banyak penerima yang bisa dikirimi email per hari, URL-nya tanpa perlindungan spam, dan Anda yang memelihara skripnya.
Form backend, seperti Ikiform, Formspree, atau Web3FormsSatu URL di action. Penyaringan spam, penyimpanan, dan email tanpa server.Tata letak dan subjek email ditentukan layanannya. Dengan Ikiform, tidak ada yang pernah dikirim lewat email ke pengunjung.

Jika Anda butuh email dengan branding penuh, atau konfirmasi ke pengunjung, tulis route sendiri dengan API email. Jika Anda ingin pesan masuk ke inbox dan bisa dibalas, dengan spam tetap di luar, form backend adalah cara dengan kode paling sedikit. Sisa panduan ini memakai Ikiform.

Formulirnya

Tiga field sudah mencakup kebanyakan formulir kontak: siapa mereka, ke mana membalas, dan apa yang mereka inginkan. Pilih stack Anda di bawah; pilihan itu berlaku untuk setiap contoh kode di panduan ini.

Formulir ini berfungsi tanpa JavaScript sama sekali: browser mengirimnya, Ikiform mengirimi Anda email, dan pengunjung mendarat di halaman pada _redirect. Setiap field punya slot error kosong di bawahnya untuk skrip di bawah.

contact.html
<form id="contact" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST">
  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required maxlength="120" />
  <p data-error="name"></p>

  <label for="email">Your email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />
  <p data-error="email"></p>

  <label for="message">Message</label>
  <textarea id="message" name="message" rows="6" required minlength="10"></textarea>
  <p data-error="message"></p>

  <input type="hidden" name="page" value="/contact" />
  <input type="hidden" name="_redirect" value="https://example.com/contact/sent" />
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send message</button>
  <p id="contact-status" role="status"></p>
</form>

Skrip ini membuat pengunjung tetap di halaman. Skrip mengirim dengan fetch, menulis setiap error dari server di bawah field-nya, lalu mengganti formulir dengan kalimat yang mengulang alamat yang akan Anda balas, sehingga salah ketik mudah terlihat.

contact.js
const form = document.getElementById("contact");
const status = document.getElementById("contact-status");
const button = form.querySelector("button");

form.addEventListener("submit", async (event) => {
  event.preventDefault();
  for (const slot of form.querySelectorAll("[data-error]")) slot.textContent = "";
  button.disabled = true;
  status.textContent = "Sending";

  try {
    const response = await fetch(form.action, {
      method: "POST",
      headers: { Accept: "application/json" },
      body: new FormData(form),
    });
    const result = await response.json();
    if (result.ok) {
      const email = form.elements.namedItem("email").value;
      const done = document.createElement("p");
      done.setAttribute("role", "status");
      done.textContent = `Sent. We'll reply to ${email}.`;
      form.replaceWith(done);
      return;
    }
    for (const [field, messages] of Object.entries(result.error.fields ?? {})) {
      const slot = form.querySelector(`[data-error="${field}"]`);
      if (slot) slot.textContent = messages[0];
    }
    status.textContent = result.error.fields ? "Check the fields above." : result.error.message;
  } catch {
    status.textContent = "Couldn't send. Check your connection and try again.";
  }
  button.disabled = false;
});
  • Ganti frm_xxxxxxxxxxxxxxxx dengan ID formulir Anda dari dashboard.
  • name="email" menjadikan field itu alamat reply-to di email notifikasi. Pertahankan namanya, meskipun labelnya berbunyi "Email Anda".
  • page adalah field tersembunyi biasa. Field ini muncul di email, jadi Anda tahu dari halaman mana pesan itu berasal.
  • _gotcha adalah honeypot. Orang tidak pernah melihatnya; bot yang mengisinya disimpan sebagai spam dan tidak mengirim email ke siapa pun.
  • _redirect hanya berfungsi untuk URL https: di salah satu Allowed domains formulir. Hilangkan saja dan atur Redirect after submit di pengaturan formulir sebagai gantinya, atau Ikiform akan menampilkan halaman terima kasihnya sendiri.

Panduan framework membahas lebih jauh: Next.js, Astro, SvelteKit, Nuxt, React, Vue, dan HTML biasa. Pembuat situs seperti Webflow dan Carrd punya halaman sendiri, dan template formulir kontak menambahkan field topik.

Definisikan juga field-nya di dashboard, dan Ikiform menolak kiriman yang tidak cocok dengan 422 validation_failed dan pesan per field, yang ditampilkan kode di atas di samping setiap input. Coba di sini; ini menjalankan validator yang sama di browser Anda:

Pratinjau

Menjalankan validator Ikiform di browser Anda. Tidak ada yang dikirim.

Tempel definisi ini di tab Fields formulir. Tanpa definisi, Ikiform menerima nama field apa pun dan mengirim email berisi apa saja yang masuk.

Seperti apa emailnya

Setiap kiriman yang diterima mengirim email sederhana yang mudah dibaca. Ini versi teks salah satunya:

Email notifikasi
From: Ikiform <notifications@ikiform.com>
To: you@yourcompany.com
Reply-To: ada@example.com
Subject: New submission: Contact

Contact got a new submission on Oct 25, 2026, 9:14 AM UTC.

name: Ada Lovelace
email: ada@example.com
message: Do you ship to Canada? I'd like to order 40 units before December.
page: /contact

View it in Ikiform:
https://ikiform.com/dashboard/submissions?form=frm_xxxxxxxxxxxxxxxx&submission=sub_...
  • Email datang dari notifications@ikiform.com. Anda tidak perlu menyiapkan record DNS atau domain pengirim, karena email dikirim dari domain Ikiform.
  • Subjeknya selalu New submission: <form name>. _subject tidak mengubah subjek email notifikasi. Nilainya diteruskan ke webhook dan API sebagai meta.subject. Untuk membedakan formulir, beri setiap formulir nama yang jelas di dashboard, seperti "Kontak, halaman harga".
  • Field muncul sesuai urutan kirimnya, diberi label berdasarkan name-nya. Field yang diawali _ tidak ditampilkan.
  • Formulir atau jawaban yang sangat panjang dipendekkan, dan email menyebutkan berapa field lagi yang ada di dashboard. Halaman batas berisi angkanya.
  • Field yang terlihat seperti password atau nomor kartu tidak ditampilkan, dan email untuk kiriman yang memuatnya ditahan untuk ditinjau. Jangan kumpulkan kredensial dengan form backend.
  • Anggota workspace mendapat tombol View submission. Orang di luar workspace mendapat field-nya dan link berhenti berlangganan.

Siapa yang menerima email

Penerima diatur per formulir di dashboard, tidak pernah oleh formulir itu sendiri. Field yang menentukan penerima akan membuat siapa pun bisa memakai formulir Anda untuk mengirim email ke siapa saja, jadi Ikiform tidak menyediakannya.

SiapaCara menambahkannyaCatatan
DefaultTidak perlu apa-apaAnggota yang dipilih sebagai Notification email workspace, atau setiap owner workspace jika belum ada yang dipilih
Anggota pilihanCentang mereka di pengaturan Notifications formulirHanya anggota dengan alamat email terverifikasi
Orang di luar workspaceAdd someone outside the workspace, lalu Send linkMereka baru menerima email setelah mengonfirmasi. Maksimal 5 per formulir, dan masing-masing bisa berhenti berlangganan

Setiap formulir mengirim email ke maksimal 10 alamat. Setiap penerima mendapat salinannya sendiri, bukan CC bersama, jadi tidak ada yang melihat alamat penerima lain. Jika mailbox penerima memantulkan email (bounce), Ikiform menjeda email ke alamat itu untuk sementara dan dashboard menampilkan Emails bounced di sampingnya. Beberapa penerima membahas perutean berdasarkan topik, yang tidak bisa dilakukan hanya dengan daftar penerima.

Balas ke orangnya, bukan ke Ikiform

Ikiform menentukan alamat reply-to dari field _replyto terlebih dulu, lalu dari field bernama email, email_address, your_email, reply_to, contact_email. Nilainya harus satu alamat email yang valid, atau akan diabaikan. Dengan reply-to terisi, menekan Reply di Gmail, Outlook, atau Apple Mail membuka balasan ke pengunjung, dan jawaban Anda dikirim dari alamat Anda sendiri.

Tanpa reply-to, balasan terkirim ke notifications@ikiform.com, yang tidak dibaca siapa pun. Itulah kejutan paling umum, dan biasanya penyebabnya field bernama user_email atau Email Address dengan spasi. Ganti namanya, atau tambahkan _replyto. Panduan reply-to membahas formulir dengan dua field email dan pembuat situs yang mengganti nama field untuk Anda.

Saat banyak kiriman datang sekaligus

Setiap formulir mengirim hingga 50 email notifikasi per jam, atau 10 selama workspace berumur kurang dari 7 hari. Lewat dari itu, sisa kiriman di jam tersebut tetap disimpan seperti biasa dan datang sebagai satu email ringkasan setelah jam itu berakhir. Batas ini melindungi inbox Anda, dan reputasi email Ikiform di mata penyedia email Anda, saat sebuah formulir dibagikan di tempat besar atau ada bot yang lolos dari filter.

Apa yang terjadi pada email notifikasi di jam yang sibuksatu formulir, satu jam UTCkiriman 1sampai 50satu emailmasing-masing,detik kemudiankiriman ke-51dst.disimpan, masukringkasanjam berakhirsatu ringkasan performulirbatas tercapaijam berikutnyaApa yang terjadi pada email notifikasi di jam yang sibuksatu formulir, satu jam UTCkiriman 1 sampai 50satu email masing-masing, detikkemudiankiriman ke-51 dst.disimpan, masuk ringkasanjam berakhirsatu ringkasan per formulirbatas tercapaijam berikutnya
  1. 50 kiriman pertama ke sebuah formulir dalam satu jam masing-masing mengirim email seperti biasa.
  2. Kiriman berikutnya di jam yang sama disimpan dan langsung tampil di dashboard, tanpa email untuk masing-masing.
  3. Setelah jam itu berakhir, setiap penerima mendapat satu ringkasan yang menghitungnya dan menautkan ke dashboard.
Batas dihitung per formulir, jadi lonjakan di satu formulir tidak memperlambat formulir lain. Webhook tidak dibatasi dan tetap terkirim untuk setiap kiriman.

Subjek ringkasan berisi jumlah dan nama formulir, tanpa daftar field dan tanpa reply-to, jadi jawab pesan-pesan itu dari dashboard. Jika Anda sering melewati batas, email bukan saluran yang tepat untuk formulir itu: kirim ke Slack atau inbox bersama lewat webhook sebagai gantinya.

Jauhkan spam dari inbox Anda

Email membuat spam jadi mahal: setiap kiriman bot adalah notifikasi yang dibuka seseorang. Ikiform menyimpan spam dengan jawaban sukses biasa, jadi bot tidak belajar apa-apa, dan tidak mengirim email untuknya. Empat hal menentukan apa yang dianggap spam:

PertahananYang ditangkapSetup
HoneypotBot yang mengisi setiap inputInput tersembunyi _gotcha
Skor spamLink di field nama, tiga link atau lebih, frasa spam yang dikenal, alamat sekali pakai, dan kiriman identik berulang. Pada skor 5, kiriman dianggap spamTidak ada
Domain yang diizinkanKiriman dari situs lainTambahkan domain Anda di pengaturan formulir
Pemeriksaan manusiaBot yang menjalankan browser sungguhanAtur Spam check ke Ikiform

Sesekali cek filter Spam di dashboard. Jika ada pesan asli yang masuk ke sana, tandai sebagai bukan spam dan emailnya akan dikirim saat itu. Dokumentasi spam menjelaskan setiap sinyal, termasuk kapan sebaiknya menyalakan pemeriksaan manusia.

Yang tidak bisa dilakukan email

Ikiform tidak mengirim email ke orang yang mengisi formulir. Email notifikasi hanya dikirim ke Anda dan tim, jadi tidak ada autoresponder, email konfirmasi, atau double opt-in. Kirim semua itu dari alat email Anda, dipicu oleh webhook. Jika situs Anda menjanjikan "pesan Anda sudah kami terima", tampilkan itu di halaman setelah formulir dikirim, seperti yang sudah dilakukan kode di atas.

  • Inbox tim bersama. Tambahkan alamat tim sebagai penerima, atau teruskan dari penyedia email Anda.
  • Kanal chat. Kirim setiap kiriman ke Slack, Discord, atau Microsoft Teams lewat webhook. Chat cocok untuk formulir yang menerima lebih dari beberapa pesan per hari.
  • Spreadsheet atau CRM. Google Sheets, atau alat apa pun lewat Zapier atau n8n.
  • Lampiran. Unggahan file belum didukung. Kiriman berisi file mendapat 422 files_not_supported. Minta link ke file yang dibagikan sebagai gantinya.

Mematikan email

Beberapa formulir lebih baik tanpa email, seperti pendaftaran newsletter yang ramai. Matikan Email new submissions di pengaturan Notifications formulir. Kiriman tetap disimpan, dan webhook tetap terkirim.

Batasnya lebih rendah di workspace baru: 10 email per formulir per jam selama 7 hari pertama. Jika Anda menguji dengan skrip, ringkasan akan datang lebih cepat dibanding nanti.

Pilih situasi Anda

Setup di atas sama di mana saja. Halaman-halaman ini membahas inbox tertentu, stack tertentu, atau alat yang sedang Anda tinggalkan.

Pastikan berfungsi

Jalankan langkah-langkah ini sebelum formulir live. Ikiform tidak punya paket gratis. Pengujian gratis: workspace tanpa paket menerima 50 kiriman uji per bulan dari localhost. Untuk go live, pilih Pro mulai $6/bln untuk 500 kiriman, atau bayar sekali: 10.000 kiriman seharga $49 atau 50.000 kiriman seharga $149, dengan kredit yang tidak pernah kedaluwarsa. Lihat harga.

  1. Di Allowed domains formulir, tambahkan domain situs Anda, ditambah localhost selama pengembangan. Biarkan kosong untuk menerima kiriman dari mana saja.
  2. Di pengaturan Notifications formulir, pastikan Email new submissions menyala dan orang yang tepat sudah dicentang.
  3. Isi formulir di halaman Anda lalu kirim. Anda mendarat di halaman terima kasih Anda, atau halaman hosted milik Ikiform.
  4. Buka Submissions di dashboard. Kiriman baru ada di sana dengan setiap field yang Anda kirim.
  5. Buka email notifikasi. Subjeknya New submission: diikuti nama formulir, dan setiap field yang Anda kirim tercantum.
  6. Tekan Reply. Baris To menampilkan alamat yang Anda ketik di formulir, bukan alamat Ikiform.
  7. Kirim dengan honeypot terisi, _gotcha=bot. Kiriman tetap mendapat jawaban sukses, tetapi disimpan sebagai spam dan tidak memicu email atau webhook.
  8. Tidak ada yang masuk? Ubah filter status di dashboard ke Spam. Spam mendapat jawaban sukses yang sama dengan kiriman asli.

Pemecahan masalah

MasalahYang harus dilakukan
Kiriman ada di dashboard tetapi tidak ada email yang datangCek dulu folder spam atau promosi, lalu tambahkan notifications@ikiform.com ke kontak Anda. Setelah itu cek pengaturan Notifications formulir: email mungkin mati, alamat luar mungkin masih berstatus Waiting for confirmation, atau menampilkan Emails bounced.
Kiriman ada di dashboard tetapi tidak ada email atau webhook yang datangKiriman itu disimpan sebagai spam. Spam tidak mengirim apa pun. Buka di filter Spam untuk melihat alasannya, dan tandai sebagai bukan spam untuk mengirim email dan webhook-nya.
Reply terkirim ke notifications@ikiform.comTidak ditemukan reply-to. Beri nama field email salah satu dari email, email_address, your_email, reply_to, contact_email, atau tambahkan field _replyto berisi alamat pengunjung.
Email berhenti dan yang datang malah ringkasanFormulir melewati 50 email dalam satu jam (10 di workspace baru). Semuanya ada di dashboard. Cari lonjakan bot di Spam, atau pakai webhook untuk formulir yang ramai.
_subject tidak mengubah subjek_subject tidak mengubah subjek email notifikasi. Nilainya diteruskan ke webhook dan API sebagai meta.subject.
403 origin_not_allowed, atau setiap kiriman masuk ke spamDomain halaman tidak ada di Allowed domains formulir. Tambahkan, ditambah localhost untuk uji lokal. Subdomain dari domain yang terdaftar diizinkan.
422 validation_failedKiriman tidak cocok dengan definisi field formulir. error.fields menyebutkan setiap field dan alasannya. Samakan name input dengan ID field.
402 test_limit_reachedWorkspace belum punya paket dan sudah memakai 50 uji gratis dari localhost bulan ini. Pilih paket, atau pakai Send test di dashboard.

Pertanyaan

Mentok di salah satu langkah, atau ingin panduan untuk situasi Anda? Email hello@ikiform.com.