首頁  >  文章  >  後端開發  >  使用 Python 建立反垃圾郵件、選擇加入的電子郵件註冊

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

王林
王林原創
2024-08-14 14:35:321158瀏覽

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