«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Создайте систему защиты от спама и подписку на электронную почту с помощью Python.

Создайте систему защиты от спама и подписку на электронную почту с помощью Python.

Опубликовано 1 сентября 2024 г.
Просматривать:484

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

Итак, вы хотите создать приложение и привлечь много пользователей?

Все мы так делаем, и если вы новичок, вам необходимо принять во внимание следующие особенности регистрации по электронной почте.

  1. Действительный адрес электронной почты с надежным паролем
  2. Противодействие ботам
  3. Двойная регистрация

Надежная система регистрации по электронной почте необходима для веб-приложений, информационных бюллетеней, бесплатной загрузки, приглашений в частные группы и привлечения потенциальных клиентов. Давайте не будем полагаться на использование сторонних сервисов, таких как Auth0, Facebook или Google, для доступа к вашему приложению. Сохраняйте данные своего приложения!

Для начала вам необходимо иметь некоторый опыт работы с Python, поскольку мы собираемся использовать фреймворк Flask с базой данных MySQL. Это будет веселее, чем использовать Wordpress, самую популярную CMS. Вам придется заплатить за какой-нибудь плагин Wordpress, чтобы иметь те же возможности, что и бесплатное расширение Flask. Ранее я создавал оба приложения и предпочитаю Python Flask для веб-приложений, хотя Wordpress вполне способен создавать веб-приложения.

Каждый фрагмент кода будет объяснен и снабжен некоторыми комментариями. Если вы еще не создали систему регистрации пользователей или не знаете внутренней работы, я опишу вам детали. Вот краткое описание функций, которые мы реализуем, как указано в первом абзаце:

  1. Действительный адрес электронной почты можно проверить, проанализировав входную строку пользователя с помощью регулярного выражения или расширения Flask. Мы не допустим хаков с произвольным текстом или SQL-инъекций.

  2. Защиту от ботов можно выполнить с помощью скрытого поля, которое не отображается пользователю, но обычно автоматически заполняется ботами, сканирующими уязвимые формы регистрации.

  3. Метод двойного согласия требует, чтобы получатель дал разрешение вам отправлять ему электронные письма, получив ссылку для подтверждения на его почтовый ящик. В основном это используется для предотвращения использования вашего адреса электронной почты кем-либо другим. Это также предотвращает пользователей, которые просто зарегистрировались и покинули свои учетные записи.

Давайте напишем код!

Создайте рабочий каталог:

mkdir signup
cd signup

Создайте среду Python, используя python3 -m venv Signup или conda create -n Signup python3. Я предпочитаю конду.

Создайте таблицу 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

Альтернативно, вы можете указать то же самое в файле требований.txt и запустить pip install -r require.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'] = '[email protected]'
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.

В следующем разделе используется структура ORM SQLAlchemy для запроса базы данных. Обратите внимание, что имя класса должно совпадать с именем таблицы вашей базы данных, иначе вы получите сообщение об ошибке. Модель 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 вручную, вы можете сделать это с помощью этого кода Flask непосредственно после блока кода пользователя класса:

# Create the database table
with app.app_context():
    db.create_all()

Для краткости этого руководства мы пропустим индексную страницу или то, что вы хотите назвать домашней страницей вашего приложения, и просто покажем страницу регистрации, используя функцию декоратора Python для маршрута страницы:

@app.route('/')
def index():
    return '

Homepage

' @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='[email protected]', 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/')
def confirm_email(token):
    try:
        email = s.loads(token, salt='email-confirm', max_age=1200)  # Token expires after 1 hour
    except SignatureExpired:
        return '

The token is expired!

' # Update field in database user = User.query.filter_by(email=email).first_or_404() user.validated = True db.session.commit() return '

Email address confirmed!

'

Теперь, что касается вездесущего основного оператора, который сообщает Python о необходимости выполнения сценария, если файл выполняется напрямую (в отличие от импортированного модуля):

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

Прежде чем мы завершим этот внутренний код, нам все еще нужен внешний HTML-код для ввода данных пользователем. Мы собираемся сделать это с помощью встроенного шаблона Jinja Flask. Создайте файл с именем templates/signup.html, имя которого должно совпадать с маршрутом, который вы создали ранее в app.py. По умолчанию Jinja использует каталог /templates для файлов html. Вы можете изменить этот параметр, но в этом уроке мы будем использовать каталог /templates приложения.



    Email Sign Up

Sign Up

{% with messages = get_flashed_messages(with_categories=true) %} {% if messages %}
    {% for category, message in messages %}
  • {{ message }}
  • {% endfor %}
{% endif %} {% endwith %}

Ваш код должен работать с этого момента, когда вы запускаете команду flask с включенной отладкой. Это позволит вам увидеть любые ошибки в командной строке, а также в окне браузера:

flask --app app.py --debug run 
Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/therutkat/build-an-anti-spam-opt-in-email-registration-with-python-1034?1. В случае нарушения прав обращайтесь по адресу Study_golang@163. .com, чтобы удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3