首页 后端开发 Python教程 使用 Python 构建反垃圾邮件、选择加入的电子邮件注册

使用 Python 构建反垃圾邮件、选择加入的电子邮件注册

Aug 14, 2024 pm 02:35 PM

Build an anti-spam, opt-in Email registration with Python

那么您想构建一个应用程序并获得许多用户吗?

我们都这样做,如果您是初学者,您需要考虑以下电子邮件注册功能。

  1. 有效的电子邮件地址和强密码
  2. 机器人预防
  3. 双重选择加入

可靠的电子邮件注册系统对于网络应用程序、时事通讯、免费赠品下载、私人团体邀请和潜在客户开发至关重要。我们不要依赖使用 Auth0、Facebook 或 Google 等第三方服务来访问您的应用程序。 保留您的应用数据!

首先,您应该有一些 Python 经验,因为我们将使用 Flask 框架和 MySQL 数据库。这比使用最流行的 CMS Wordpress 更有趣。您必须付费购买某些 Wordpress 插件才能具有与免费 Flask 扩展相同的功能。我之前已经在两者上构建过,并且更喜欢使用 Python Flask 来构建 Web 应用程序,尽管 Wordpress 非常有能力制作 Web 应用程序。

每个代码片段都会有解释,并在代码中包含一些注释。如果您还没有建立用户注册或了解内部工作原理,我将为您描述详细信息。以下是我们将按照第一段所述实现的功能的摘要:

  1. 有效的电子邮件地址可以通过使用正则表达式或 Flask 扩展解析用户的输入字符串来检查。我们不允许随机文本或 SQL 注入类型的黑客攻击。

  2. 机器人预防可以通过隐藏字段来完成,该字段不会向用户显示,但通常由爬行易受攻击的注册表单的机器人自动填充。

  3. 双重选择加入方法要求收件人通过接收其收件箱的验证链接来授予您向他们发送电子邮件的权限。这主要用于防止其他人使用您的电子邮件地址。这也可以防止测试用户刚刚注册并放弃其帐户。

让我们用代码来实现吧!

创建工作目录:

mkdir signup
cd signup
登录后复制

使用 python3 -m venv signup 或 conda create -n signup python3 创建 Python 环境。我更喜欢康达。

创建 MySQL 表来存储您的用户。已验证字段用于双重选择加入:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(120) NOT NULL UNIQUE,
    password VARCHAR(120) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    validated BOOLEAN DEFAULT FALSE
);
登录后复制

安装依赖项:
pipflaskflask-mail 安全 SQLAlchemy Flask-WTF Flask-SQLAlchemy mysql-connector-python

或者,您可以在requirements.txt 文件中列出相同的内容并运行 pip install -rrequirements.txt

创建具有以下依赖项的 app.py 文件:

from flask import Flask, render_template, request, url_for, redirect, flash
from flask_mail import Mail, Message
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.sql import func
from itsdangerous import URLSafeTimedSerializer, SignatureExpired
from werkzeug.security import generate_password_hash, check_password_hash
import secrets
登录后复制

使用以下行输入您自己的服务器配置数据:

# Flask configurations
secret = secrets.token_urlsafe(32)
app.secret_key = secret
app.config['SECRET_KEY'] = secret # auto-generated secret key

# SQLAlchemy configurations
SQLALCHEMY_DATABASE_URI = 'mysql+mysqlconnector://admin:user@localhost/tablename'

# Email configurations
app.config['MAIL_SERVER'] = 'smtp.example.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USERNAME'] = 'your_email@example.com'
app.config['MAIL_PASSWORD'] = 'your_password'
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USE_SSL'] = False

db = SQLAlchemy(app)
mail = Mail(app)
s = URLSafeTimedSerializer(app.config['SECRET_KEY']) #set secret to the serliazer
登录后复制

最终,您应该将配置信息保存在 .env 文件中。

下一节将使用 SQLAlchemy 的 ORM 结构为您查询数据库。请注意,类名称应与您的数据库表名称相匹配,否则您将收到错误。 db.model 代表您的表设置,其中包括列名称、类型、长度、键和空值:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)
    created_at = db.Column(db.DateTime, server_default=db.func.now())
    validated = db.Column(db.Boolean, default=False)
登录后复制

如果您还没有手动创建 MySQL 数据库表,您可以直接在类 User 代码块之后使用此 Flask 代码来完成此操作:

# Create the database table
with app.app_context():
    db.create_all()
登录后复制

为了本教程的简洁,我们将跳过索引页面或您想要调用的应用程序主页,而仅使用 Python 的页面路由装饰器函数显示注册页面:

@app.route('/')
def index():
    return '<h1>Homepage</h1>'

@app.route('/signup', methods=['GET', 'POST'])
def signup():
    if request.method == 'POST':
        # Hidden field validation to prevent bot submission
        hidden_field = request.form.get('hidden_field')
        if hidden_field:
            return redirect(url_for('index'))  # Bot detected, ignore submission

        email = request.form['email']
        password = request.form['password']
        hashed_password = generate_password_hash(password, method='sha256')

        # Insert user into the database
        new_user = User(email=email, password=hashed_password)
        db.session.add(new_user)
        db.session.commit()

        # Send confirmation email
        token = s.dumps(email, salt='email-confirm')
        msg = Message('Confirm your Email', sender='your_email@example.com', recipients=[email])
        link = url_for('confirm_email', token=token, _external=True)
        msg.body = f'Your link is {link}'
        mail.send(msg)
        flash('A confirmation email has been sent to your email address.', 'success')
        return redirect(url_for('index'))
    return render_template('signup.html')
