Banyak pengguna gagal menerima email verifikasi entah karena masuk ke folder spam, salah ketik alamat email, atau token sudah kadaluarsa. Daripada mereka tidak bisa login, sebaiknya kita sediakan fitur Resend Verification Email “Kirim Ulang Email Verifikasi”. Dengan fitur ini, pengguna cukup memasukkan email mereka untuk menerima link verifikasi baru yang aktif dan aman.
Struktur Database
Jika sebelumnya sudah ada tabel users tambahkan kolom baru dengan kolom berikut:
ALTER TABLE users ADD COLUMN is_verified TINYINT(1) DEFAULT 0, ADD COLUMN verify_token VARCHAR(100) DEFAULT NULL, ADD COLUMN verify_expires DATETIME DEFAULT NULL;
Kita bisa langsung gunakan kembali. Kolom verify_expires digunakan untuk membatasi masa berlaku link verifikasi (misal 24 jam).
Form Kirim Ulang Verifikasi
File: resend_verification.php
<?php
include 'config.php';
require 'vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email']);
// Cek apakah email terdaftar dan belum diverifikasi
$stmt = $conn->prepare("SELECT id, username, is_verified FROM users WHERE email=?");
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
$user = $result->fetch_assoc();
if ($user['is_verified'] == 1) {
echo "<p style='color:green'>Akun Anda sudah terverifikasi. Silakan login.</p>";
} else {
// Buat token baru
$token = bin2hex(random_bytes(32));
$expires = date('Y-m-d H:i:s', strtotime('+1 day'));
$id = $user['id'];
$stmt = $conn->prepare("UPDATE users SET verify_token=?, verify_expires=? WHERE id=?");
$stmt->bind_param("ssi", $token, $expires, $id);
$stmt->execute();
$verify_link = "https://yourdomain.com/verify_email.php?token=$token";
// Kirim email verifikasi
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.yourhost.com';
$mail->SMTPAuth = true;
$mail->Username = 'no-reply@yourdomain.com';
$mail->Password = 'yourpassword';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('no-reply@yourdomain.com', 'Support System');
$mail->addAddress($email, $user['username']);
$mail->isHTML(true);
$mail->Subject = 'Kirim Ulang Verifikasi Akun';
$mail->Body = "
<h3>Halo {$user['username']},</h3>
<p>Anda meminta kirim ulang verifikasi akun.</p>
<p>Klik link berikut untuk verifikasi akun Anda (berlaku 24 jam):</p>
<p><a href='$verify_link'>$verify_link</a></p>
<p>Abaikan jika Anda tidak meminta ini.</p>
";
$mail->send();
echo "<p style='color:green'>Link verifikasi baru telah dikirim ke email Anda.</p>";
} catch (Exception $e) {
echo "<p style='color:red'>Gagal mengirim email. Error: {$mail->ErrorInfo}</p>";
}
}
} else {
echo "<p style='color:red'>Email tidak ditemukan di sistem kami.</p>";
}
}
?>
<form method="post">
<h3>Kirim Ulang Verifikasi Akun</h3>
<label>Email:</label><br>
<input type="email" name="email" required><br><br>
<button type="submit">Kirim Ulang Email Verifikasi</button>
</form>
Integrasi di Halaman Login
Tambahkan pesan di halaman login (login.php):
<?php echo "<p style='color:orange'> Akun Anda belum aktif. <a href='resend_verification.php'>Kirim ulang email verifikasi</a> </p>"; ?>
Sehingga jika user belum klik link verifikasi, mereka bisa langsung minta email baru.
Batasi Frekuensi Kirim Ulang (Rate Limiting)
Agar tidak disalahgunakan, sebaiknya batasi pengguna mengirim email verifikasi terlalu sering. Tambahkan kolom last_resend di tabel users:
ALTER TABLE users ADD COLUMN last_resend DATETIME DEFAULT NULL;
Lalu ubah sedikit kode sebelum kirim email:
<?php
$now = time();
$stmt = $conn->prepare("SELECT last_resend FROM users WHERE email=?");
$stmt->bind_param("s", $email);
$stmt->execute();
$res = $stmt->get_result()->fetch_assoc();
if ($res && strtotime($res['last_resend']) > $now - 300) { // 5 menit
echo "<p style='color:red'>Anda hanya bisa mengirim ulang setiap 5 menit.</p>";
exit;
}
// Update waktu terakhir kirim
$stmt = $conn->prepare("UPDATE users SET last_resend=NOW() WHERE id=?");
$stmt->bind_param("i", $id);
$stmt->execute();
?>
Penanganan Token Lama
Untuk keamanan, saat user meminta link baru:
-
Token lama otomatis diganti,
-
Token baru langsung menyimpan waktu kadaluarsa baru,
-
Token lama otomatis tidak berlaku lagi.
Ini mencegah penggunaan ulang link lama yang bocor di email lama.
Pengalaman Pengguna Lebih Baik
Tambahkan informasi di email verifikasi:
“Jika Anda tidak mendaftar di situs ini, abaikan email ini.”
Dan di halaman sukses verifikasi (verify_email.php):
“Akun Anda sudah aktif. Silakan login di sini.”
Kamu juga bisa tambahkan tampilan alert dengan Bootstrap alert atau SweetAlert agar tampil lebih profesional.
Kesimpulan
Dengan menambahkan fitur Kirim Ulang Email Verifikasi, sistem login kamu menjadi lebih ramah pengguna dan profesional.
Kelebihan sistem ini:
-
Token aman & baru setiap kali dikirim ulang,
-
Kadaluarsa otomatis dalam 24 jam,
-
Batasi spam dengan jeda pengiriman,
-
Integrasi penuh dengan sistem login dan registrasi yang sudah ada.