Tutorial do Desenvolvedor: Como Criar, Gerenciar e Enviar Emails a Partir de um Formulário de Contato em Python

On junho 05, 2024
13min read
Veljko Ristić Content Manager @ Mailtrap
This is a graphic representation of Python contact form for an article that covers the topic in detail.

Este tutorial guia você pelos conceitos essenciais para construir um formulário de contato em Python, coletar dados do usuário e integrar funcionalidades de email.

Utilizarei Mailtrap para envio de email via SMTP e API. E mostrarei como testar emails para garantir que eles cheguem na caixa de entrada dos destinatários, e não na pasta de spam.

Ao final, você terá insights práticos sobre como tornar um formulário de contato simples funcional e seguro usando validação e verificação no backend.

Como configurar seu ambiente Python?

Como este tutorial é voltado para desenvolvedores iniciantes, cobrirei brevemente a configuração do Python, as bibliotecas necessárias e a configuração do ambiente virtual para usuários de MacOS, Linux e Windows.

Mas se você já tem tudo isso, sinta-se à vontade para pular para a seção “como criar um formulário de contato”.

Passo 1: Instalar o Python

No momento da escrita deste artigo, a versão estável do Python era 3.12.3. Eu geralmente recomendaria usar Python 3.8.xy ou superior para compatibilidade ideal com as bibliotecas necessárias.

Aqui está a instalação para diferentes sistemas operacionais.

Windows:

  1. Baixe o instalador do Python no site oficial do Python.
  2. Execute o instalador. Marque a caixa que diz Add Python 3.x to PATH antes de clicar em Install Now.

MacOS:

  1. Instale o Python usando o Homebrew (um gerenciador de pacotes para macOS). Se você não tiver o Homebrew instalado, cole o seguinte comando no seu terminal para instalá-lo:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. Depois que o Homebrew estiver instalado, você pode instalar o Python executando:
brew install python

Linux: 

  1. A maioria das distribuições Linux vem com o Python pré-instalado. Você pode verificar se o Python está instalado e sua versão executando:
python3 --version
  1. Se não estiver instalado, você pode instalá-lo via gerenciador de pacotes da sua distribuição. Por exemplo, no Ubuntu:
sudo apt update
sudo apt install python3

Passo 2: Configurar um ambiente virtual

Você deve usar um ambiente virtual porque permite gerenciar dependências separadas para cada projeto em que você está trabalhando. Aqui está como fazer isso:

  1. Instale o pacote virtualenv se ele não estiver instalado:
pip install virtualenv
  1. Crie um novo ambiente virtual no diretório do seu projeto:
virtualenv venv
  1. Ative o ambiente virtual:
  • Windows
.\venv\Scripts\activate
  • MacOS/Linux 
source venv/bin/activate

Depois de ativar seu ambiente virtual, você notará o nome do ambiente (venv) aparecendo no início do prompt do terminal, indicando que você está trabalhando dentro do ambiente virtual.

Dependendo de como você decidir lidar com os dados do formulário e enviar emails, pode precisar de bibliotecas específicas como flask para um servidor web leve, ou requests para lidar com requisições HTTP se usar APIs. Você pode instalar bibliotecas Python usando pip, por exemplo:

pip install flask
pip install requests

Como criar um formulário de contato em Python?

Aqui, mostrarei um método para criar um formulário de contato em Python que pode ser incorporado na sua página de contato, por exemplo.

O formulário básico abaixo coleta inputs do usuário. Inclui campos de nome do usuário, email, mensagem e o botão de enviar. Para o exemplo dado, salvarei o formulário no arquivo HTML chamado contact_form.html.

Nota: Para simplicidade, não incluí estilos CSS, classes div, etc. Mas você pode adicionar qualquer estilo, widget emailfield ou outros elementos personalizados conforme achar necessário.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Formulário de Contato</title>
</head>
<body>
    <h1>Contacte-nos</h1>
    <form action="/submit_form.py" method="post">
        <label for="name">Nome:</label><br>
        <input type="text" id="name" name="name" required><br>
        <label for="email">Email:</label><br>
        <input type="email" id="email" name="email" required><br>
        <label for="message">Mensagem:</label><br>
        <textarea id="message" name="message" required></textarea><br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

Para os próximos passos, já escrevemos um blog sobre como criar um formulário de contato em Django, então sinta-se à vontade para conferir.

Como coletar dados de um formulário de contato em Python?

O manuseio seguro de dados de formulários web protege contra problemas comuns de segurança, como injeção de SQL, XSS (Cross-Site Scripting), etc. Nesta seção, mostrarei como receber e manipular requisições POST de forma segura em Python, focando na prevenção de vulnerabilidades comuns de segurança.

