Créez un enregistrement de courrier électronique anti-spam et opt-in avec Python

王林
Libérer: 2024-08-14 14:35:32
original
1163 Les gens l'ont consulté

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

Vous souhaitez donc créer une application et attirer de nombreux utilisateurs ?

Nous le faisons tous et si vous êtes débutant, vous devez prendre en compte les fonctionnalités d'inscription par e-mail suivantes.

  1. Adresse email valide avec un mot de passe fort
  2. Prévention des robots
  3. Inscription à double opt-in

Un système d'inscription par e-mail solide est essentiel pour les applications Web, les newsletters, les téléchargements gratuits, les invitations à des groupes privés et la génération de leads. Ne comptons pas sur l'utilisation de services tiers tels que Auth0, Facebook ou Google pour accéder à votre application. Gardez les données de votre application !

Pour commencer, vous devez avoir une certaine expérience en Python car nous allons utiliser le framework Flask avec une base de données MySQL. Cela va être plus amusant que d'utiliser Wordpress, le CMS le plus populaire. Vous devrez payer pour un plugin Wordpress pour avoir les mêmes fonctionnalités qu'une extension Flask gratuite. J'ai déjà construit sur les deux et je préfère Python Flask pour les applications Web, même si Wordpress est très capable de créer des applications Web.

Chaque extrait de code sera expliqué et inclura quelques commentaires dans le code. Si vous n'avez pas créé d'enregistrement d'utilisateur ou si vous ne connaissez pas le fonctionnement interne, je décrirai les détails pour vous. Voici un résumé des fonctionnalités que nous mettrons en œuvre comme indiqué dans le premier paragraphe :

  1. Une adresse e-mail valide peut être vérifiée en analysant la chaîne d'entrée de l'utilisateur à l'aide d'une expression régulière ou d'une extension Flask. Nous n'autoriserons pas les hacks de type texte aléatoire ni injection SQL.

  2. La
  3. La prévention des robots peut être effectuée avec un champ caché qui n'est pas affiché à l'utilisateur mais qui est généralement rempli automatiquement par les robots qui explorent les formulaires d'inscription vulnérables.

  4. La méthode de double opt-in nécessite que le destinataire vous autorise à lui envoyer un e-mail en recevant un lien de validation dans sa boîte de réception. Ceci est principalement utilisé pour empêcher quelqu'un d'autre d'utiliser votre adresse e-mail. Cela empêche également les utilisateurs de test qui se contentent de s'inscrire et d'abandonner leur compte.

Codons-le !

Créez un répertoire de travail :

mkdir signup
cd signup
Copier après la connexion

Créez votre environnement Python en utilisant python3 -m venv signup ou conda create -n signup python3. Je préfère conda.

Créez une table MySQL pour stocker vos utilisateurs. Le champ validé est pour le double opt-in :

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
);
Copier après la connexion

Installer les dépendances :
pip flask flask-mail sécurisé SQLAlchemy Flask-WTF Flask-SQLAlchemy mysql-connector-python

Alternativement, vous pouvez avoir la même chose répertoriée dans un fichier exigences.txt et exécuter pip install -r exigences.txt

Créez le fichier app.py avec les dépendances suivantes :

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
Copier après la connexion

Entrez vos propres données de configuration de serveur en utilisant ces lignes :

# 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
Copier après la connexion

En fin de compte, vous devriez avoir vos informations de configuration dans un fichier .env.

La section suivante utilise la structure ORM de SQLAlchemy pour interroger la base de données pour vous. Notez que le nom de la classe doit correspondre au nom de votre table de base de données sinon vous obtiendrez une erreur. Le db.model représente les paramètres de votre table qui incluent le nom de la colonne, son type, sa longueur, sa clé et sa valeur nulle :

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)
Copier après la connexion

Si vous n'avez pas déjà créé manuellement la table de la base de données MySQL, vous pouvez le faire avec ce code Flask directement après le bloc de code utilisateur de la classe :

# Create the database table
with app.app_context():
    db.create_all()
Copier après la connexion

Par souci de concision de ce didacticiel, nous ignorons la page d'index ou ce que vous voudriez appeler la page d'accueil de votre application et affichons simplement la page d'inscription à l'aide de la fonction de décoration de Python pour l'itinéraire de la page :

@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')
Copier après la connexion

Avant d'ajouter le formulaire d'inscription html, complétons le backend en ajoutant l'itinéraire de validation de la fonctionnalité de double opt-in. Cette route utilise la variable s que nous avons créée précédemment qui génère le jeton secret sensible au temps. Voir la documentation pour plus de détails
L'âge maximum correspond aux secondes précédant l'expiration du lien. Dans ce cas, l'utilisateur dispose de 20 minutes pour confirmer son adresse e-mail.

@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>'

Copier après la connexion

Maintenant, l'instruction principale omniprésente qui indique à Python d'exécuter le script si le fichier est exécuté directement (par opposition à un module importé) :

if __name__ == '__main__':
    app.run(debug=True)
Copier après la connexion

Avant de terminer ce code back-end, nous avons encore besoin du code HTML front-end pour la saisie de l'utilisateur. Nous allons le faire avec le modèle Jinja intégré de Flask. Créez un fichier nommé templates/signup.html dont le nom doit correspondre à l'itinéraire que vous avez créé précédemment dans app.py. Par défaut, Jinja utilise le répertoire /templates pour les fichiers html. Vous pouvez modifier ce paramètre mais pour ce tutoriel, nous allons utiliser le répertoire /templates de l'application.

<!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>

Copier après la connexion

Votre code devrait fonctionner à partir de ce point lorsque vous exécutez la commande flask avec le débogage activé. Cela vous permettra de voir les erreurs éventuelles dans la ligne de commande ainsi que dans la fenêtre du navigateur :

flask --app app.py --debug run 
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!