」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 Python 建立反垃圾郵件、選擇加入的電子郵件註冊

使用 Python 建立反垃圾郵件、選擇加入的電子郵件註冊

發佈於2024-09-01
瀏覽:149

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]刪除
最新教學 更多>
  • AngularJS 指令中的 Replace 屬性何時被棄用?
    AngularJS 指令中的 Replace 屬性何時被棄用?
    為什麼AngularJS 已棄用指令中的替換屬性AngularJS 指令中的替換屬性由於其複雜性和更好的出現而被棄用替代方案。根據官方 AngularJS API 文檔,在未來的版本中它將預設為 false。 棄用的原因AngularJS 團隊發現了替換屬性的幾個問題:困難的語義: 它導致了屬性合併...
    程式設計 發佈於2024-11-08
  • 如何在 JavaScript 和 jQuery 中無縫存取 PHP 變數?
    如何在 JavaScript 和 jQuery 中無縫存取 PHP 變數?
    在JavaScript 或jQuery 中存取PHP 變數:避免Echo 過載許多開發人員遇到在JavaScript 和jQuery 中存取PHP 變數的挑戰。傳統方法涉及回顯 PHP 標籤內的變量,例如:<?php echo $variable1; ?> <?php echo $...
    程式設計 發佈於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 fall...
    程式設計 發佈於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) 列印功能,Cla...
    程式設計 發佈於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'); var Co...
    程式設計 發佈於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