# 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.

Terbit 2026-10-25 · https://ikiform.com/id/guides/send-form-to-email/without-php

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
<?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.

Diagram: Formulir yang sama dengan mail() PHP dan dengan form backend

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`:

```html
<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`:

```html
<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**. `_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](https://ikiform.com/id/docs/guides/wordpress.md) 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](https://ikiform.com/id/guides/send-form-to-email/multiple-recipients.md).

## 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

### Apakah formulir lama tetap berfungsi selama saya beralih?

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.

### Bisakah saya mengirim formulir HTML ke email tanpa PHP?

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.

### Mengapa email dari mail() PHP masuk spam?

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.

### Apakah saya perlu mengubah nama field?

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.

### Apakah PHPMailer dengan SMTP pilihan yang lebih baik?

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.

## Panduan lainnya

- [Kirim formulir ke email Anda](https://ikiform.com/id/guides/send-form-to-email.md): Terima setiap kiriman formulir di inbox tanpa mail server: mengapa mailto: dan mail() PHP gagal, dan setup yang menyaring spam serta memungkinkan Anda membalas.
- [Ke Gmail](https://ikiform.com/id/guides/send-form-to-email/gmail.md): Terima kiriman formulir di Gmail tanpa link mailto:, app password, atau Apps Script, lalu beri label, jauhkan dari spam, dan balas dari Gmail.
- [Balas dari inbox Anda](https://ikiform.com/id/guides/send-form-to-email/reply-to.md): Buat Reply di notifikasi formulir membalas ke orang yang mengisi formulir: nama field yang berfungsi, kapan memakai _replyto, dan mengapa balasan bisa nyasar.
- [Beberapa penerima](https://ikiform.com/id/guides/send-form-to-email/multiple-recipients.md): Kirim email dari satu formulir ke seluruh tim, atau arahkan setiap pesan ke orang yang tepat berdasarkan topik, tanpa membiarkan formulir sendiri memilih siapa yang menerima email.
- [Alternatif EmailJS](https://ikiform.com/id/guides/send-form-to-email/emailjs-alternative.md): Pindahkan formulir kontak dari EmailJS: mengapa key email di sisi browser berisiko, apa yang berubah di kode Anda, dan apa yang Anda lepaskan, seperti balasan otomatis.
- [Next.js](https://ikiform.com/id/guides/send-form-to-email/nextjs.md): Dua cara mengirim email dari formulir Next.js dengan Server Action: kirim sendiri dengan Resend atau Nodemailer, atau teruskan ke form backend, dibandingkan secara jujur.
