"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Crie um registro de e-mail anti-spam e opcional com Python

Crie um registro de e-mail anti-spam e opcional com Python

Publicado em 01/09/2024
Navegar:519

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

Então você quer construir um aplicativo e conseguir muitos usuários?

Todos nós fazemos isso e se você é iniciante, precisa levar em consideração os seguintes recursos de inscrição por e-mail.

  1. Endereço de e-mail válido com uma senha forte
  2. Prevenção de bots
  3. Inscrição dupla de aceitação

Um sistema sólido de inscrição por e-mail é essencial para aplicativos da web, boletins informativos, downloads de brindes, convites para grupos privados e geração de leads. Não vamos depender do uso de serviços de terceiros, como Auth0, Facebook ou Google, para ter acesso ao seu aplicativo. Mantenha seus dados de aplicativos!

Para começar, você deve ter alguma experiência em Python porque usaremos o framework Flask com um banco de dados MySQL. Isso será mais divertido do que usar o Wordpress, o CMS mais popular. Você teria que pagar por algum plugin do Wordpress para ter a mesma capacidade de uma extensão Flask gratuita. Eu desenvolvi anteriormente em ambos e prefiro Python Flask para aplicativos da web, embora o Wordpress seja muito capaz de criar aplicativos da web.

Cada trecho de código será explicado e incluirá alguns comentários no código. Caso você não tenha criado o registro do usuário ou não conheça o funcionamento interno, descreverei os detalhes para você. Aqui está um resumo dos recursos que implementaremos conforme declarado no primeiro parágrafo:

  1. Um endereço de e-mail válido pode ser verificado analisando a string de entrada do usuário usando uma expressão regular ou uma extensão Flask. Não permitiremos hacks de texto aleatório nem de injeção de SQL.

  2. Prevenção de bots pode ser feita com um campo oculto que não é mostrado ao usuário, mas geralmente é preenchido automaticamente por bots que rastreiam formulários de inscrição vulneráveis.

  3. O

    método de aceitação dupla exige que o destinatário dê permissão para que você envie um e-mail para ele, recebendo um link de validação em sua caixa de entrada. Isso é usado principalmente para evitar que outra pessoa use seu endereço de e-mail. Isso também evita que usuários de teste simplesmente se inscrevam e abandonem suas contas.

Vamos codificar!

Crie um diretório de trabalho:


inscrição mkdir inscrição de CD
mkdir signup
cd signup
Crie seu ambiente Python usando python3 -m venv signup ou conda create -n signup python3. Eu prefiro conda.

Crie uma tabela MySQL para armazenar seus usuários. O campo validado é para double opt-in:


CREATE TABLE usuários ( id INT AUTO_INCREMENT CHAVE PRIMÁRIA, e-mail VARCHAR(120) NÃO NULO ÚNICO, senha VARCHAR(120) NÃO NULA, criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP, validado BOOLEAN DEFAULT FALSE );
mkdir signup
cd signup
Instalar dependências:

pip flask flask-mail seguro SQLAlchemy Flask-WTF Flask-SQLAlchemy mysql-connector-python

Alternativamente, você pode ter o mesmo listado em um arquivo requirements.txt e executar pip install -r requisitos.txt

Crie o arquivo app.py com as seguintes dependências:


da importação do frasco Flask, render_template, request, url_for, redireccionamento, flash from flask_mail importar correio, mensagem de data e hora importar data e hora de flask_sqlalchemy importar SQLAlchemy da função de importação sqlalchemy.sql de sua importação perigosa URLSafeTimedSerializer, SignatureExpired de werkzeug.security importar generate_password_hash, check_password_hash importar segredos
mkdir signup
cd signup
Insira seus próprios dados de configuração do servidor usando estas linhas:


# Configurações de frasco segredo = segredos.token_urlsafe(32) app.secret_key = segredo app.config['SECRET_KEY'] = secret # chave secreta gerada automaticamente #Configurações SQLAlchemy SQLALCHEMY_DATABASE_URI = 'mysql mysqlconnector://admin:user@localhost/nomedatabela' # Configurações de e-mail app.config['MAIL_SERVER'] = 'smtp.example.com' app.config['MAIL_PORT'] = 587 app.config['MAIL_USERNAME'] = '[email protected]' app.config['MAIL_PASSWORD'] = 'sua_senha' app.config['MAIL_USE_TLS'] = Verdadeiro app.config['MAIL_USE_SSL'] = Falso banco de dados = SQLAlchemy(aplicativo) correio = Correio(aplicativo) s = URLSafeTimedSerializer(app.config['SECRET_KEY']) #set secret para o serliazer
mkdir signup
cd signup
Em última análise, você deve ter suas informações de configuração em um arquivo .env.

