$ python modulo_5.py
E-mails e arquivos
Enviar relatórios por e-mail, anexar arquivos e organizar pastas automaticamente. SMTP + pathlib + logging.
O que você vai aprender
- Enviar e-mails via SMTP (Gmail, Outlook, servidor próprio)
- Anexos e HTML no corpo da mensagem
- Organização automática de downloads e pastas
- Watchdog: reagir a novos arquivos em tempo real
- Logging estruturado para auditoria
1. Envio de e-mail simples
import smtplib
from email.message import EmailMessage
from pathlib import Path
def enviar_email(destino: str, assunto: str, corpo: str, anexo: Path | None = None):
msg = EmailMessage()
msg["From"] = "[email protected]"
msg["To"] = destino
msg["Subject"] = assunto
msg.set_content(corpo)
if anexo and anexo.exists():
msg.add_attachment(
anexo.read_bytes(),
maintype="application",
subtype="octet-stream",
filename=anexo.name
)
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
smtp.login("[email protected]", "app-password") # use App Password
smtp.send_message(msg)
enviar_email("[email protected]", "Relatório diário", "Segue o relatório.", Path("relatorio.xlsx"))
GMAIL
Ative a verificação em 2 etapas e gere uma “Senha de app”. Nunca use a senha normal da conta.
2. HTML no corpo
msg.add_alternative("""
<html>
<body style="font-family:sans-serif">
<h2>Relatório IRN Devs</h2>
<p>Total do dia: <strong>R$ 12.450</strong></p>
</body>
</html>
""", subtype="html")
3. Organização de pastas (watchdog)
pip install watchdog
watcher.py
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from pathlib import Path
import time
import shutil
DESTINOS = {
".pdf": Path("docs"),
".xlsx": Path("planilhas"),
".csv": Path("planilhas"),
".jpg": Path("imagens"),
".png": Path("imagens"),
}
class Organizador(FileSystemEventHandler):
def on_created(self, event):
if event.is_directory:
return
arq = Path(event.src_path)
time.sleep(0.5) # espera gravar
destino_dir = DESTINOS.get(arq.suffix.lower(), Path("outros"))
destino_dir.mkdir(exist_ok=True)
destino = destino_dir / arq.name
shutil.move(str(arq), str(destino))
print(f"Movido: {arq.name} → {destino}")
observer = Observer()
observer.schedule(Organizador(), path="downloads", recursive=False)
observer.start()
print("Monitorando pasta downloads...")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
EXERCÍCIO
1. Envie um e-mail com anexo Excel gerado no módulo 4.
2. Crie um watcher que move arquivos e envia notificação por e-mail quando chega um PDF.
3. Adicione logging em arquivo com nível INFO e ERROR.
2. Crie um watcher que move arquivos e envia notificação por e-mail quando chega um PDF.
3. Adicione logging em arquivo com nível INFO e ERROR.