Kirim formulir ke email Anda5 menit baca
Kirim formulir HTML ke email tanpa PHP
Ganti skrip contact.php yang memanggil mail() dengan formulir yang mengirim ke endpoint hosted, dengan nama field, halaman terima kasih, dan balasan tetap sama.
Ubah action formulir dari skrip PHP Anda ke URL form backend, pertahankan nama field, lalu hapus skripnya. Backend mengerjakan apa yang dulu dikerjakan mail(), ditambah bagian yang tidak pernah dikerjakannya dengan baik: penyaringan spam, penyimpanan, dan email yang tidak masuk spam. Ini berfungsi di hosting statis yang sama sekali tidak bisa menjalankan PHP.
Apa yang berbeda di sini
Kebanyakan formulir kontak PHP adalah dua puluh baris yang sama, disalin dari tutorial bertahun-tahun lalu. Isinya membaca $_POST, menyusun string, memanggil mail(), lalu me-redirect. Ini contoh yang umum:
<?php
$name = $_POST["name"];
$email = $_POST["email"];
$phone = $_POST["phone"];
$message = $_POST["message"];
$to = "hello@example.com";
$subject = "Website enquiry from $name";
$body = "Name: $name\nEmail: $email\nPhone: $phone\n\n$message";
$headers = "From: $email\r\nReply-To: $email";
if (mail($to, $subject, $body, $headers)) {
header("Location: /thanks.html");
} else {
echo "Sorry, something went wrong.";
}Kelihatannya tidak berbahaya, dan memang berfungsi saat ditulis. Sekarang ia rusak dalam empat cara, dan hanya yang pertama yang terlihat jelas:
| Masalah | Penyebabnya |
|---|---|
| Tidak ada PHP di hosting | GitHub Pages, Netlify, Vercel, Cloudflare Pages, dan S3 menyajikan file; mereka tidak menjalankan PHP. Formulir mengirim ke file yang tidak pernah dieksekusi, dan Anda mendapat 404 atau 405. |
| Email masuk spam, atau hilang | mail() menyerahkan pesan ke program email lokal di server. Header From: mengaku berasal dari alamat pengunjung, tetapi email keluar dari server hosting Anda, sehingga gagal di pemeriksaan SPF dan DMARC domain pengunjung. Gmail dan Outlook menyaring atau menolaknya, sering kali tanpa pemberitahuan. |
| Header injection | $email masuk ke header tanpa diperiksa. Bot yang mengirim nilai berisi baris baru bisa menambahkan baris Bcc: sendiri dan memakai formulir Anda untuk mengirim spam, yang membuat IP hosting Anda masuk daftar blokir. |
| Tidak ada yang tersimpan | Jika emailnya hilang, pesannya pun hilang. Tidak ada catatan, tidak ada filter spam, dan tidak ada cara melihat kembali pertanyaan bulan lalu. |
Anda bisa memperbaiki masing-masing: validasi setiap nilai, kirim lewat penyedia SMTP dengan library seperti PHPMailer, siapkan SPF dan DKIM untuk domain Anda, tambahkan honeypot dan rate limit, lalu catat ke database. Itu proyek yang masuk akal jika Anda sudah menjalankan PHP. Jika tidak mau repot, pindahkan pekerjaannya ke form backend.
- Dengan contact.php, formulir mengirim ke hosting Anda, dan mail() mengirim pesan yang mengaku berasal dari pengunjung. Server penerima melihat pengirim yang tidak cocok dengan domainnya lalu memasukkannya ke spam atau membuangnya.
- Dengan form backend, formulir mengirim field yang sama ke Ikiform. Ikiform mengirim email dari domainnya sendiri dan menaruh alamat pengunjung di Reply-To, memang untuk itulah Reply-To ada.
Pindahkan formulir dari PHP
Pertahankan nama field persis seperti semula. Hanya action yang berubah, ditambah dua input tersembunyi:
<form action="/contact.php" method="post">
<input name="name" required />
<input name="email" type="email" required />
<input name="phone" type="tel" />
<textarea name="message" required></textarea>
<button>Send</button>
</form><form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
<input name="name" required />
<input name="email" type="email" required />
<input name="phone" type="tel" />
<textarea name="message" required></textarea>
<input type="hidden" name="_redirect" value="https://example.com/thanks.html" />
<input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
<button>Send</button>
</form>Lalu petakan setiap hal yang dulu dikerjakan skrip ke tempatnya sekarang:
| Di contact.php | Sekarang |
|---|---|
$to = "hello@example.com" | Penerima di pengaturan Notifications formulir |
header("Location: /thanks.html") | Input tersembunyi _redirect, atau Redirect after submit di pengaturan formulir |
Reply-To: $email | Otomatis, karena field-nya bernama email |
$subject = "Website enquiry from $name" | Tetap New submission: <form name>. Beri nama formulir "Website enquiry" agar kata-katanya tetap sama |
echo "Sorry, something went wrong." | Halaman error Ikiform untuk kiriman biasa, atau pesan Anda sendiri dengan fetch |
| Pemeriksaan yang tidak pernah Anda tulis | Honeypot _gotcha, skor spam, rate limit, dan validasi field |
- Tambahkan domain Anda di Allowed domains.
_redirecthanya berfungsi untuk URLhttps:di salah satu domain tersebut. - Hapus
contact.phpdari server setelah formulir baru berfungsi. Skrip yang terlupakan tetap menjadi mail relay terbuka bagi bot yang masih ingat URL-nya. - Jika Anda pindah ke hosting statis, URL lama
/contact.phptidak ada lagi. Bot yang mengirim langsung ke sana mendapat404, dan itu tidak masalah.
Pastikan berfungsi
- Di Allowed domains formulir, tambahkan domain situs Anda, ditambah
localhostselama pengembangan. Biarkan kosong untuk menerima kiriman dari mana saja. - Kirim formulir di halaman live Anda. Anda mendarat di
thanks.htmllama Anda. - Buka Submissions di dashboard. Kiriman baru ada di sana dengan setiap field yang Anda kirim.
- Buka emailnya. Email datang dari Ikiform, bukan dari alamat pengunjung, dan tidak masuk spam. Tambahkan pengirimnya ke kontak agar email berikutnya juga tidak.
- Tekan Reply. Alamat pengunjung ada di baris To.
- Kirim dengan honeypot terisi,
_gotcha=bot. Kiriman tetap mendapat jawaban sukses, tetapi disimpan sebagai spam dan tidak memicu email atau webhook.
Hal yang sering menjebak
- Nama formulir lama dengan kurung siku. Formulir PHP sering memakai nama seperti
contact[email]. Ikiform menyimpannya apa adanya, tetapi reply-to hanya diambil dari field bernamaemailatau beberapa variasi dekatnya. Ganti nama field-nya, atau tambahkan_replyto. - Subjek tidak bisa memuat nama. Baris subjek di skrip lama memuat nama pengunjung. Subjek notifikasi bersifat tetap, dan
_subjectditeruskan ke webhook dan API tanpa mengubah email. - Encoding karakter. Skrip
mail()sering merusak huruf beraksen karena tidak pernah mengatur charset. Email Ikiform memakai UTF-8, jadi nama dalam aksara apa pun tiba dengan utuh. - Beberapa alamat di
$to. Daftar yang dipisah koma di skrip menjadi penerima terpisah di dashboard. Alamat luar mengonfirmasi lewat link sebelum menerima apa pun. Lihat beberapa penerima.
Jika ada yang salah
| Masalah | Yang harus dilakukan |
|---|---|
| Browser mendarat di halaman terima kasih Ikiform, bukan halaman Anda | _redirect diabaikan kecuali domainnya ada di Allowed domains dan berupa URL https:. Tambahkan domainnya, atau atur Redirect after submit di pengaturan formulir sebagai gantinya. |
403 origin_not_allowed, atau setiap kiriman masuk ke spam | Domain halaman tidak ada di Allowed domains formulir. Tambahkan, ditambah localhost untuk uji lokal. Subdomain dari domain yang terdaftar diizinkan. |
| Formulir masih mengirim ke file PHP | Halaman yang di-cache atau salinan kedua formulir, seperti include di footer, masih memakai action lama. Cari contact.php di seluruh situs. |
| Kiriman ada di dashboard tetapi tidak ada email atau webhook yang datang | Kiriman 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. |
Pertanyaan
Ya. Skrip lama tetap berfungsi sampai Anda mengubah action formulir, jadi Anda bisa menguji endpoint baru di salinan halaman terlebih dulu, lalu beralih dan menghapus skripnya.
Bisa. Arahkan action formulir ke form backend, bukan ke skrip PHP. Backend menerima kiriman dan mengirimi Anda email, sehingga situs Anda bisa berupa HTML biasa di hosting statis mana pun.
Skrip biasanya mengatur header From ke alamat pengunjung, tetapi email keluar dari server hosting Anda. Itu gagal di pemeriksaan SPF dan DMARC domain pengunjung, sehingga Gmail dan Outlook menganggapnya palsu. Form backend mengirim dari domainnya sendiri dan menaruh pengunjung di Reply-To sebagai gantinya.
Tidak. Ikiform menyimpan nama apa pun yang Anda kirim. Beri nama field email email, email_address, your_email, reply_to, contact_email, atau tambahkan field _replyto, agar balasan terkirim ke pengunjung.
Itu memperbaiki deliverability jika Anda mengirim lewat penyedia dengan domain yang sudah disiapkan untuk SPF dan DKIM. Anda tetap butuh hosting PHP, validasi, penyaringan spam, dan tempat menyimpan pesan. Pilihan yang baik jika Anda memang sudah memelihara kode PHP.
Mentok di salah satu langkah, atau ingin panduan untuk situasi Anda? Email hello@ikiform.com.