ホームページ  >  記事  >  バックエンド開発  >  検証トークンを使用して PHP で電子メール検証を設定する方法: 完全ガイド

検証トークンを使用して PHP で電子メール検証を設定する方法: 完全ガイド

王林
王林オリジナル
2024-08-11 20:32:32414ブラウズ

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

電子メールの検証は、電子メール アドレスが存在し、電子メールを受信できることを確認するプロセスです。一方、電子メール検証では、アドレスの形式が適切であるかどうかがチェックされます。つまり、特定の標準 (UTF-8 など) に従って書かれています。 

この記事では、PHP の電子メール検証と、それを Web 開発および検証トークンによるユーザー認証に使用する方法について説明します。この記事には、次のようないくつかのマイクロ チュートリアルが含まれています。

  • Mailtrap を使用した PHPMailer の設定

  • 簡単な HTML フォームの作成

  • 基本的なメール アドレスの確認

  • トークンと資格情報を生成して SQL データベースに保存する

  • 検証トークンを使用した電子メール検証の送信

  • 検証に関連するメールテスト

それでは、早速始めましょう。 

メール送信の設定

確認メールを送信するには、PHP の組み込み mail() 関数、またはより多くの機能と信頼性を備えた PHPMailer などのライブラリを使用できます。

チュートリアルをできるだけ安全に、本番環境にすぐに使えるようにしたいので、「PHPMailer」を使用します。 Composer 経由で PHPMailer をインストールするコードを確認します:

composer には phpmailer/phpmailer が必要です

Mailtrap API/SMTP を使用する理由

これは、メールを 1 か所でテスト、送信、制御するためのメール配信プラットフォームです。そして、特に次のことが得られます:

さまざまな言語用の既製の構成設定、PHP と Laravel が含まれています。

主要言語の SMTP と API (OFC、PHP を含む)。 

業界最高の分析。 

27 時間年中無休の人的サポートと、緊急の場合の迅速な手続き。 

これにより、電子メール検証プロセスをブートストラップし、すべての人にとって安全かつ安定した状態に保つことができます。

Mailtrap を使用して PHPMailer を構成するための設定に進みます:

$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';

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

上記のコードは検証トークンを送信しないことに注意してください (検証トークンを含むコード スニペットにジャンプするには、ここをクリックしてください)。これは、Mailtrap SMTP を設定し、検証機能を定義する方法の一例にすぎません。重要なポイントを簡単に説明します:

  • PHPMailer クラスと例外クラスがインポートされます。

  • sendVerificationEmail($email, $verificationCode) は関数定義です。 

  • 新しい PHPMailer オブジェクトが作成されます。 

  • try-catch ブロックは、電子メール送信中の例外を処理します。

  • サーバー設定は、構成例に従って Mailtrap に設定されています。 

  • メールの内容はプレーンテキストの isHTML(false) に設定されます。 

ヒント:

  • メールのコンテンツは HTML にリファクタリングできます。 

  • スループットの制限のため、サインアップ フォーム SMTP リレーとして gmail.com を使用することは避けてください。ただし、本当にメーラー PHP ファイルを作成して Gmail 経由で送信したい場合は、このチュートリアルを確認してください。 

登録フォームの作成

以下は簡単な登録フォームで、ヘッダーとユーザー アカウント情報 (ユーザー名、電子メール、パスワード) が含まれています。 

これは単なる例であるため、CSS スタイルシートや div クラスはありません。

ただし、これらを制作に含めて、ブランドのデザイン言語に合わせることをお勧めします。そうしないと、フォームがプロフェッショナルに見えず、ユーザーがそのフォームに関与したがらない可能性があります。

 

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

ボーナス プロのヒント - フォームで JavaScript の使用を検討してください

reCaptcha を含む PHP コンタクト フォームの作成方法に関する完全なチュートリアルが必要な場合は、以下のビデオをチェックしてください ⬇️。 

  • JS はユーザー入力をリアルタイムで検証し、ページをリロードすることなくエラーに関するフィードバックを即座に提供します。 

  • JS はクライアント側でエラーを捕捉することで、サーバーに送信される無効なリクエストの数を減らすことができ、それによってサーバーの負荷が軽減され、各セッションのパフォーマンスが向上します。

  • AJAX を使用すると、JS はページをリロードせずにサーバーとデータを送受信できるため、よりスムーズなユーザー エクスペリエンスが提供されます。

次に、メールアドレスの認証に移ります。  

メールアドレスの認証

これは、ドメインと MX レコードを確認するための簡単なスクリプトです。基本的に、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;
}

ただし、スクリプトはユーザーのアクティブ化と認証のための電子メールを送信しません。また、MySQL にはデータを保存しません。 

そのために、次のセクションで次のことを行います:

  • 検証トークンを生成します

  • 登録フォームからの資格情報を保存するための PHP MySQL スキーマを作成します

  • 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!

以上が検証トークンを使用して PHP で電子メール検証を設定する方法: 完全ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。