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

王林
풀어 주다: 2024-08-14 14:35:32
원래의
1181명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