Para lidar com requisições POST de forma segura, usarei um framework básico do lado do servidor em Python, o Flask. Ele ajuda a inicializar o processo de desenvolvimento web porque simplifica o recebimento e processamento de dados de formulários web.

Abaixo está uma configuração simples de uma aplicação Flask para lidar com uma requisição POST.

Aqui está um lembrete sobre como instalar o Flask, se você ainda não o fez.

pip install Flask

Depois, crie um novo arquivo Python, app.py, e escreva o seguinte código:

from flask import Flask, request, render_template_string

app = Flask(__name__)

@app.route('/')
def form():
    return '''
        <form action="/submit" method="post">
            <label for="name">Nome:</label><br>
            <input type="text" id="name" name="name" required><br>
            <label for="email">Email:</label><br>
            <input type="email" id="email" name="email" required><br>
            <label for="message">Mensagem:</label><br>
            <textarea id="message" name="message" required></textarea><br>
            <input type="submit" value="Submit">
        </form>
    '''

@app.route('/submit', methods=['POST'])
def submit():
    # Use o objeto request para acessar os dados do formulário
    name = request.form['name']
    email = request.form['email']
    message = request.form['message']

    # Faça escape do input para prevenir XSS
    safe_name = html.escape(name)
    safe_email = html.escape(email)
    safe_message = html.escape(message)

    return render_template_string('''
        <h1>Obrigado!</h1>
        <p>Seu nome: {{name}}</p>
        <p>Seu email: {{email}}</p>
        <p>Sua mensagem: {{message}}</p>
    ''', name=safe_name, email=safe_email, message=safe_message)

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

Resumo rápido:

  • O decorador Flask @app.route('/') cria um formulário HTML simples na página inicial.
  • O formulário envia dados para /submit, onde outra rota lida com a requisição POST.
  • Os dados do formulário são acessados via request.form, que é um objeto parecido com um dicionário.
  • A função html.escape é usada para sanitizar os dados de entrada, mitigando o risco de ataques XSS ao escapar caracteres especiais do HTML.
  • render_template_string é uma função do Flask que permite renderizar HTML diretamente de uma string enquanto injeta dados de forma segura usando a template Jinja2, que escapa automaticamente todo o conteúdo das variáveis por padrão.

Pro Tip: Se você estiver usando o framework Django, os seguintes arquivos py são úteis.

  • forms.py – define classes de formulários que representam formulários HTML
  • views.py – contém as views da sua aplicação Django
  • settings.py – configura as definições do seu projeto Django
  • urls.py – define as configurações de URL do seu projeto Django

Como validar e verificar dados de um formulário de contato?

Implementarei validação básica em Python usando Flask, já que o framework oferece uma metodologia direta. Isso ajuda a validar endereços de email, prevenir processamento de dados errôneos e dados maliciosos.

Se precisar de mais detalhes sobre como validar endereços de email em Python, clique no link aqui.

Agora, assumindo que você tenha o Flask instalado, continuarei usando o arquivo app.py onde anteriormente configurei o envio do formulário. Aqui está um exemplo:

from flask import Flask, request, render_template_string, redirect, url_for
import re

app = Flask(__name__)

@app.route('/')
def form():
    return '''
        <form action="/submit" method="post">
            <label for="name">Nome:</label><br>
            <input type="text" id="name" name="name" required><br>
            <label for="email">Email:</label><br>
            <input type="email" id="email" name="email" required><br>
            <label for="message">Mensagem:</label><br>
            <textarea id="message" name="message" required></textarea><br>
            <input type="submit" value="Submit">
        </form>
    '''

@app.route('/submit', methods=['POST'])
def submit():
    name = request.form['name']
    email = request.form['email']
    message = request.form['message']

    # Validar os dados do formulário
    if not re.match(r"[^@]+@[^@]+\.[^@]+", email):
        return "Email inválido, por favor volte e insira um email válido."

    if not name.strip():
        return "Nome é obrigatório, por favor volte e preencha o campo de nome."

    if not message.strip():
        return "Mensagem é obrigatória, por favor volte e preencha o campo de mensagem."

    return render_template_string('''
        <h1>Obrigado!</h1>
        <p>Seu nome: {{name}}</p>
        <p>Seu email: {{email}}</p>
        <p>Sua mensagem: {{message}}</p>
    ''', name=name, email=email, message=message)

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

