製作一個簡單的信箱驗證

點閱: 72

文章短網址:https://frees.one/4F

今天的教學是教你如何寫出一個信箱驗證程序

今天會用到的工具是PHPMailer的寄信功能

先準備一個可以跑php與MYSQL的虛擬主機或是VPS

(如沒有需要購買請到上方選單中的商城裡面訂購)

今天的教學開始~~

這個教學會利用到之前教學的亂數生成與gmail api發信

還沒有讀過亂數生成的可以點擊這裡去學習一下

還沒有讀過gmail api發信的可以點擊這裡去學習一下

我們先建立一個MYSQL資料庫(不會建立請查閱文章分類-CPANEL教學),在SQL中輸入

//建立表
CREATE TABLE `mail` (
  `id` int(11) NOT NULL,
  `mail` text COLLATE utf8_unicode_ci NOT NULL,
  `v` text COLLATE utf8_unicode_ci,
  `ok` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
//設定id
ALTER TABLE `mail`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `mail`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
COMMIT;

我們資料表建立好了現在要來建立config.php資料庫連線與gmail api發信文件

<?php
$dbhost = 'xxx';//連線主機(如果是同一台主機就輸入127.0.0.1)
$dbuser = 'xxx';//連線資料庫帳號
$dbpass = 'xxx';//連線資料庫帳號的密碼
$dbname = 'xxx';//連線的資料庫名稱
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);//建立連線
$mysqli->query("SET NAMES utf8"); //指定連線編碼
$mailoauthUserEmail = "XXX";//你的GMAIL帳號
$mailoauthClientId = "XXX";//用戶端 ID
$mailoauthClientSecret = "XXX";//用戶端密鑰
$mailoauthRefreshToken = "XXX";//refresh token
?>

我們資料庫連線與gmail api發信用的文件已經寫好了
現在要來寫HTML讓訪客輸入信箱的頁面

我們簡單做就不再設計外觀了~~~

<html>
<head>
<!--網頁標題-->
<title>信箱驗證</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<!--下列用到的是from表單傳輸-->
<!--等等要建立的是echo.php所以在action填入echo.php,也就是from要發送到哪裡的位置-->
<!--我們使用的傳輸為POST,所以要在method連入post(method可以使用GET或是POST詳細內容請查閱GOOGLE)-->
<form action="echo.php" method="post">
<!--我們在此使用input文字輸入格,因為我們要讓訪客輸入的是信箱,所以在type類型中填入text或是email-->
<!--要在echo.php中接收的欄位名稱是mail,所以在name中填入mail-->
<!--ID可以隨意建議還是跟name一樣比較不會混亂-->
<!--<BR>是換行-->
 電子信箱:<input type="text" name="mail" id="mail"></input><br>
<!--我們也要有個發送的按鈕所以又建立了一個input並將type設定成submit按鈕-->
<!--value就是要在按鈕上顯示的文字-->
 <input type="submit" value="寄送驗證信">
</form>
</body>
</html>

我們現在要來做表單的接收文件名稱設定echo.php(記得修改文件內的網址)

請先下載


<?php 
include("config.php"); //剛剛的資料庫連線文件我們先進行載入
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\OAuth;
use League\OAuth2\Client\Provider\Google;
require './vendor/autoload.php';
$mail=$_POST["mail"];//並設定一個參數為$mail也就是在HTML發送過來要接收的欄位
function generatorPassword()//亂數生成函數
{
    $password_len = 16;//設定要生成的字數
    $password = '';//要輸出的字(請留空)

    // 以下取消掉了 o,0,1,l 容易混淆的字
    $word = 'abcdefghijkmnpqrstuvwxyz!@#$%^&*()-=ABCDEFGHIJKLMNPQRSTUVWXYZ<>;{}[]23456789';//隨機抽取的字
    $len = strlen($word);//取得字長

    for ($i = 0; $i < $password_len; $i++) {//判斷生成字數
        $password .= $word[rand() % $len];//隨機抽取字
    }

    return $password;//輸出生成的字
}
$passwd = generatorPassword();//參數
//我們現在要進行資料庫內容寫入
//MYSQL的指令我們現在要在mail這張表中建立新內容
//我們剛剛建立的表中有四個欄位為id,mail,v,ok
//這四個都有用途
//id為自動排序生成,所以我們不需要寫在命令中
//mail為儲存表單發送過來的內容
//v為驗證碼,因為我們寫的程式是用網址做驗證所以要讓他生成一組亂碼
//ok為判斷是否驗證成功0是未驗證1是已驗證
$sql = "INSERT INTO `mail` (mail, v, ok) VALUES (?, ?, ?, ?)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param($mail,$passwd,"0");
$stmt->execute();
//建立發信
$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPDebug = 2;
$mail->Host = 'smtp.gmail.com';
$mail->Port = 587;
$mail->SMTPSecure = 'tls';
$mail->SMTPAuth = true;
$mail->AuthType = 'XOAUTH2';
$email = $mailoauthUserEmail;
$clientId = $mailoauthClientId;
$clientSecret = $mailoauthClientSecret;
$refreshToken = $mailoauthRefreshToken;
$provider = new Google(
    [
        'clientId' => $clientId,
        'clientSecret' => $clientSecret,
    ]
);
$mail->setOAuth(
    new OAuth(
        [
            'provider' => $provider,
            'clientId' => $clientId,
            'clientSecret' => $clientSecret,
            'refreshToken' => $refreshToken,
            'userName' => $email,
        ]
    )
);
$mail->setFrom($email, $email);
$mail->addAddress($mail);
$mail->Subject = '信件驗證';//信件標題
$mail->CharSet = 'utf-8';
$mail->AltBody = '你好這是信件驗證<BR>驗證網址:<a herf="http://xxx.xxx/v.php?v='.$passwd.'">點擊驗證http://xxx.xxx/v.php?v='.$passwd.'</a>';//信件內容,請自行替換網址
if (!$mail->send()) {
    echo "發信錯誤: " . $mail->ErrorInfo;
} else {
    echo "驗證信件已寄送!";
}?>

我們已經完成了80%左右了,現在要建立v.php的驗證文件

<?php
include("config.php"); //資料庫連線文件我們先進行載入
$v=$_GET["v"];//接收網址中的v欄位
$sql = "UPDATE `mail` SET `ok` = ? WHERE `v` = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('1',$v);
$stmt->execute();
echo '已驗證';
?>

去資料庫看看是不是ok欄位已經變成1了八~~

懶得自己一個個用可以到本網站商店購買範本檔https://frees.tw/product/mail

如有興趣閱讀其他文章歡迎在選單中的最新文章閱讀喔~~

FaceBook留言板:

推薦的其他文章

文章作者: 躍空創辦人

本人長時間無聊寫教學文章的懶骨頭 現職擔任躍空團隊創辦人等躍空旗下服務管理者 有任何文章錯誤請聯繫 躍空團隊FB粉絲頁 謝謝!!