📬 Automação: Enviando Relatórios do Excel (ou CSV/PDF) por E-mail Diariamente com Python

🧩 Objetivo

Criar um script que:

  1. Lê um arquivo (Excel, CSV ou PDF);
  2. Anexa o arquivo em um e-mail;
  3. Envia automaticamente o e-mail;
  4. É 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:

  1. Abra o Agendador de Tarefas.
  2. Crie uma nova tarefa.
  3. 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

  1. Salve o código acima como app.py.
  2. 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çãoDescrição
📂 Upload de arquivoEnvie qualquer relatório (.xlsx, .csv, .pdf)
⏰ AgendamentoDefine o horário diário de envio
🚀 Enviar AgoraEnvia o e-mail imediatamente
💬 Corpo personalizadoAdicione mensagens e destinatários
🔒 Senha de appUsa autenticação segura do Gmail

📊 Exemplo do histórico exibido

Data/HoraDestinatárioAssuntoStatus
2025-11-07 08:01:12exemplo@gmail.comRelatório Diário Automático✅ Enviado com sucesso
2025-11-07 08:03:02teste@empresa.comIndicadores 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.