Files
business-card-scanner/app/mailer.py
Lucas Orth ab993e98e1 Visitenkarten-Scanner: Stapelscan, Extraktion, Übersicht, vCard-Export
Selbst gehostete PWA, die Visitenkarten von einem Foto freistellt, ausliest
und als Kontakt bereitstellt.

- Stapelscan: OpenCV findet die Kartenrechtecke über mehrere Binärmasken,
  entzerrt sie perspektivisch und schneidet sie einzeln aus. Ohne Fund gilt
  das ganze Foto als eine Karte.
- Extraktion: ein Aufruf je Zuschnitt an das Vision-Modell mit
  JSON-Schema. Kein vorgeschaltetes OCR - das würde Layout und
  Schriftgrößen wegwerfen, aus denen die Feldzuordnung entsteht.
- Metadaten: Aufnahmezeit und GPS aus den EXIF-Daten des Fotos, Ortsname
  über Nominatim, Browserstandort nur als Rückfallebene.
- Übersicht mit Volltextsuche und Filtern, Detailansicht mit Korrekturmaske.
- Notizfeld je Karte, Erinnerungen per Mail inklusive Nachholen verpasster
  Termine nach einem Neustart.
- vCard 3.0 einzeln und als Sammeldatei, Karte gilt danach als exportiert.
- Anmeldung über ein Passwort, Sitzung als signiertes Cookie.
- Deployment per Tag-Push nach den Konventionen in DEPLOY.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 11:45:56 +02:00

34 lines
1.0 KiB
Python

"""Mailversand ueber das eigene Postfach (SMTP)."""
import logging
import smtplib
from email.message import EmailMessage
from . import config
log = logging.getLogger(__name__)
def configured() -> bool:
return bool(config.SMTP_HOST and config.SMTP_FROM and config.REMINDER_TO)
def send(subject: str, body: str) -> None:
"""Verschickt eine Mail. Wirft bei Fehlern - der Aufrufer entscheidet,
ob nachher erneut versucht wird."""
if not configured():
raise RuntimeError("SMTP ist nicht konfiguriert (SMTP_HOST/SMTP_FROM/REMINDER_TO)")
message = EmailMessage()
message["Subject"] = subject
message["From"] = config.SMTP_FROM
message["To"] = config.REMINDER_TO
message.set_content(body)
with smtplib.SMTP(config.SMTP_HOST, config.SMTP_PORT, timeout=20) as server:
if config.SMTP_STARTTLS:
server.starttls()
if config.SMTP_USER:
server.login(config.SMTP_USER, config.SMTP_PASSWORD)
server.send_message(message)
log.info("Mail verschickt: %s", subject)