Resumo rápido:

  • Usei uma expressão regular simples (regex) para validar formatos de email. Esta regex verifica se o email contém caracteres antes e depois do símbolo “@” e pelo menos um ponto na parte do domínio. É uma validação básica e pode precisar ser estendida conforme suas necessidades.
  • O código assegura que tanto os campos name quanto message do formulário não estejam apenas preenchidos, mas também contenham caracteres que não sejam espaços em branco.
  • Se a validação falhar, o usuário recebe uma mensagem de erro instruindo-o a voltar e corrigir a entrada. Em uma aplicação mais complexa, você pode querer redirecionar de volta ao formulário com os campos pré-preenchidos com a entrada anterior e mensagens de erro detalhadas.

Agora, gostaria de destacar alguns exemplos de boas práticas que poderiam garantir ainda mais a segurança dos dados do formulário.

  • Sempre sanitize os inputs para prevenir vulnerabilidades de segurança, como ataques XSS (ver o próximo exemplo de código).
  • Considere usar validação no lado do cliente para melhorar a experiência do usuário, mas nunca confie apenas nisso para segurança.
  • Expressões regulares para validação de email podem ficar bastante complexas se você buscar precisão devido à variedade de formatos de email válidos. Considere usar bibliotecas projetadas para validação de email se isso se tornar uma limitação – uma opção popular é email-validator (compatível com Python 3.8 e superior).

Sanitização de inputs para prevenir ataques XSS

Vou melhorar a aplicação Flask anterior adicionando sanitização ao processo de manipulação de entradas usando as utilidades Markup do Flask e a função escape.

