Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara Menyediakan Pengesahan E-mel dalam PHP melalui Token Pengesahan: Panduan Lengkap

Cara Menyediakan Pengesahan E-mel dalam PHP melalui Token Pengesahan: Panduan Lengkap

王林
王林asal
2024-08-11 20:32:32414semak imbas

How to Set up Email Verification in PHP via a Verification Token: Complete Guide

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. 

Menyediakan penghantaran e-mel

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. 

Membuat borang pendaftaran

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.  

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.

Generating verification token

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;
}
?>

Storing verification token

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.

Sending verification token 

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;
}

Verifying verification token

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:

  • A user hits the verification link.
  • The token gets validated.
  • The user’s email is marked as verified in the database.
<?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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn