🧩 Objetivo
Criar um script que:
- Lê um arquivo (Excel, CSV ou PDF);
- Anexa o arquivo em um e-mail;
- Envia automaticamente o e-mail;
- É executado todos os dias em um horário definido (por exemplo, 8h da manhã).
🧠 O que você vai precisar
Instale as bibliotecas necessárias:
pip install pandas schedule
Todas as demais (smtplib, email, os, time) já vêm com o Python.
⚙️ Passo 1 — Ler o arquivo do relatório
Você pode usar um arquivo Excel, CSV ou PDF.
Vamos supor que o relatório seja um .csv gerado automaticamente todo dia.
import pandas as pd
def gerar_relatorio():
# Exemplo: ler um CSV e salvar como Excel
df = pd.read_csv("dados.csv")
df.to_excel("relatorio_diario.xlsx", index=False)
print("Relatório Excel gerado com sucesso!")
📧 Passo 2 — Enviar o relatório por e-mail
Agora, vamos criar a função que envia o e-mail com o anexo.
import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
def enviar_email():
remetente = "seu_email@gmail.com"
senha = "SENHA_DO_APP" # use uma senha de app do Gmail
destinatario = "destinatario@gmail.com"
msg = MIMEMultipart()
msg["From"] = remetente
msg["To"] = destinatario
msg["Subject"] = "Relatório Diário Automático"
corpo = "Segue em anexo o relatório diário gerado automaticamente."
msg.attach(MIMEText(corpo, "plain"))
# Adicionar anexo
arquivo = "relatorio_diario.xlsx"
with open(arquivo, "rb") as f:
anexo = MIMEApplication(f.read(), _subtype="xlsx")
anexo.add_header("Content-Disposition", "attachment", filename=os.path.basename(arquivo))
msg.attach(anexo)
# Enviar e-mail
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
smtp.login(remetente, senha)
smtp.send_message(msg)
print("E-mail enviado com sucesso!")
⚠️ Importante:
- No Gmail, ative a verificação em duas etapas e crie uma senha de app (em “Segurança > Senhas de App”).
- Guarde a senha de app em uma variável de ambiente (por segurança).
⏰ Passo 3 — Agendar o envio diário
Vamos usar a biblioteca schedule para executar o envio automaticamente todos os dias.
import schedule
import time
def rotina_diaria():
gerar_relatorio()
enviar_email()
# Agendar todos os dias às 08:00
schedule.every().day.at("08:00").do(rotina_diaria)
print("Automação iniciada... aguardando horário programado.")
while True:
schedule.run_pending()
time.sleep(60)
💡 Você pode ajustar o horário ou usar schedule.every(10).minutes para testar.
🧾 Passo 4 — Executar automaticamente no sistema
Agora que o script está pronto, você pode deixá-lo rodando automaticamente todos os dias:
🔹 No Windows:
- Abra o Agendador de Tarefas.
- Crie uma nova tarefa.
- Em “Ações”, selecione Iniciar um programa e coloque:
python caminho_do_script.py
🔹 No Linux/macOS:
Adicione a linha abaixo no seu crontab:
0 8 * * * /usr/bin/python3 /caminho/do/script.py
Isso executará todos os dias às 8h.
🎯 Resultado final
✅ O Python gera o relatório automaticamente.
✅ O relatório é enviado por e-mail no horário programado.
✅ Nenhuma intervenção manual é necessária.
💡 Adicionando logs e notificações
Você pode adicionar logs simples para registrar cada envio:
from datetime import datetime
def log_envio():
with open("log_envios.txt", "a") as f:
f.write(f"{datetime.now()} - Relatório enviado com sucesso.\n")
E chamá-lo dentro da função rotina_diaria():
def rotina_diaria():
gerar_relatorio()
enviar_email()
log_envio()
🧠 Conclusão
Com apenas algumas linhas de código, você criou um robô que trabalha sozinho, gerando relatórios e enviando e-mails automaticamente todos os dias.
Esse tipo de automação é amplamente usado em empresas, análises de dados, marketing e TI para otimizar processos e ganhar produtividade.
Bonus Game
A seguir, você verá a versão 2.0 do nosso sistema de automação, agora com uma interface interativa em Streamlit, onde você pode:
✅ escolher o arquivo de relatório (Excel, CSV ou PDF),
✅ definir o horário de envio,
✅ informar os destinatários e corpo do e-mail,
✅ e deixar o sistema rodando automaticamente.
🧠 Projeto: Painel de Automação de Relatórios com Streamlit e Python
🎯 Objetivo
Criar um painel web (executado localmente) onde o usuário pode configurar e controlar o envio automático de relatórios por e-mail — tudo com poucos cliques, sem precisar editar código.
⚙️ Instalação das bibliotecas
pip install streamlit pandas schedule
💻 Código completo: app.py
import streamlit as st
import pandas as pd
import smtplib
import schedule
import time
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from datetime import datetime
import threading
# ---------- CONFIGURAÇÃO INICIAL ----------
LOG_FILE = "historico_envios.csv"
# Cria o arquivo de histórico se não existir
if not os.path.exists(LOG_FILE):
df = pd.DataFrame(columns=["Data/Hora", "Destinatário", "Assunto", "Status"])
df.to_csv(LOG_FILE, index=False)
# ---------- FUNÇÕES PRINCIPAIS ----------
def registrar_envio(destinatario, assunto, status):
"""Adiciona um registro ao histórico de envios"""
novo_registro = pd.DataFrame([{
"Data/Hora": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"Destinatário": destinatario,
"Assunto": assunto,
"Status": status
}])
df = pd.read_csv(LOG_FILE)
df = pd.concat([df, novo_registro], ignore_index=True)
df.to_csv(LOG_FILE, index=False)
def enviar_email(remetente, senha, destinatario, assunto, corpo, arquivo):
"""Função que envia o e-mail com anexo"""
try:
msg = MIMEMultipart()
msg["From"] = remetente
msg["To"] = destinatario
msg["Subject"] = assunto
msg.attach(MIMEText(corpo, "plain"))
# Adicionar anexo (se houver)
if arquivo is not None:
with open(arquivo, "rb") as f:
tipo = os.path.splitext(arquivo)[1][1:]
anexo = MIMEApplication(f.read(), _subtype=tipo)
anexo.add_header("Content-Disposition", "attachment", filename=os.path.basename(arquivo))
msg.attach(anexo)
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
smtp.login(remetente, senha)
smtp.send_message(msg)
registrar_envio(destinatario, assunto, "✅ Enviado com sucesso")
return f"✅ E-mail enviado com sucesso para {destinatario}!"
except Exception as e:
registrar_envio(destinatario, assunto, f"❌ Erro: {e}")
return f"❌ Erro ao enviar e-mail: {e}"
def rotina_agendada(remetente, senha, destinatario, assunto, corpo, arquivo):
"""Função executada automaticamente no horário programado"""
resultado = enviar_email(remetente, senha, destinatario, assunto, corpo, arquivo)
print(resultado)
def iniciar_agendamento(horario, remetente, senha, destinatario, assunto, corpo, arquivo):
"""Inicia o agendamento em thread paralela"""
schedule.clear()
schedule.every().day.at(horario).do(rotina_agendada, remetente, senha, destinatario, assunto, corpo, arquivo)
def executar():
while True:
schedule.run_pending()
time.sleep(60)
thread = threading.Thread(target=executar, daemon=True)
thread.start()
# ---------- INTERFACE STREAMLIT ----------
st.set_page_config(page_title="Automação de Relatórios", page_icon="📊", layout="centered")
st.title("📬 Automação de Relatórios com Histórico de Envios")
aba = st.sidebar.radio("📂 Navegação", ["Enviar Relatório", "Histórico de Envios"])
# ---------- ABA 1: Envio de Relatório ----------
if aba == "Enviar Relatório":
st.subheader("⚙️ Configurar Envio de Relatório")
with st.form("form_email"):
remetente = st.text_input("Seu e-mail (remetente)")
senha = st.text_input("Senha do app (use senha de app do Gmail)", type="password")
destinatario = st.text_input("Destinatário")
assunto = st.text_input("Assunto", "Relatório Diário Automático")
corpo = st.text_area("Mensagem", "Segue em anexo o relatório diário.")
arquivo = st.file_uploader("Selecione o relatório (Excel, CSV, PDF)", type=["xlsx", "csv", "pdf"])
horario = st.text_input("Horário de envio diário (formato 24h, ex: 08:00)", "08:00")
col1, col2 = st.columns(2)
with col1:
enviar_agora = st.form_submit_button("🚀 Enviar Agora")
with col2:
agendar = st.form_submit_button("⏰ Agendar Envio Diário")
if enviar_agora:
if arquivo is not None:
caminho_temp = f"temp_{arquivo.name}"
with open(caminho_temp, "wb") as f:
f.write(arquivo.read())
resultado = enviar_email(remetente, senha, destinatario, assunto, corpo, caminho_temp)
st.success(resultado)
os.remove(caminho_temp)
else:
st.warning("Selecione um arquivo antes de enviar.")
if agendar:
if arquivo is not None:
caminho_temp = f"temp_{arquivo.name}"
with open(caminho_temp, "wb") as f:
f.write(arquivo.read())
iniciar_agendamento(horario, remetente, senha, destinatario, assunto, corpo, caminho_temp)
st.success(f"⏰ Agendamento configurado! O e-mail será enviado diariamente às {horario}.")
else:
st.warning("Selecione um arquivo antes de agendar.")
# ---------- ABA 2: Histórico ----------
elif aba == "Histórico de Envios":
st.subheader("📋 Histórico de Envios")
df = pd.read_csv(LOG_FILE)
st.dataframe(df, use_container_width=True)
if st.button("🗑️ Limpar Histórico"):
df_vazio = pd.DataFrame(columns=["Data/Hora", "Destinatário", "Assunto", "Status"])
df_vazio.to_csv(LOG_FILE, index=False)
st.success("Histórico limpo com sucesso!")
▶️ Como executar o painel
- Salve o código acima como
app.py. - No terminal, execute:
streamlit run app.py
O painel abrirá no navegador com duas abas:
Histórico de Envios — onde visualiza e gerencia todos os envios.
Enviar Relatório — onde você agenda ou envia manualmente;
🧩 Recursos do painel
| Função | Descrição |
|---|---|
| 📂 Upload de arquivo | Envie qualquer relatório (.xlsx, .csv, .pdf) |
| ⏰ Agendamento | Define o horário diário de envio |
| 🚀 Enviar Agora | Envia o e-mail imediatamente |
| 💬 Corpo personalizado | Adicione mensagens e destinatários |
| 🔒 Senha de app | Usa autenticação segura do Gmail |
📊 Exemplo do histórico exibido
| Data/Hora | Destinatário | Assunto | Status |
|---|---|---|---|
| 2025-11-07 08:01:12 | exemplo@gmail.com | Relatório Diário Automático | ✅ Enviado com sucesso |
| 2025-11-07 08:03:02 | teste@empresa.com | Indicadores Semanais | ❌ Erro: senha inválida |
💡 Dicas de uso profissional
✅ Use variáveis de ambiente para esconder sua senha:
import os
senha = os.getenv("GMAIL_APP_PASSWORD")
💡 Dicas adicionais
✅ Você pode trocar o servidor SMTP para Outlook, Yahoo etc.
✅ Use variáveis de ambiente para armazenar sua senha com segurança.
✅ Implante o painel na Streamlit Cloud ou em um servidor para funcionar 24h.
✅ Integre com APIs de relatórios (como Google Sheets, Power BI ou pandas) para gerar o arquivo antes do envio.
🧠 Conclusão
Agora você tem um painel completo de automação, com:
- envio manual e automático de relatórios,
- agendamento diário,
- e controle histórico de todos os envios.
Com essa base, você pode evoluir para:
- adicionar múltiplos destinatários,
- notificações via Telegram,
- ou dashboards de monitoramento.

