Rumah > Artikel > pembangunan bahagian belakang > Cara Menyediakan Pengesahan E-mel dalam PHP melalui Token Pengesahan: Panduan Lengkap
Pengesahan e-mel ialah proses memastikan alamat e-mel wujud dan boleh menerima e-mel. Manakala, pengesahan e-mel menyemak sama ada alamat diformat dengan betul; iaitu - ditulis mengikut piawaian tertentu (cth. UTF-8).
Dalam artikel ini, saya akan bercakap tentang pengesahan e-mel PHP dan cara menggunakannya untuk pembangunan web dan pengesahan pengguna melalui token pengesahan. Artikel itu melibatkan beberapa tutorial mikro, termasuk:
Konfigurasi PHPMail dengan Mailtrap
Penciptaan borang HTML yang mudah
Pengesahan alamat e-mel asas
Menjana dan menyimpan token dan bukti kelayakan dalam pangkalan data SQL
Menghantar pengesahan e-mel dengan token pengesahan
E-mel ujian yang berkaitan dengan pengesahan
Jadi, mari kita lakukannya.
Untuk menghantar e-mel pengesahan, anda boleh menggunakan fungsi mel() terbina dalam PHP atau perpustakaan seperti PHPMailer, yang menawarkan lebih banyak ciri dan kebolehpercayaan yang lebih baik.
Memandangkan saya ingin menjadikan tutorial sebagai selamat dan sedia pengeluaran yang mungkin, saya akan menggunakan 'PHPMailer'. Semak kod untuk memasang PHPMailer melalui Komposer:
komposer memerlukan phpmailer/phpmailer
Mengapa menggunakan Mailtrap API/SMTP?
Ini adalah platform penghantaran e-mel untuk menguji, menghantar dan mengawal e-mel anda di satu tempat. Dan, antara lain, anda mendapat perkara berikut:
Tetapan konfigurasi sedia untuk pelbagai bahasa, termasuk PHP & Laravel.
SMTP dan API dengan SDK dalam bahasa utama, termasuk PHP.
Analisis terbaik industri.
27/7 Sokongan manusia, dan prosedur pantas untuk kes-kes yang mendesak.
Semua itu membolehkan anda bootstrap proses pengesahan e-mel dan memastikannya selamat dan stabil untuk semua.
Beralih ke tetapan untuk mengkonfigurasi PHPMailer dengan Mailtrap:
$phpmailer = new PHPMailer(); $phpmailer->isSMTP(); $phpmailer->Host = 'live.smtp.mailtrap.io'; $phpmailer->SMTPAuth = true; $phpmailer->Port = 587; $phpmailer->Username = 'api'; $phpmailer->Password = 'YOUR_MAILTRAP_PASSWORD';
Berikut ialah persediaan PHPMailer:
use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'vendor/autoload.php'; function sendVerificationEmail($email, $verificationCode) { $mail = new PHPMailer(true); try { // Server settings $mail->isSMTP(); $mail->Host = 'live.smtp.mailtrap.io'; $mail->SMTPAuth = true; $mail->Username = 'api'; $mail->Password = 'YOUR_MAILTRAP_PASSWORD'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587; // Recipients $mail->setFrom('youremail@example.com', 'Your Website'); $mail->addAddress($email); // Content $mail->isHTML(false); $mail->Subject = 'Email Verification'; $mail->Body = "Your verification code is: $verificationCode"; $mail->send(); return true; } catch (Exception $e) { return false; } }
Perhatikan bahawa kod di atas tidak menghantar token pengesahan (klik di sini untuk melompat ke coretan kod dengan token pengesahan). Ini hanyalah contoh cara menyediakan Mailtrap SMTP dan mentakrifkan fungsi pengesahan. Berikut ialah pecahan pantas perkara penting:
Kelas PHPMail dan Pengecualian diimport.
sendVerificationEmail($email, $verificationCode) ialah definisi fungsi.
Objek PHPMailer baharu dicipta.
Blok cuba-tangkap mengendalikan pengecualian semasa penghantaran e-mel.
Tetapan pelayan ditetapkan kepada Mailtrap mengikut konfigurasi teladan.
Kandungan e-mel ditetapkan kepada isHTML(false) untuk teks biasa.
Petua:
Kandungan e-mel boleh difaktorkan semula kepada HTML.
Disebabkan oleh had pemprosesan, anda harus mengelak daripada menggunakan gmail.com sebagai geganti SMTP borang pendaftaran. Tetapi jika anda benar-benar ingin mencipta fail PHP mel dan menghantar melalui Gmail, semak tutorial ini.
Di bawah adalah borang pendaftaran yang mudah, ia mengandungi pengepala dan maklumat akaun pengguna (nama pengguna, e-mel dan kata laluan).
Ia tidak mempunyai sebarang helaian gaya CSS atau kelas div kerana ini hanyalah contoh.
Walau bagaimanapun, saya menasihati anda untuk memasukkan ini pada pengeluaran dan menyelaraskannya dengan bahasa reka bentuk jenama anda. Jika tidak, borang anda mungkin kelihatan tidak profesional dan pengguna akan keberatan untuk terlibat dengannya.
<!DOCTYPE html> <html> <head> <title>Register</title> </head> <body> <form action="register.php" method="post"> <label>Username:</label> <input type="text" name="username" required> <br> <label>Email:</label> <input type="email" name="email" required> <br> <label>Password:</label> <input type="password" name="password" required> <br> <input type="submit" name="register" value="Register"> </form> </body> </html>
Petua Bonus Pro - Pertimbangkan untuk menggunakan JavaScript dengan borang anda
Jika anda mahukan tutorial penuh tentang cara membuat borang hubungan PHP yang termasuk reCaptcha, semak video di bawah ⬇️.
JS boleh mengesahkan input pengguna dalam masa nyata, memberikan maklum balas segera tentang ralat tanpa perlu memuatkan semula halaman.
Dengan menangkap ralat pada bahagian klien, JS boleh mengurangkan bilangan permintaan tidak sah yang dihantar ke pelayan, dengan itu mengurangkan beban pelayan dan meningkatkan prestasi untuk setiap sesi.
Menggunakan AJAX, JS boleh menghantar dan menerima data daripada pelayan tanpa memuatkan semula halaman, memberikan pengalaman pengguna yang lebih lancar.
Sekarang, saya akan beralih ke pengesahan alamat e-mel.
Berikut ialah skrip mudah untuk menyemak domain dan rekod MX. Ia pada asasnya membolehkan anda mengesahkan e-mel dengan melakukan carian MX.
<?php // This method checks if the domain part of the email address has a functioning mail server. $email = "user@example.com"; list($user, $domain) = explode(separator:"@", $email) if (filter_var($email, filter:FILTER_VALIDATE_EMAIL) && getmxrr($domain, &hosts: $mxhosts)){ echo "Valid email address with a valid mail server" . PHP_EOL; } else { echo "Invalid email address or no valid mail server found" . PHP_EOL; }
Walau bagaimanapun, skrip tidak menghantar e-mel untuk pengaktifan dan pengesahan pengguna. Selain itu, ia tidak menyimpan sebarang data dalam MySQL.
Untuk itu, saya akan melakukan perkara berikut dalam bahagian seterusnya:
Jana token pengesahan
Buat skema PHP MySQL untuk menyimpan bukti kelayakan daripada borang pendaftaran
Send the verification email with the token
Verify the verification token
Tip: Similar logic can be applied to a logout/login form.
A verification token is a unique string generated for each user during registration. This token is included in the verification email and there are two methods to generate it.
Method 1
The first method leverages the bin2hex command to create a random token with the parameter set to (random_bytes(50)).
$token = bin2hex(random_bytes(50));
Method 2
Alternatively, you can generate the token with the script below. And I’ll be using that script in the email-sending script.
<?php function generateVerificationCode($length = 6) { $characters = '0123456789'; $code = ''; for ($i = 0; $i < $length; $i++) { $code .= $characters[rand(0, strlen($characters) - 1)]; } return $code; } ?>
Before sending the verification email, it’s vital to ensure you properly handle and store user data. I’ll use a simple SQL schema to create the users table and store the generated token in the database along with the user's registration information.
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, password VARCHAR(255) NOT NULL, token VARCHAR(255) DEFAULT NULL, is_verified TINYINT(1) DEFAULT 0 );
Quick breakdown:
The script above creates a users table with the following columns:
id - Unique identifier for each user, automatically incremented.
username - The user's username; it cannot be null.
email - The user's email address; it cannot be null.
password - The user's password (hashed); it cannot be null.
token - A verification token, which can be null.
is_verified - A flag indicating whether the user is verified (0 for not verified, 1 for verified), with a default value of 0.
Overall, the script below is amalgamation of everything previously discussed in the article and it’s designed to:
Generate a random numeric verification code.
Send the verification email to a specified email address using PHPMailer.
Configure the email server settings.
Handle potential errors.
Provide feedback on whether the email was successfully sent.
Note that the script is geared towards Mailtrap users and it leverages the SMTP method.
<?php require 'vendor/autoload.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP use PHPMailer\PHPMailer\Exception; //Function to generate a random verification code 1 usage function generateVerificationCode($length = 6) { $characters = '0123456789'; $code = ''; for ($i = 0; $i < $length; $i++) { $code .= $characters[rand(0, strlen($characters) - 1)]; } return $code; } // Function to send a verification email using PHPMailer 1 usage function sendVerificationEmail($email, $verificationCode) { $mail = new PHPMailer (exception: true); try { // Server settings $mail ->SMTPDebug = SMTP::DEBUG_OFF; // Set to DEBUG_SERVER for debugging $mail ->isSMTP(); $mail ->Host = 'live.smtp.mailtrap.io'; // Mailtrap SMTP server host $mail ->SMTPAuth = true; $mail ->Username = 'api'; // Your Mailtrap SMTP username $mail ->Password = 'YOUR_MAILTRAP_PASSWORD'; // Your Mailtrap SMTP password $mail ->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption $email ->Port = 587; // TCP port to connect to //Recipients $mail->setFrom(address:'mailtrapclub@gmail.com', name:"John Doe"); //Sender's email and name $mail->addAddress($email); // Recipient's email //Content $mail->isHTML(isHTML:false); //Set to true if sending HTML email $mail->Subject = 'Email Verification'; $mail->Body = "Your verification code is: $verificationCode"; $mail->send(); return true; }catch (Exception $e) { return false; } } //Example usage $email = "mailtrapclub+test@gmail.com" $verificationCode = generateVerificationCode(); if (sendVerificationEmail($email,$verificationCode)){ echo "A verification email has been sent to $email. Please check your inbox and enter the code to verrify your email." . PHP_EOL; } else { echo "Failed to send the verification email. Please try again later." . PHP_EOL; }
Yeah, the title is a bit circular, but that’s exactly what you need. The script below enables the “verification of verification” flow ? that moves like this:
<?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "user_verification"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } if (isset($_GET['token'])) { $token = $_GET['token']; $stmt = $conn->prepare("SELECT * FROM users WHERE token=? LIMIT 1"); $stmt->bind_param("s", $token); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { $user = $result->fetch_assoc(); $stmt->close(); $stmt = $conn->prepare("UPDATE users SET is_verified=1, token=NULL WHERE id=?"); $stmt->bind_param("i", $user['id']); if ($stmt->execute() === TRUE) { echo "Email verification successful!"; } else { echo "Error: " . $conn->error; } $stmt->close(); } else { echo "Invalid token!"; } } $conn->close(); ?>
We appreciate you chose this article to know more about php email verification. To continue reading the article and discover more articles on related topics, follow Mailrap Blog!
Atas ialah kandungan terperinci Cara Menyediakan Pengesahan E-mel dalam PHP melalui Token Pengesahan: Panduan Lengkap. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!