登录后复制

在添加 html 注册表单之前,让我们通过添加用于验证双重选择加入功能的路由来完成后端。该路由使用我们之前创建的 s 变量,该变量生成时间敏感的秘密令牌。详情请参阅文档
最长期限是链接过期前的秒数,因此在这种情况下,用户有 20 分钟的时间来确认他们的电子邮件地址。

@app.route('/confirm_email/<token>')
def confirm_email(token):
    try:
        email = s.loads(token, salt='email-confirm', max_age=1200)  # Token expires after 1 hour
    except SignatureExpired:
        return '<h1>The token is expired!</h1>'

    # Update field in database
    user = User.query.filter_by(email=email).first_or_404()
    user.validated = True
    db.session.commit()

    return '<h1>Email address confirmed!</h1>'

登录后复制

现在我们来看看无处不在的 main 语句,它告诉 Python 在直接执行文件(而不是导入模块)时执行脚本:

if __name__ == '__main__':
    app.run(debug=True)
登录后复制

在完成这个后端代码之前,我们仍然需要用于用户输入的前端 html。我们将使用 Flask 的内置 Jinja 模板来完成此操作。创建一个名为 templates/signup.html 的文件,该文件的名称应与您之前在 app.py 中创建的路由匹配。默认情况下,Jinja 使用目录 /templates 来存放 html 文件。您可以更改此设置,但在本教程中,我们将使用应用程序的 /templates 目录。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Email Sign Up</title>
</head>
<body>
    <h1>Sign Up</h1>
    <form action="{{ url_for('signup') }}" method="POST">
        <input type="email" name="email" placeholder="Enter your email" required>
        <input type="password" name="password" placeholder="Enter your password" required>
        <input type="hidden" name="bot_check"> 
        <input type="submit" value="Sign Up">
    </form>
    {% with messages = get_flashed_messages(with_categories=true) %}
      {% if messages %}
        <ul>
          {% for category, message in messages %}
            <li>{{ message }}</li>
          {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}
</body>
</html>

登录后复制

当您在启用调试的情况下运行 Flask 命令时,您的代码应该可以正常工作。这将允许您在命令行和浏览器窗口中查看任何错误:

flask --app app.py --debug run 
登录后复制

以上是使用 Python 构建反垃圾邮件、选择加入的电子邮件注册的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1672
14
CakePHP 教程
1428
52
Laravel 教程
1332
25
PHP教程
1277
29
C# 教程
1256
24
Python与C:学习曲线和易用性 Python与C:学习曲线和易用性 Apr 19, 2025 am 12:20 AM

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

学习Python:2小时的每日学习是否足够? 学习Python:2小时的每日学习是否足够? Apr 18, 2025 am 12:22 AM

每天学习Python两个小时是否足够?这取决于你的目标和学习方法。1)制定清晰的学习计划,2)选择合适的学习资源和方法,3)动手实践和复习巩固,可以在这段时间内逐步掌握Python的基本知识和高级功能。

Python vs.C:探索性能和效率 Python vs.C:探索性能和效率 Apr 18, 2025 am 12:20 AM

Python在开发效率上优于C ,但C 在执行性能上更高。1.Python的简洁语法和丰富库提高开发效率。2.C 的编译型特性和硬件控制提升执行性能。选择时需根据项目需求权衡开发速度与执行效率。

Python vs. C:了解关键差异 Python vs. C:了解关键差异 Apr 21, 2025 am 12:18 AM

Python和C 各有优势,选择应基于项目需求。1)Python适合快速开发和数据处理,因其简洁语法和动态类型。2)C 适用于高性能和系统编程,因其静态类型和手动内存管理。

Python标准库的哪一部分是:列表或数组? Python标准库的哪一部分是:列表或数组? Apr 27, 2025 am 12:03 AM

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

Python:自动化,脚本和任务管理 Python:自动化,脚本和任务管理 Apr 16, 2025 am 12:14 AM

Python在自动化、脚本编写和任务管理中表现出色。1)自动化:通过标准库如os、shutil实现文件备份。2)脚本编写:使用psutil库监控系统资源。3)任务管理:利用schedule库调度任务。Python的易用性和丰富库支持使其在这些领域中成为首选工具。

科学计算的Python:详细的外观 科学计算的Python:详细的外观 Apr 19, 2025 am 12:15 AM

Python在科学计算中的应用包括数据分析、机器学习、数值模拟和可视化。1.Numpy提供高效的多维数组和数学函数。2.SciPy扩展Numpy功能,提供优化和线性代数工具。3.Pandas用于数据处理和分析。4.Matplotlib用于生成各种图表和可视化结果。

Web开发的Python:关键应用程序 Web开发的Python:关键应用程序 Apr 18, 2025 am 12:20 AM

Python在Web开发中的关键应用包括使用Django和Flask框架、API开发、数据分析与可视化、机器学习与AI、以及性能优化。1.Django和Flask框架:Django适合快速开发复杂应用,Flask适用于小型或高度自定义项目。2.API开发:使用Flask或DjangoRESTFramework构建RESTfulAPI。3.数据分析与可视化:利用Python处理数据并通过Web界面展示。4.机器学习与AI:Python用于构建智能Web应用。5.性能优化:通过异步编程、缓存和代码优

See all articles