>  기사  >  백엔드 개발  >  Python을 사용하여 스팸 방지, 옵트인 이메일 등록 구축

Python을 사용하여 스팸 방지, 옵트인 이메일 등록 구축

王林
王林원래의
2024-08-14 14:35:321158검색

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

그럼 앱을 만들고 많은 사용자를 확보하고 싶으신가요?

우리 모두는 그렇습니다. 초보자라면 다음 이메일 가입 기능을 고려해야 합니다.

  1. 강력한 비밀번호를 갖춘 유효한 이메일 주소
  2. 봇 예방
  3. 이중 선택 가입

웹 앱, 뉴스레터, 무료 다운로드, 비공개 그룹 초대 및 리드 생성을 위해서는 견고한 이메일 가입 시스템이 필수적입니다. 앱에 액세스하기 위해 Auth0, Facebook 또는 Google과 같은 타사 서비스를 사용하지 마십시오. 앱 데이터를 그대로 유지하세요!

시작하려면 MySQL 데이터베이스와 함께 Flask 프레임워크를 사용할 것이므로 Python에 대한 경험이 있어야 합니다. 이것은 가장 인기 있는 CMS인 Wordpress를 사용하는 것보다 더 재미있을 것입니다. 무료 Flask 확장과 동일한 기능을 사용하려면 일부 Wordpress 플러그인에 대한 비용을 지불해야 합니다. 저는 이전에 두 가지 모두를 기반으로 구축했으며 Wordpress가 웹 앱을 만드는 데 매우 능숙함에도 불구하고 웹 앱용 Python Flask를 선호합니다.

각 코드 조각에 대해 설명하고 코드에 몇 가지 설명을 포함합니다. 사용자 등록을 구축하지 않았거나 내부 작동 방식을 알지 못하는 경우 자세한 내용을 설명하겠습니다. 첫 번째 단락에 명시된 대로 구현할 기능을 요약하면 다음과 같습니다.

  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
);

종속성 설치:
pip 플라스크 플라스크-메일 보안 SQLAlchemy Flask-WTF Flask-SQLAlchemy mysql-connector-python

또는 요구 사항.txt 파일에 동일한 내용을 나열하고 pip install -r 요구 사항.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에 스크립트를 실행하도록 지시하는 유비쿼터스 기본 명령문에 대해 설명합니다.

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

이 백엔드 코드를 완성하기 전에 사용자 입력을 위한 프런트엔드 HTML이 여전히 필요합니다. 우리는 Flask에 내장된 Jinja 템플릿을 사용하여 이 작업을 수행할 것입니다. 이전에 app.py에서 만든 경로와 이름이 일치하는 template/signup.html이라는 파일을 만듭니다. 기본적으로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.