ホームページ  >  記事  >  バックエンド開発  >  Python を使用してスパム対策のオプトイン電子メール登録を構築する

Python を使用してスパム対策のオプトイン電子メール登録を構築する

王林
王林オリジナル
2024-08-14 14:35:321164ブラウズ

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

アプリを構築して多くのユーザーを獲得したいと考えていますか?

初心者の場合は、次の電子メール サインアップ機能を考慮する必要があります。

  1. 強力なパスワードを持つ有効な電子メール アドレス
  2. ボットの防止
  3. ダブルオプトインサインアップ

Web アプリ、ニュースレター、景品のダウンロード、プライベート グループへの招待、見込み客発掘には、堅牢な電子メール サインアップ システムが不可欠です。アプリにアクセスするために、Auth0、Facebook、Google などのサードパーティ サービスの使用に依存しないようにしましょう。 アプリのデータを自分のものにしましょう!

まず、MySQL データベースで Flask フレームワークを使用するため、Python の経験が必要です

。これは、最も人気のある CMS である Wordpress を使用するよりも楽しいでしょう。無料の Flask 拡張機能と同じ機能を持たせるには、一部の Wordpress プラグインに料金を支払う必要があります。 Wordpress は Web アプリを作成する能力が非常に高いですが、私は以前両方でビルドしたことがあり、Web アプリには Python Flask を好みます。

各コード スニペットについて説明し、コード内にいくつかのコメントを含めます。ユーザー登録を構築したことがない場合、または内部の仕組みを知らない場合のために、詳細を説明します。最初の段落で述べたように実装する機能の概要は次のとおりです。
  1. 有効な電子メール アドレス

    は、正規表現または Flask 拡張機能を使用してユーザーからの入力文字列を解析することでチェックできます。ランダム テキストや SQL インジェクション タイプのハッキングは許可されません。
  2. ボット防止

    は、ユーザーには表示されない非表示フィールドを使用して実行できますが、通常は、脆弱なサインアップ フォームを巡回するボットによって自動入力されます。
  3. ダブル オプトイン メソッド

    では、受信者が受信トレイへの検証リンクを受信して​​電子メールを送信する許可を与える必要があります。これは主に、他人があなたの電子メール アドレスを使用するのを防ぐために使用されます。これにより、テスト ユーザーがサインアップしただけでアカウントを放棄することも防止されます。

コードを書いてみましょう!


作業ディレクトリを作成します:

mkdir signup
cd signup

python3 -m venvsignup または conda create -nsignup 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
);


依存関係をインストールします:
pip flask flask-mail secure 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 は、列名、その型、長さ、キー、null 値を含むテーブル設定を表します:

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 データベース テーブルをまだ手動で作成していない場合は、クラス ユーザー コード ブロックの直後にこの 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>'


次に、ファイルが (インポートされたモジュールではなく) 直接実行されている場合にスクリプトを実行するように Python に指示するユビキタスな main ステートメントについて説明します。

if __name__ == '__main__':
    app.run(debug=True)


このバックエンド コードを完了する前に、ユーザー入力用のフロントエンド HTML がまだ必要です。 Flask の組み込みの Jinja テンプレートを使用してこれを実行します。 templates/signup.html という名前のファイルを作成します。このファイルは、app.py で前に作成したルートと名前が一致する必要があります。デフォルトでは、Jinja は HTML ファイル用にディレクトリ /templates を使用します。この設定は変更できますが、このチュートリアルでは、アプリの /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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。