Kirim formulir ke email Anda

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.

Preet SutharPendiri, Ikiform

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:

contact.php
<?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:

MasalahPenyebabnya
Tidak ada PHP di hostingGitHub 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 hilangmail() 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 tersimpanJika 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.

Formulir yang sama dengan mail() PHP dan dengan form backenddengan contact.phpdengan form backendformulir Andaaction="/contact.php"mail()From: pengunjung,dikirim hostingfolder spamgagal SPF danDMARCformulir Andafield sama, actionbaruIkiformsaring spam, simpaninbox AndaReply-To:pengunjungkirimemail lokalkirimemailFormulir yang sama dengan mail() PHP dan dengan form backenddengan contact.phpdengan form backendformulir Andaaction="/contact.php"mail()From: pengunjung, dikirimhostingfolder spamgagal SPF dan DMARCformulir Andafield sama, action baruIkiformsaring spam, simpaninbox AndaReply-To: pengunjungkirimemail lokalkirimemail
  1. 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.
  2. 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.
Solusi untuk deliverability bukan skrip yang lebih baik, melainkan mengirim dari domain yang memang diizinkan mengirim.

Pindahkan formulir dari PHP

Pertahankan nama field persis seperti semula. Hanya action yang berubah, ditambah dua input tersembunyi:

Sebelum
<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>
Sesudah
<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.phpSekarang
$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: $emailOtomatis, 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 tulisHoneypot _gotcha, skor spam, rate limit, dan validasi field
  • Tambahkan domain Anda di Allowed domains. _redirect hanya berfungsi untuk URL https: di salah satu domain tersebut.
  • Hapus contact.php dari 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.php tidak ada lagi. Bot yang mengirim langsung ke sana mendapat 404, dan itu tidak masalah.
Jika formulir Anda berupa plugin WordPress, bukan skrip, idenya sama. Panduan WordPress menunjukkan di mana menaruh formulir pada block theme.

Pastikan berfungsi

  1. Di Allowed domains formulir, tambahkan domain situs Anda, ditambah localhost selama pengembangan. Biarkan kosong untuk menerima kiriman dari mana saja.
  2. Kirim formulir di halaman live Anda. Anda mendarat di thanks.html lama Anda.
  3. Buka Submissions di dashboard. Kiriman baru ada di sana dengan setiap field yang Anda kirim.
  4. Buka emailnya. Email datang dari Ikiform, bukan dari alamat pengunjung, dan tidak masuk spam. Tambahkan pengirimnya ke kontak agar email berikutnya juga tidak.
  5. Tekan Reply. Alamat pengunjung ada di baris To.
  6. 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 bernama email atau 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 _subject diteruskan 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

MasalahYang 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 spamDomain halaman tidak ada di Allowed domains formulir. Tambahkan, ditambah localhost untuk uji lokal. Subdomain dari domain yang terdaftar diizinkan.
Formulir masih mengirim ke file PHPHalaman 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 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.

Pertanyaan

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