”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Python 构建反垃圾邮件、选择加入的电子邮件注册

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

发布于2024-09-01
浏览:161

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 注册 光盘注册
mkdir signup
cd signup
使用 python3 -m venv signup 或 conda create -n signup python3 创建 Python 环境。我更喜欢康达。

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


创建表用户( id INT 自动递增主键, 电子邮件 VARCHAR(120) NOT NULL UNIQUE, 密码 VARCHAR(120) NOT NULL, 创建时间为默认当前时间戳, 已验证 BOOLEAN 默认值 FALSE );
mkdir signup
cd signup
安装依赖项:

pipflaskflask-mail 安全 SQLAlchemy Flask-WTF Flask-SQLAlchemy mysql-connector-python

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

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


从 Flask 导入 Flask、render_template、request、url_for、redirect、flash 从flask_mail导入邮件、消息 从日期时间导入日期时间 从flask_sqlalchemy导入SQLAlchemy 从 sqlalchemy.sql 导入函数 from itsdangerous import URLSafeTimedSerializer, SignatureExpired 从 werkzeug.security 导入generate_password_hash、check_password_hash 导入秘密
mkdir signup
cd signup
使用以下行输入您自己的服务器配置数据:


# 烧瓶配置 秘密 = Secrets.token_urlsafe(32) app.secret_key = 秘密 app.config['SECRET_KEY'] = Secret # 自动生成的密钥 # SQLAlchemy 配置 SQLALCHEMY_DATABASE_URI = 'mysql mysqlconnector://admin:user@localhost/表名' # 电子邮件配置 app.config['MAIL_SERVER'] = 'smtp.example.com' app.config['MAIL_PORT'] = 587 app.config['MAIL_USERNAME'] = '[email protected]' app.config['MAIL_PASSWORD'] = '你的密码' app.config['MAIL_USE_TLS'] = True app.config['MAIL_USE_SSL'] = False 数据库 = SQLAlchemy(应用程序) 邮件 = 邮件(应用程序) s = URLSafeTimedSerializer(app.config['SECRET_KEY']) #为serliazer设置秘密
mkdir signup
cd signup
最终,您应该将配置信息保存在 .env 文件中。

下一节将使用SQLAlchemy的ORM结构为您查询数据库。请注意,

类名称应与您的数据库表名称匹配,否则您将收到错误。 db.model 代表您的表设置,其中包括列名称、类型、长度、键和空值:

类用户(db.Model): id = db.Column(db.Integer, Primary_key=True) 电子邮件 = db.Column(db.String(120), unique=True, nullable=False) 密码 = db.Column(db.String(120), nullable=False) 创建的_at = db.Column(db.DateTime, server_default=db.func.now()) 已验证 = db.Column(db.Boolean, 默认=False)
mkdir signup
cd signup
如果您还没有手动创建 MySQL 数据库表,您可以直接在类 User 代码块之后使用此 Flask 代码来完成此操作:


# 创建数据库表 与 app.app_context(): db.create_all()
mkdir signup
cd signup
为了本教程的简洁,我们将跳过索引页面或您想要调用的应用程序主页,而仅使用 Python 的页面路由装饰器函数显示注册页面:


@app.route('/') 定义索引(): 返回“

首页

” @app.route('/signup',methods=['GET', 'POST']) def 注册(): 如果 request.method == 'POST': # 隐藏字段验证以防止机器人提交 隐藏字段 = request.form.get('隐藏字段') 如果隐藏字段: return redirect(url_for('index')) # 检测到机器人,忽略提交 电子邮件 = request.form['电子邮件'] 密码 = request.form['密码'] hashed_pa​​ssword =generate_password_hash(密码,方法='sha256') # 将用户插入数据库 new_user = 用户(电子邮件=电子邮件,密码=散列密码) db.session.add(new_user) db.session.commit() # 发送确认邮件 令牌 = s.dumps(电子邮件, salt='电子邮件确认') msg = Message('确认您的电子邮件', sender='[email protected]',recipients=[email]) link = url_for('confirm_email', token=token, _external=True) msg.body = f'您的链接是{link}' 邮件.发送(msg) flash('一封确认邮件已发送到您的电子邮件地址。', '成功') 返回重定向(url_for('index')) 返回 render_template('signup.html')
mkdir signup
cd signup
在添加 html 注册表单之前,让我们通过添加用于验证双重选择加入功能的路由来完成后端。该路由使用我们之前创建的 s 变量,该变量生成时间敏感的秘密令牌。详细信息请参阅文档