Esta função converte caracteres especiais no input (como <, >, &, ', ") que têm significado no HTML em seus equivalentes seguros em entidades HTML.

from flask import Flask, request, render_template_string, escape

app = Flask(__name__)

@app.route('/')
def form():
    return '''
        <form action="/submit" method="post">
            <label for="name">Nome:</label><br>
            <input type="text" id="name" name="name" required><br>
            <label for="email">Email:</label><br>
            <input type="email" id="email" name="email" required><br>
            <label for="message">Mensagem:</label><br>
            <textarea id="message" name="message" required></textarea><br>
            <input type="submit" value="Submit">
        </form>
    '''

@app.route('/submit', methods=['POST'])
def submit():
    # Obter dados do formulário
    name = request.form['name']
    email = request.form['email']
    message = request.form['message']

    # Sanitizar inputs para prevenir XSS
    safe_name = escape(name)
    safe_email = escape(email)
    safe_message = escape(message)

    # Continuar processando ou armazenando dados
    return render_template_string('''
        <h1>Obrigado!</h1>
        <p>Seu nome: {{ name }}</p>
        <p>Seu email: {{ email }}</p>
        <p>Sua mensagem: {{ message }}</p>
    ''', name=safe_name, email=safe_email, message=safe_message)

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

Resumo rápido:

  • A função escape das utilidades do Flask é usada aqui para sanitizar os campos de nome, email e mensagem. Esta função assegura que se o input incluir código HTML ou JavaScript, ele será escapado (convertido para um formato seguro que os navegadores não executarão).
  • Quando essas variáveis sanitizadas são usadas para gerar uma resposta, mesmo que um atacante tente injetar scripts maliciosos, os scripts não serão executados, mas serão exibidos como texto simples.

Enviar um email a partir de um formulário de contato em Python usando SMTP

Usarei o Mailtrap Email Sending SMTP, parte da Plataforma de Email Delivery do Mailtrap. Ela oferece aos desenvolvedores uma infraestrutura com altas taxas de entregabilidade por padrão e por design.

Se você não é usuário do Mailtrap, pode se inscrever aqui. Depois, adicione e verifique seu domínio (fornecemos todos os registros DNS necessários). Em seguida, você pode acessar as Configurações de SMTP/API, escolher seu stream preferido, Transacional ou em Massa, e obter as credenciais SMTP.

Nota: Você pode enviar emails Transacionais e em Massa dentro do mesmo Plano de Email Sending, sem cobranças extras.

Stream Transacional e em Massa do Mailtrap Email Sending

Com isso fora do caminho, mostrarei como configurar o Python passo a passo.

Passo 1: Instalar as bibliotecas necessárias

Certifique-se de ter a biblioteca email para compor emails, além de smtplib para enviá-los. Normalmente, email está incluída na biblioteca padrão do Python.

pip install smtplib

(Nota: smtplib faz parte da biblioteca padrão, então você não precisa instalá-la. Mas você pode executar o comando fornecido para garantir que seu ambiente esteja configurado corretamente.)

Passo 2: Configuração do SMTP

Extraia as configurações SMTP da sua conta Mailtrap. Você pode encontrar uma configuração de exemplo na aba SMTP/API Settings (como mostrado na imagem acima).

  • Host: live.smtp.mailtrap.io (ou ‘bulk.smtp.mailtrap.io’ para emails em massa)
  • Porta: 587 
  • Nome de usuário: api
  • Senha: {sua_senha_mailtrap}

Passo 3: Criar um script para enviar o email

Aqui, darei um exemplo básico de um script de envio de email em Python.

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# Credenciais e configuração do servidor Mailtrap
smtp_server = 'live.smtp.mailtrap.io'
smtp_port = 587
smtp_username = 'api'
smtp_password = 'sua_senha_mailtrap'

# Configuração do conteúdo do email
sender_email = "remetente@exemplo.com"
receiver_email = "para@exemplo.com"
subject = "Teste de Formulário de Contato Python"
body = "Este é um email de teste do formulário de contato Python."

# Crie uma mensagem multipart e defina os cabeçalhos
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject

# Adicione o corpo ao email
message.attach(MIMEText(body, "plain"))

# Conecte-se ao servidor Mailtrap e envie o email
try:
    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.login(smtp_username, smtp_password)
        server.sendmail(sender_email, receiver_email, message.as_string())
    print("Email enviado com sucesso!")
except Exception as e:
    print(f"Falha ao enviar email: {e}")

Resumo rápido:

  • O script configura uma conexão SMTP usando as credenciais do Mailtrap.
  • Ele cria uma mensagem de email usando MIMEMultipart e MIMEText da biblioteca email para lidar com o conteúdo em texto simples.
  • A conexão usa a declaração with para garantir que a conexão com o servidor seja fechada após o envio do email, e server.login autentica com suas credenciais Mailtrap.
  • server.sendmail envia o email. Se houver um erro, ele será capturado e impresso.

Enviar um email a partir de um formulário de contato em Python usando API

A Plataforma de Email Delivery do Mailtrap possui seu SDK oficial Python, e usarei isso para mostrar como enviar via API.

O código abaixo é uma versão simplificada adaptada às necessidades do formulário de contato. Mas se você precisar de uma integração mais abrangente com anexos e talvez vários destinatários, consulte a documentação do SDK no GitHub linkada acima ⬆️.  

Comece instalando o SDK Python do Mailtrap.

pip install mailtrap 

Configure um email básico incluindo um template HTML juntamente com texto simples como fallback.

import mailtrap as mt

# Crie o email com conteúdo HTML e texto simples
mail = mt.Mail(
    sender=mt.Address(email="mailtrap@exemplo.com", name="Teste Mailtrap"),
    to=[mt.Address(email="seu@email.com", name="Seu nome")],
    cc=[mt.Address(email="cc@email.com", name="Cópia para")],
    bcc=[mt.Address(email="bcc@email.com", name="Destinatário Oculto")],
    subject="Você é Incrível!",
    text="Parabéns por enviar um email de teste com o Mailtrap!",
    html="""
    <!doctype html>
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      </head>
      <body style="font-family: sans-serif;">
        <div style="display: block; margin: auto; max-width: 600px;" class="main">
          <h1 style="font-size: 18px; font-weight: bold; margin-top: 20px">
            Parabéns por enviar um email de teste com o Mailtrap!
          </h1>
          <p>Inspecione-o usando as guias que vê acima e aprenda como este email pode ser melhorado.</p>
          <p>Agora envie seu email usando nosso servidor SMTP falso e uma integração à sua escolha!</p>
          <p>Boa sorte! Espero que funcione.</p>
        </div>
      </body>
    </html>
    """,
    headers={"X-MT-Header": "Custom header"},
    custom_variables={"year": 2023},
)

# Configure e envie o email usando a API do Mailtrap
client = mt.MailtrapClient(token="sua-chave-api")
client.send(mail)

Resumo rápido:

  • Cabeçalhos e variáveis personalizados permitem que você personalize ainda mais seu email e são úteis para rastreamento ou fornecimento de comportamentos específicos por email.
  • Custom headers and variables allow you to customize your email further and are useful for tracking or providing specific behaviors per email.
  • O objeto MailtrapClient usa sua chave de API Mailtrap para autenticação, e client.send(mail) envia o email através do serviço Mailtrap.

Leitura adicional:

Como testar seus emails antes de enviar?

A resposta rápida é que você deve executar seus emails em um ambiente sandbox para garantir que eles apareçam e funcionem conforme o esperado. Ao mesmo tempo, você deve verificar se seus emails são propensos a acionar filtros de spam, ou não.

A solução que usarei aqui é o Mailtrap Email Testing (também parte da Plataforma de Entrega de Email Mailtrap). É um sandbox que captura emails enviados (de ambientes de teste e desenvolvimento) e permite que você os inspecione em um navegador da web sem enviá-los para destinatários reais.

Isso é útil para desenvolvedores verificarem e depurarem a funcionalidade de email em aplicações. E, ao contrário do envio em produção, o sandbox não exige que você adicione e verifique um domínio.

Abaixo, cobrirei a metodologia SMTP e API.

SMTP

A configuração do SMTP é bastante direta, e vou guiá-lo pelo processo. Claro, estou assumindo que você já é usuário do Mailtrap, se não clique aqui para se inscrever.

Então, abra o Mailtrap, navegue até Email Testing, escolha My Inbox, e clique em Show Credentials na aba SMTP Settings.

Menu das definições SMTP do Mailtrap Email Testing

Depois de integrar as configurações de SMTP, vá até o menu de Integrações, e escolha uma das opções disponíveis para Python.

O método mais básico é sendmail(), mas você também tem integrações prontas para usar para Django ou Flask.

Integração smtplib Mailtrap Email Testing

Prossiga para enviar o email de teste no Shell (execute a integração fornecida), e você receberá a resposta na sua caixa de entrada, quase instantaneamente.

Pré-visualização do texto no Mailtrap Email Testing

API

Primeiro, você precisará estabelecer a conexão com a API do Mailtrap Email Testing usando http.client.HTTPSConnection. O endpoint em si é sandbox.api.mailtrap.io.

Em seguida, você pode definir o conteúdo do email, destinatários, remetente, texto, etc. como um payload JSON.

Por fim, faça uma solicitação POST para a API do Mailtrap Email Testing usando o payload pronto junto com os cabeçalhos necessários.

Para destacar, você precisará de um token da API Email Testing para autorizar a solicitação. Acesse o token da API em Settings > API Tokens.

Menu API Tokens do Mailtrap

Aqui está um exemplo completo de teste de email via API:

import http.client
import json

def test_send_email():
    conn = http.client.HTTPSConnection("sandbox.api.mailtrap.io")
   
    payload = {
        "to": [{"email": "john_doe@exemplo.com", "name": "John Doe"}],
        "cc": [{"email": "jane_doe@exemplo.com", "name": "Jane Doe"}],
        "bcc": [{"email": "james_doe@exemplo.com", "name": "Jim Doe"}],
        "from": {"email": "sales@exemplo.com", "name": "Equipe de Vendas de Exemplo"},
        "attachments": [
            {
                "content": "base64_encoded_content_here",
                "filename": "index.html",
                "type": "text/html",
                "disposition": "attachment"
            }
        ],
        "custom_variables": {"user_id": "45982", "batch_id": "PSJ-12"},
        "headers": {"X-Message-Source": "dev.mydomain.com"},
        "subject": "Confirmação de Pedido de Exemplo",
        "text": "Parabéns pelo seu pedido nº 1234",
        "category": "Teste de API"
    }

    headers = {
        'Content-Type': "application/json",
        'Accept': "application/json",
        'Api-Token': "seu_token_api_aqui"  # Substitua pelo seu token de API real
    }

    # Converta o payload para uma string JSON
    json_payload = json.dumps(payload)

    # Faça a solicitação POST
    conn.request("POST", "/api/send/inbox_id", json_payload, headers)  # Substitua 'inbox_id' pelo seu ID de caixa de entrada real

    # Obtenha a resposta
    response = conn.getresponse()
    data = response.read()

    print(data.decode("utf-8"))

if __name__ == "__main__":
    test_send_email()

Se precisar de outros detalhes ou mais informações, sinta-se à vontade para consultar a nossa documentação oficial da API. Além disso, você pode conferir nosso tutorial completo sobre testes de email em Python.

Conclusão

Espero que este tutorial tenha ajudado você a dominar a criação e gerenciamento de um formulário de contato em Python. Assim, você está bem equipado para melhorar o engajamento dos usuários no seu site.

Continue explorando e refinando suas habilidades, e lembre-se de que cada formulário que você cria aumenta sua capacidade de interagir de maneira significativa com seus usuários!

Article by Veljko Ristić Content Manager @ Mailtrap

Linguist by trade, digital marketer at heart, I’m a Content Manager who’s been in the online space for 10+ years. From ads to e-books, I’ve covered it all as a writer, editor, project manager, and everything in between. Now, my passion is with email infrastructure with a strong focus on technical content and the cutting-edge in programming logic and flows. But I still like spreading my gospels while blogging purely about marketing.