Ícone do site Mailtrap

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

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:
.\venv\Scripts\activate
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:

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

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:

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

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:

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.

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).

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:

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:

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.

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.

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.

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.

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!

Sair da versão mobile