最长期限是链接过期前的秒数,因此在本例中,用户有 20 分钟的时间来确认其电子邮件地址。

@app.route('/confirm_email/') def确认电子邮件(令牌): 尝试: email = s.loads(token, salt='email-confirm', max_age=1200) # 令牌在 1 小时后过期 签名过期除外: return '

令牌已过期!

' # 更新数据库中的字段 用户 = User.query.filter_by(email=email).first_or_404() 用户.验证= True db.session.commit() 返回“

电子邮件地址已确认!

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


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


电子邮件注册头>

注册

形式> {% with messages = get_flashed_messages(with_categories=true) %} {% 如果消息 %}
    {% 类别,消息中的消息 %}
  • {{ 消息 }}
  • {% 结束 %}
{% 结束 %} {% 结尾为 %} 正文>
mkdir signup
cd signup
当您在启用调试的情况下运行 Flask 命令时,您的代码应该可以正常工作。这将允许您在命令行和浏览器窗口中查看任何错误:


flask --app app.py --debug 运行
flask --app app.py --debug run 
版本声明 本文转载于:https://dev.to/therutkat/build-an-anti-spam-opt-in-email-registration-with-python-1034?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 4 快速​​部署PHP
    4 快速​​部署PHP
    Servbay 已成为轻松配置开发环境的首要工具。在本指南中,我们将演示如何快速、安全地部署 PHP 8.2,强调 Servbay 致力于简化部署过程。 先决条件 开始之前,请确保您的设备上安装了 Servbay。您可以直接从Servbay官方网站下载。安装直观;只需按照提示操作,就...
    编程 发布于2024-11-08
  • AngularJS 指令中的 Replace 属性何时被弃用?
    AngularJS 指令中的 Replace 属性何时被弃用?
    为什么 AngularJS 已弃用指令中的替换属性AngularJS 指令中的替换属性由于其复杂性和更好的出现而被弃用替代方案。根据官方 AngularJS API 文档,在未来的版本中它将默认为 false。弃用的原因AngularJS 团队发现了替换属性的几个问题:困难的语义: 它导致了属性合并...
    编程 发布于2024-11-08
  • 释放 Claude AI:用于经济实惠且灵活的 AI 集成的非官方 API
    释放 Claude AI:用于经济实惠且灵活的 AI 集成的非官方 API
    由 Anthropic 开发的 Claude AI 以其令人印象深刻的能力在人工智能界掀起了波澜。然而,官方 API 对于许多开发人员和小型企业来说可能过于昂贵。这就是我们的非官方 Claude AI API 的用武之地,它提供了一个更实惠、更灵活的解决方案,将 Claude 的力量集成到您的项目中...
    编程 发布于2024-11-08
  • 如何使用时间包确定 Go 中一个月的最后一天?
    如何使用时间包确定 Go 中一个月的最后一天?
    使用 Time.Time 确定给定月份的最后一天处理基于时间的数据时,通常需要确定指定月份的最后一天。无论该月有 28 天、29 天(闰年)还是 30 天或 31 天,这都会使这成为一项具有挑战性的任务。时间包解决方案Go 时间包其日期函数提供了一个方便的解决方案。 Date 的语法为:func D...
    编程 发布于2024-11-08
  • 如何在不支持的浏览器中实现“背景滤镜”效果?
    如何在不支持的浏览器中实现“背景滤镜”效果?
    CSS:为不可用的背景过滤器提供替代方案CSS 中的背景过滤器功能在大多数现代浏览器中仍然无法访问。虽然我们预计其未来的支持,但发现替代解决方案势在必行。实现类似效果的一种方法是采用具有微妙透明度的背景。下面的 CSS 代码演示了这种方法:/* Slightly transparent fallba...
    编程 发布于2024-11-08
  • Python 的 len() 函数对于不同的数据结构有多高效?
    Python 的 len() 函数对于不同的数据结构有多高效?
    理解Python内置数据结构中len()函数的成本Python中内置len()函数是确定各种数据结构长度的重要工具。它的效率至关重要,尤其是在处理大型数据集时。本文深入研究了 len() 对于不同内置数据类型(例如列表、元组、字符串和字典)的计算成本。O(1) 跨内置类型的复杂性关键要点是 len(...
    编程 发布于2024-11-08
  • 如何在 Python 中访问 Windows 剪贴板文本?
    如何在 Python 中访问 Windows 剪贴板文本?
    在 Python 中访问 Windows 剪贴板文本从 Windows 剪贴板检索文本是编程中的常见任务。本文探讨了如何使用 Python 的 win32clipboard 模块来实现此目的。pywin32 和 win32clipboardwin32clipboard 模块是 pywin32 的一部...
    编程 发布于2024-11-08
  • 如何修复 CentOS 5 上由于文件权限问题导致的 Nginx 403 Forbidden 错误?
    如何修复 CentOS 5 上由于文件权限问题导致的 Nginx 403 Forbidden 错误?
    Nginx 403 Forbidden:文件访问权限故障排除当在 Nginx 中遇到令人沮丧的“403禁止”错误时,确定根本原因可以是一个挑战。此错误通常表示对文件或目录的访问被拒绝。在该特定场景中,用户在 CentOS 5 上使用 PHP-FPM 配置了 Nginx,但无法提供指定源目录中的任何文...
    编程 发布于2024-11-08
  • React 中的函数和类组件与 TypeScript
    React 中的函数和类组件与 TypeScript
    在使用 TypeScript 的 React 中,我们可以使用两种主要方法来创建组件:功能组件和类组件。两种方法都允许使用 props 和 state,但使用的范例略有不同。 TypeScript 通过提供静态类型进一步增强了开发安全性,这使我们能够精确定义 props 和 state 的形状。 ...
    编程 发布于2024-11-08
  • 如何使用 Clang 检查编译器生成的 C++ 模板实例化代码?
    如何使用 Clang 检查编译器生成的 C++ 模板实例化代码?
    检查 C 语言中编译器生成的模板实例化 在 C 语言中,模板函数和类允许通过定义通用功能来重用代码专门针对不同类型。要了解编译器为模板实例化生成的代码,了解这些实例化的函数或类会很有帮助。Clang 的 AST 打印功能一个工具提供这种可见性的是 Clang 的抽象语法树 (AST) 打印功能,Cl...
    编程 发布于2024-11-08
  • 我从使用 Vue.js 构建计算器中学到了什么
    我从使用 Vue.js 构建计算器中学到了什么
    对于我的第四个项目,我使用 Vue.js 开发了一个 计算器 应用程序。对于理解如何处理用户输入、显示动态结果以及使用 JavaScript 执行计算来说,这是一次宝贵的经验。以下是我在构建此应用程序时学到的主要经验教训的细分。 1. 处理用户输入并更新显示 计算器需要接受用户输入(...
    编程 发布于2024-11-08
  • 在 Kubernetes 上设置 JFrog Artifactory 并连接 Spring Boot 应用程序
    在 Kubernetes 上设置 JFrog Artifactory 并连接 Spring Boot 应用程序
    本文档提供有关在 Kubernetes 集群中设置 JFrog Artifactory 的指南。它作为开发人员在本地计算机上运行的 Kubernetes 环境上安装和配置 JFrog 的基本教程。 设置本地环境来构建DevOps资源 我使用 Docker 容器为多个应用程序设置工作环...
    编程 发布于2024-11-08
  • Angular 与 React:4 中你应该选择哪一个?
    Angular 与 React:4 中你应该选择哪一个?
    前端开发者总是面临一个大问题:Angular 还是 React? 两个框架都很强大,但哪一个真正适合你的开发需求? ? 在这个全面的比较中,我详细分析了每个项目的主要差异、优势和劣势,帮助您为下一个项目做出正确的选择。无论您是初学者还是经验丰富的专业人士,本文都会为您提供做出明智决定所需的见解。 ?...
    编程 发布于2024-11-08
  • 如何将 Props 传递给 React Router 中的处理程序组件?
    如何将 Props 传递给 React Router 中的处理程序组件?
    使用 React Router 将 Props 传递给处理程序组件在利用 React Router 的 React.js 应用程序中,您可能会遇到需要将 props 传递给特定处理程序组件的场景。考虑以下应用程序结构:var Dashboard = require('./Dashboard'); v...
    编程 发布于2024-11-08
  • 通过 Maroto 在 Golang 中生成 PDF 来进行长期操作
    通过 Maroto 在 Golang 中生成 PDF 来进行长期操作
    Written by Subha Chanda✏️ Go, also known as Golang, is a statically typed, compiled programming language designed by Google. It combines the performan...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3