A próxima seção usa a estrutura ORM do SQLAlchemy para consultar o banco de dados para você. Observe que

o nome da classe deve corresponder ao nome da tabela do banco de dados, caso contrário, você receberá um erro. O db.model representa as configurações da sua tabela que incluem o nome da coluna, seu tipo, comprimento, chave e valor nulo:

classe Usuário(db.Model): id = db.Coluna (db.Integer, chave_primária=True) email = db.Column(db.String(120), exclusivo=Verdadeiro, anulável=Falso) senha = db.Column(db.String(120), anulável=Falso) criado_at = db.Column(db.DateTime, server_default=db.func.now()) validado = db.Column(db.Boolean, padrão=False)
mkdir signup
cd signup
Se você ainda não criou manualmente a tabela do banco de dados MySQL, você pode fazê-lo com este código Flask diretamente após a classe User code block:


# Crie a tabela do banco de dados com app.app_context(): db.create_all()
mkdir signup
cd signup
Para resumir este tutorial, estamos ignorando a página de índice ou o nome que você gostaria de chamar de página inicial do seu aplicativo e apenas mostrando a página de inscrição usando a função decoradora do Python para a rota da página:


@app.route('/') índice de definição(): retornar '

Página inicial

' @app.route('/signup', métodos=['GET', 'POST']) inscrição def(): se request.method == 'POST': # Validação de campo oculto para evitar envio de bot campo_oculto = request.form.get('campo_oculto') se campo_oculto: return redirect(url_for('index')) # Bot detectado, ignore o envio email = request.form['email'] senha = request.form['senha'] hashed_password = generate_password_hash(senha, método='sha256') #Inserir usuário no banco de dados new_user = Usuário(e-mail=e-mail, senha=hashed_password) db.session.add(novo_usuário) db.sessão.commit() #Enviar e-mail de confirmação token = s.dumps(email, salt='email-confirm') msg = Mensagem('Confirme seu e-mail', remetente='[email protected]', destinatários=[e-mail]) link=url_for('confirm_email', token=token, _external=True) msg.body = f'Seu link é {link}' mail.send(msg) flash('Um e-mail de confirmação foi enviado para seu endereço de e-mail.', 'sucesso') retornar redirecionamento(url_for('index')) retornar render_template('signup.html')
mkdir signup
cd signup
Antes de adicionar o formulário de inscrição em HTML, vamos completar o back-end adicionando a rota para validar o recurso de aceitação dupla. Esta rota usa a variável s que criamos anteriormente, que gera o token secreto sensível ao tempo. Consulte a documentação para obter detalhes

A idade máxima são segundos antes do link expirar, portanto, neste caso, o usuário tem 20 minutos para confirmar seu endereço de e-mail.

@app.route('/confirm_email/') def confirm_email(token): tentar: email = s.loads(token, salt='email-confirm', max_age=1200) # O token expira após 1 hora exceto SignatureExpired: return '

O token expirou!

' #Atualiza campo no banco de dados usuário = User.query.filter_by(email=email).first_or_404() usuário.validado = Verdadeiro db.sessão.commit() retorne '

Endereço de e-mail confirmado!

'
mkdir signup
cd signup
Agora, para a instrução principal onipresente que diz ao Python para executar o script se o arquivo estiver sendo executado diretamente (em oposição a um módulo importado):


se __nome__ == '__main__': app.run(depuração=Verdadeiro)
mkdir signup
cd signup
Antes de concluirmos este código de back-end, ainda precisamos do html de front-end para a entrada do usuário. Faremos isso com o modelo Jinja integrado do Flask. Crie um arquivo chamado templates/signup.html cujo nome deve corresponder à rota que você criou anteriormente em app.py. Por padrão, Jinja usa o diretório /templates para os arquivos html. Você pode alterar essa configuração, mas para este tutorial usaremos o diretório /templates do aplicativo.


Inscrição por e-mail

Inscreva-se

{% com mensagens = get_flashed_messages(with_categories=true) %} {% se mensagens %}
    {% para categoria, mensagem em mensagens %}
  • {{ mensagem }}
  • {% fim para %}
{% endif %} {% final com %}
Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/therutkat/build-an-anti-spam-opt-in-email-registration-with-python-1034?1 Se houver alguma violação, entre em contato com study_golang@163 .com para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3