Cara Membuat Form Kirim Email di PHP

Pada kesempatan kali ini saya menjelaskan cara mengirim email dari form HTML lalu datanya diteruskan sampai ke alamat email tertentu dengan bantuan PHP mail sender. Contoh kasus yang paling umum, ketika ada pengunjung mengisi form contact di website lalu submit, email otomatis terbentuk berisi data yang diisikan pengunjung tadi. environment yang saya pakai di sini:
- Akun email SMTP (saya pakai Gmail)
- Library PHPMailer via Composer
- Bootstrap template HTML
pastikan kalian sudah menginstall PHP dulu. buat yang belum, bisa ikuti Cara install PHP di Windows dan Berjalan di CMD (Command Prompt) dan baca juga post saya tentang form di html dan php Belajar Membuat Halaman Form Login Dengan PHP, MySql, dan HTML
Persiapan akun SMTP Gmail dengan App Password
SMTP adalah singkatan dari Simple Mail Transfer Protocol, standar internet untuk transmisi email. jadi dengan protokol ini kalian bisa kirim email lewat PHP. akun email yang menyediakan akses SMTP itu banyak, yang paling umum dipakai di tutorial adalah Gmail.
Dulu cara aktivasi SMTP Gmail itu tinggal mengaktifkan fitur “Izinkan aplikasi yang kurang aman” di halaman myaccount.google.com/lesssecureapps. tapi sejak tahun 2022 fitur ini sudah dihapus Google, jadi sekarang cara yang benar adalah pakai App Password. berikut langkahnya:
1. Aktifkan 2-Step Verification
- buka https://myaccount.google.com/security
- klik 2-Step Verification lalu aktifkan
- ikuti langkah verifikasi yang diminta (nanti masukin nomor HP atau aplikasi authenticator)
tanpa 2-Step Verification ini, menu App Password tidak akan muncul di akun kalian.
2. Buat App Password
- buka https://myaccount.google.com/apppasswords
- di bagian App name, isi nama bebas misal “PHPMailer”
- klik Create, nanti Google menampilkan password 16 karakter sekali saja
- simpan password itu baik-baik, dia yang bakal kita pakai sebagai
$mail->Password
App Password ini khusus untuk aplikasi, bukan password login Gmail biasa. jadi walaupun bocor, orang tidak bisa masuk ke akun Gmail kalian dengan password ini. jauh lebih aman dari cara lama yang mengaktifkan akses aplikasi kurang aman.
kalau kalian cuma mau tes di localhost tanpa takut email benar-benar terkirim ke orang, bisa juga pakai Mailtrap (https://mailtrap.io). daftar gratis, nanti kasih SMTP host sandbox.smtp.mailtrap.io, username dan password dari dashboard-nya. email yang dikirim tidak sampai ke inbox asli, cuma ke inbox virtual Mailtrap. cocok untuk uji coba.
Install PHPMailer via Composer
cara paling rapi mendapatkan PHPMailer adalah lewat Composer, bukan download zip manual seperti dulu. di folder project, jalankan:
composer require phpmailer/phpmailer
setelah selesai akan muncul folder vendor/ dan file composer.json. kalau belum punya Composer, ikuti Cara Install Composer di Windows.
Mencoba mengirim email pertama dengan PHPMailer
buat file kirim.php lalu isi dengan code berikut. perhatikan username dan password sekarang saya ambil dari environment variable, bukan ditulis mentah di kode:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
// ganti dengan email dan app password kalian
$gmailUser = getenv('GMAIL_USER') ?: '[email protected]';
$gmailPass = getenv('GMAIL_PASS'); // isi lewat terminal, jangan di sini
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = $gmailUser;
$mail->Password = $gmailPass;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // SSL
$mail->Port = 465;
$mail->setFrom($gmailUser, 'Nama Website');
$mail->addAddress('[email protected]', 'Nama Penerima');
$mail->isHTML(true);
$mail->Subject = 'Pesan dari Form Contact';
$mail->Body = '<b>Halo, ini email dari PHPMailer.</b>';
if ($mail->send()) {
echo 'Berhasil Mengirim Email Dengan PHP';
}
} catch (Exception $e) {
echo 'Mailer Error: ' . $mail->ErrorInfo;
}
cara menjalankannya dengan environment variable di terminal (biar password tidak ikut tersimpan di file):
# windows CMD
set GMAIL_PASS=abcdefghijklmnop
php kirim.php
# linux / mac
GMAIL_PASS=abcdefghijklmnop php kirim.php
Penjelasan :
require_once __DIR__ . '/vendor/autoload.php';: memanggil autoload dari Composer supaya class PHPMailer langsung ke-loaduse PHPMailer\PHPMailer\PHPMailer;: mengimpor class PHPMailer supaya bisa dipakai tanpa menulis namespace panjang$mail->isSMTP();: memilih tipe SMTP untuk mengirim email$mail->Host = 'smtp.gmail.com';: host SMTP yang disarankan Gmail$mail->SMTPAuth = true;: mengaktifkan autentikasi$mail->Username: email Gmail yang dipakai mengirim$mail->Password: App Password dari akun Google, bukan password login biasa$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;: protokol SSL (port 465). kalau mau pakai TLS (port 587) ganti denganENCRYPTION_STARTTLS$mail->addAddress(...): alamat email tujuan dan nama penerima$mail->isHTML(true);: memberitahu bahwa isi body berupa HTML$mail->Body: isi email dalam HTML- jika
send()mengembalikan false,$mail->ErrorInfomenampilkan pesan error dari server SMTP
Membuat Contact Form HTML dengan Bootstrap
setelah akun SMTP siap, sekarang kita buat form contact-nya. kita butuh input nama, nomor telepon, email pengirim, dan pesan. file ini saya simpan sebagai index.php supaya bisa menampilkan pesan sukses atau gagal dari session:
<!-- index.php -->
<?php session_start(); ?>
<!DOCTYPE html>
<html lang="id-ID">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- Bootstrap CSS -->
<link href="css/bootstrap.min.css" rel="stylesheet" />
<title>Kirim email dengan Form HTML</title>
</head>
<body>
<div class="container">
<main>
<div class="p-3">
<div class="text-center">
<?php
if (isset($_SESSION["message"])) {
echo '<div class="alert alert-info">' . $_SESSION["message"] . '</div>';
unset($_SESSION["message"]);
}
?>
<h4 class="mb-3">Contact Form</h4>
</div>
<form action="email.php" method="POST">
<div class="row g-3">
<div class="col-12">
<label for="nama" class="form-label">Nama :</label>
<input name="nama" type="text" class="form-control" id="nama" placeholder="Nama Kamu" />
</div>
</div>
<div class="row mt-2">
<div class="col-12">
<label for="phone" class="form-label">Nomor Telepon :</label>
<input name="phone" type="tel" class="form-control" id="phone" placeholder="Nomor yang bisa dihubungi" />
</div>
</div>
<div class="row mt-2">
<div class="col-12">
<label for="email" class="form-label">Email :</label>
<input name="email" type="email" class="form-control" id="email" placeholder="Email kamu untuk kami balas" />
</div>
</div>
<div class="row mt-2">
<div class="col-12">
<label for="pesan" class="form-label">Pesan dan Kesan :</label>
<textarea name="pesan" class="form-control" id="pesan" style="height: 100px" placeholder="Pesan yang disampaikan"></textarea>
</div>
</div>
<hr class="my-4" />
<button class="w-100 btn btn-primary btn-lg" type="submit">Kirim</button>
</form>
</div>
</main>
</div>
<script src="js/bootstrap.bundle.min.js"></script>
</body>
</html>
Integrasi form dengan PHP dan PHPMailer
tahap terakhir, buat file email.php untuk memproses data form lalu mengirimnya lewat SMTP. username dan password saya pindahkan ke environment variable supaya tidak tertulis di kode:
<?php
// email.php
require_once __DIR__ . '/vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
session_start();
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: index.php');
exit;
}
$nama = $_POST['nama'] ?? '';
$phone = $_POST['phone'] ?? '';
$email = $_POST['email'] ?? '';
$pesan = $_POST['pesan'] ?? '';
if ($nama === '' || $phone === '' || $email === '' || $pesan === '') {
$_SESSION["success"] = false;
$_SESSION["message"] = 'nama, phone, email, atau pesan wajib di isi';
header('Location: index.php');
exit;
}
$gmailUser = getenv('GMAIL_USER') ?: '[email protected]';
$gmailPass = getenv('GMAIL_PASS');
$kirimPesan = "ada pesan dari: $nama\n";
$kirimPesan .= " | phone: $phone\n";
$kirimPesan .= " | email: $email\n";
$kirimPesan .= " | pesan: $pesan\n";
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = $gmailUser;
$mail->Password = $gmailPass;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 465;
$mail->setFrom($gmailUser, 'Contact Form Website');
$mail->addAddress('[email protected]', 'Pemilik Website');
$mail->isHTML(false);
$mail->Subject = 'Ada pesan dari form contact';
$mail->Body = $kirimPesan;
$mail->send();
$_SESSION["success"] = true;
$_SESSION["message"] = 'Berhasil mengirim email';
} catch (Exception $e) {
$_SESSION["success"] = false;
$_SESSION["message"] = 'ada masalah di server kami: ' . $mail->ErrorInfo;
}
header('Location: index.php');
jalankan dengan php -S localhost:8000 dari folder project lalu buka http://localhost:8000, isi form, dan klik Kirim. kalau settingan SMTP benar, email bakal masuk ke inbox tujuan.
Catatan keamanan : jangan pernah menaruh App Password atau password email langsung di dalam file PHP yang bisa ikut ter-commit ke GitHub. selalu simpan di environment variable atau file .env yang di-ignore, dan putar ulang App Password-nya kalau terlanjur tersebar.
Pertanyaan yang Sering Diajukan
Cara kirim email dari form HTML ke Gmail di PHP?
Gunakan library PHPMailer via Composer, konfigurasi SMTP Gmail (smtp.gmail.com port 465 SSL atau 587 TLS), dan isi Username dengan email Gmail serta Password dengan App Password yang dibuat di akun Google.
Kenapa "Izinkan aplikasi yang kurang aman" tidak ada di akun Gmail saya?
Fitur itu sudah dihapus Google sejak 2022. Gantinya pakai App Password: aktifkan 2-Step Verification dulu, lalu buat App Password khusus di halaman myaccount.google.com/apppasswords.
Di mana menyimpan username dan password Gmail supaya aman?
Jangan tulis langsung di kode. Simpan di environment variable (misal .env) lalu panggil dengan getenv() atau variabel $GMAIL_USER dan $GMAIL_PASS, supaya tidak ikut terbaca saat kode dibagikan.
Untuk development di localhost, SMTP apa yang gratis?
Gunakan Mailtrap (mailtrap.io). Email tidak benar-benar terkirim tapi masuk ke inbox virtual, jadi aman untuk tes tanpa mengirim email sungguhan ke orang.

