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>
34 lines
1.0 KiB
Python
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)
|