• 个人商城系统开源(发送邮箱验证码!)


    原文地址:个人商城系统开源(发送邮箱验证码!) - Pleasure的博客

    下面是正文内容:

    前言

    由于近期实在没有什么话题可写和一些有趣的项目教程可以分享。所以我只能决定将我自己亲手编写的一个迷你迷你商城系统进行开源。

    也就是放在我博客右边的“我的另一个网站”(由于实在没什么生意只能开源了,充当教材)

    开始分享一些前后端全栈的内容,希望对你们有所帮助。

    虽然是迷你的商城系统,但是由于要实现每一部分各自的功能还是非常复杂的,比如用户的注册登录,手机号邮箱的绑定,充值支付功能的实现等等。

    所以在这里我会花一周的时间按照功能进行划分来逐块解释,也好水一周的文章。顺便可以迁个站,整理一下代码。

    看之前还是麻烦大家点点关注,谢谢!(就不选仅粉丝可见了)

    如果在实现上存在什么问题,可以联系我。

    正文

    在开始之前需要说明的是,由于在注册账号的过程中需要绑定用户的邮箱,以便后续账号密码的找回,所以今天商城系统的开源就优先从绑定邮箱开始。

    预备知识

    三个电子邮箱协议

    • SMTP(Simple Mail Transfer Protocol): 用于发送电子邮件的协议。
    • POP3(Post Office Protocol version 3): 用于从邮件服务器下载电子邮件到本地设备的协议。
    • IMAP(Internet Message Access Protocol): 允许用户在多个设备上同步和管理邮件的协议。

    预先的准备

    一个域名,解析域名的账号,腾讯企业邮的账号(当然其他邮件公司也可以)

    首先需要建立一个发送邮件验证码的邮箱账号,也就是针对自己的域名进行邮箱解析。

    同时根据这个原理,你可以同时创建多个邮箱账号——用于一些不常用账号的注册以及广告邮件的接收。

    当然也可以参考官方的使用说明!常用邮件客户端软件POP/IMAP协议设置-帮助中心-企业微信

    在域名解析栏中添加下面的几个解析(或者点击快速解析常用邮箱解析)

    登录腾讯企业邮箱官网(需要有企业微信账号),找到下面的这个界面,添加域名

    添加邮箱账号

    登录邮箱账号进行设置

    记录下面的密钥,后面在发送邮箱验证码的时候需要用到(调用的凭证)

    至此前置工作就算结束了

    然后就是下载给出的这个调用包:https://github.com/PHPMailer/PHPMailer (相当于一个插件)

    当然在商城系统的开源压缩包中也有配备,大家自行选择。

    正式调用

    下面就是调用邮箱发送验证码的关键代码,其中password处填写的就是上面生成的密码。

    function generateRandomCode()函数用于生成六位随机验证码,并储存session用于后面在emailcheck.php中进行验证,验证完毕后通过emailaction.php在数据库中进行储存。

    emailregister.php就是前段的页面,下面是emailregister.php的内容。

    1. <?php
    2. session_start();
    3. $email = isset($_SESSION['email']) ? $_SESSION['email'] : '';
    4. $token = isset($_SESSION['token']) ? $_SESSION['token'] : '';
    5. if (isset($_SESSION['username'])) { ?>
    6. <!DOCTYPE html>
    7. <html>
    8. <head>
    9. <title>邮箱注册或更新</title>
    10. <meta name="content-type" ; charset="UTF-8">
    11. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    12. <meta name="description" content="">
    13. <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors">
    14. <meta name="generator" content="Jekyll v4.0.1">
    15. <link rel="icon" href="../picture/avatar2.jpg" type="image">
    16. <link href="../bootstrap.css" rel="stylesheet">
    17. <link href="../loginsystem/signin.css" rel="stylesheet">
    18. <style>
    19. .bd-placeholder-img {
    20. font-size: 1.125rem;
    21. text-anchor: middle;
    22. -webkit-user-select: none;
    23. -moz-user-select: none;
    24. -ms-user-select: none;
    25. user-select: none;
    26. }
    27. @media (min-width: 768px) {
    28. .bd-placeholder-img-lg {
    29. font-size: 3.5rem;
    30. }
    31. }
    32. </style>
    33. </head>
    34. <body class="text-center">
    35. <div class="form-signin" id="loginform">
    36. <img class="mb-4" src="../picture/avatar2.jpg" alt="" width="72" height="72">
    37. <h1 class="h3 mb-3 font-weight-normal">Please register/change here</h1><br>
    38. <form class="form-signin" id="loginform" action="./email.php" method="post">
    39. <div style="display: flex; align-items: center;">
    40. <input type="email" id="email" class="form-control" name="email" required="required" value="" placeholder="Email" required autofocus>
    41. <button class="btn btn-md btn-secondary" id="buttonefirst" type="submit" name="send">Send</button>
    42. </div>
    43. </form>
    44. <p>
    45. <?php
    46. $err = isset($_GET["err"]) ? $_GET["err"] : "";
    47. switch ($err) {
    48. case 1:
    49. echo "
      发送成功!"
      ;
    50. break;
    51. case 2:
    52. echo "
      发送失败!"
      ;
    53. break;
    54. case 13:
    55. echo "
      该邮箱已被注册!"
      ;
    56. break;
    57. }
    58. ?>
    59. </p>
    60. <form class="form-signin" id="loginform" action="./emailcheck.php" method="post">
    61. <div style="display: flex; align-items: center;">
    62. <input type="text" id="verification1" class="form-control" name="verification1" required="required" value="" placeholder="Email Verification Code" required autofocus>
    63. <button class="btn btn-md btn-secondary" id="buttonfirst" type="submit" name="send">Sure</button>
    64. </div>
    65. </form>
    66. <p>
    67. <?php
    68. $err = isset($_GET["err"]) ? $_GET["err"] : "";
    69. switch ($err) {
    70. case 3:
    71. echo "
      验证成功!"
      ;
    72. break;
    73. case 4:
    74. echo "
      邮箱更新成功!"
      ;
    75. header('Refresh: 3; URL=../index.php');
    76. exit();
    77. break;
    78. case 5:
    79. echo "
      验证失败!"
      ;
    80. break;
    81. case 6:
    82. echo "
      验证成功!请返回登录界面登录!"
      ;
    83. header('Refresh: 3; URL=../index1.html');
    84. exit();
    85. break;
    86. }
    87. ?>
    88. </p>
    89. </div>
    90. </body>
    91. </html>
    92. <?php
    93. } else {
    94. header('Location: ../index1.html');
    95. exit;
    96. }
    97. ?>

    下面是email的内容

    1. use PHPMailer\PHPMailer\PHPMailer;
    2. use PHPMailer\PHPMailer\Exception;
    3. require '../PHPMailer-6.9.1/src/Exception.php';
    4. require '../PHPMailer-6.9.1/src/PHPMailer.php';
    5. require '../PHPMailer-6.9.1/src/SMTP.php';
    6. function generateRandomCode()
    7. {
    8. $code = '';
    9. for ($i = 0; $i < 6; $i++) {
    10. $code .= mt_rand(0, 9);
    11. }
    12. return $code;
    13. }
    14. $randomCode = generateRandomCode();
    15. if (isset($_POST['send'])) {
    16. $mail = new PHPMailer(true);
    17. $mail->isSMTP();
    18. $mail->Host = 'smtp.exmail.qq.com';
    19. $mail->SMTPAuth = true;
    20. $mail->Username = 'pleasure@yiming1234.com';
    21. $mail->Password = '*******************';
    22. $mail->SMTPSecure = 'ssl';
    23. $mail->Port = 465;
    24. $mail->setFrom('pleasure@yiming1234.com');
    25. $mail->addAddress($_POST["email"]);
    26. $mail->isHTML(true);
    27. $mail->Subject = "Verification Code";
    28. $mail->Body = "感谢您光临一鸣的小站,请在5分钟内使用验证码,祝您生活愉快。您的验证码是:$randomCode ";
    29. ini_set('session.cookie_lifetime', 300);
    30. session_start();
    31. $_SESSION['email_code'] = $randomCode;
    32. $_SESSION['email'] = $_POST["email"];
    33. $username = $_SESSION['username'];
    34. $email = $_POST["email"];
    35. $token = $_SESSION['token'];
    36. require "../conn.php";
    37. $stmt = $conn->prepare("SELECT email FROM email WHERE email = ? AND username != ?");
    38. $stmt->bind_param("ss", $email, $username);
    39. $stmt->execute();
    40. $res1 = $stmt->get_result();
    41. $email2 = $res1->fetch_assoc();
    42. if ($email2['email'] == $_POST['email']) {
    43. header("Location:emailregister.php?err=13");
    44. exit;
    45. }
    46. if ($mail->send()) {
    47. header("Location:emailregister.php?err=1");
    48. } else {
    49. header("Location:emailregister.php?err=2");
    50. }
    51. }

    下面是emailcheck.php的内容

    1. session_start();
    2. $userInputCode = $_POST['verification1'];
    3. $generatedCode = $_SESSION['email_code'];
    4. $email = $_SESSION["email"];
    5. $token = $_SESSION['token'];
    6. // 进行验证
    7. if ($userInputCode === $generatedCode) {
    8. header("Location:emailaction.php");
    9. exit;
    10. } else {
    11. header("Location:emailregister.php?err=5");
    12. }
    13. ?>

    下面是emailaction.php的内容

    session_start();
    $email = $_SESSION['email'];
    $username = $_SESSION['username'];
    $token = $_SESSION['token'];

    require "../conn.php";
    $stmt = $conn->prepare("SELECT email FROM email WHERE email = ?");
    $stmt->bind_param("s", $email);
    $stmt->execute();
    $ret = $stmt->get_result();
    $num = $ret->num_rows;
    if ($num < 1) { if (!empty($token)) { $stmt1 = $conn->prepare("UPDATE email SET email = ? WHERE username = ?");
    $stmt1->bind_param("ss", $username, $email);
    $stmt1->execute();
    header("Location:emailregister.php?err=6");

    1. } else {
    2. $stmt1 = $conn->prepare("INSERT INTO email (email, username) VALUES (?, ?)");
    3. $stmt1->bind_param("ss", $email, $username);
    4. $stmt1->execute();
    5. header("Location:emailregister.php?err=3");
    6. }

    } else {
    $stmt2 = $conn->prepare("UPDATE email SET email = ? WHERE username = ?");
    $stmt2->bind_param("ss", $username, $email);
    $stmt2->execute();
    header("Location:emailregister.php?err=4");
    }

    大家根据自己的理解自行解读

    值得注意的事,并没有验证是否所有类型的邮箱都能接收到邮件(理论上应该是都可以的,如果不行可能是设置了垃圾邮件拦截等原因)。

    尾声

    在使用上并不能百分百保证没有报错,尤其是数据库连接部分,可能会存在一定问题。大家自行调试。

    源码下载地址:

    https://download.csdn.net/download/2302_79791164/88922823

    即使不从发送邮箱验证码这个目的的角度来说,这个技能也还是蛮实用的。

    希望对你们有所帮助。

  • 相关阅读:
    Dubbo学习
    网络初识
    【毕业设计】基于单片机的门禁系统 - 嵌入式 物联网
    基于springboot实现智能热度分析和自媒体推送平台系统项目【项目源码】计算机毕业设计
    WPF 制作雷达扫描图
    Liquibase极致详细介绍 不看后悔十年!
    路由器二次开发一步一步把工业路由器变成一个高端的可指定出网、节点和链路的路由器,包含详细过程及快捷脚本(五)
    动态爬虫管理平台构建与实现_kaic
    Tomcat部署本地和服务器Springboot和Vue项目
    Python3操作文件系列(一):判断文件|目录是否存在三种方式
  • 原文地址:https://blog.csdn.net/2302_79791164/article/details/136535467