111 lines
3.4 KiB
Go
111 lines
3.4 KiB
Go
// mailtest – IMAP-Verbindungstest und LLM-Zusammenfassungstest
|
||
//
|
||
// Flags:
|
||
//
|
||
// -llm-only Überspringt IMAP, testet LLM mit eingebetteten Testdaten
|
||
// -unread Holt nur ungelesene Emails (statt letzte 5)
|
||
package main
|
||
|
||
import (
|
||
"flag"
|
||
"fmt"
|
||
"log"
|
||
"log/slog"
|
||
"os"
|
||
|
||
"my-brain-importer/internal/agents/tool/email"
|
||
"my-brain-importer/internal/config"
|
||
)
|
||
|
||
// testEmails sind eingebettete Beispieldaten für den LLM-Test ohne IMAP.
|
||
var testEmails = []email.Message{
|
||
{Subject: "KRITISCH: Server down in Produktion", From: "monitoring@company.com", Date: "2026-03-19 09:00"},
|
||
{Subject: "Meeting morgen 10 Uhr – Projektreview Q1", From: "chef@company.com", Date: "2026-03-19 08:30"},
|
||
{Subject: "Rechnung Nr. 2026-042 fällig bis 25.03.", From: "buchhaltung@lieferant.de", Date: "2026-03-18 14:00"},
|
||
{Subject: "Re: Urlaubsantrag genehmigt", From: "hr@company.com", Date: "2026-03-18 11:00"},
|
||
{Subject: "Newsletter: Neue Features in Go 1.26", From: "newsletter@golangweekly.com", Date: "2026-03-17 18:00"},
|
||
{Subject: "Amazon: Ihre Bestellung wurde versendet", From: "no-reply@amazon.de", Date: "2026-03-17 10:00"},
|
||
{Subject: "Erinnerung: Zahnarzttermin 21.03. um 15:00", From: "praxis@zahnarzt.de", Date: "2026-03-16 09:00"},
|
||
}
|
||
|
||
func main() {
|
||
llmOnly := flag.Bool("llm-only", false, "Überspringe IMAP, teste LLM mit eingebetteten Testdaten")
|
||
unread := flag.Bool("unread", false, "Hole nur ungelesene Emails")
|
||
verbose := flag.Bool("v", false, "Verbose Logging (Debug-Level)")
|
||
flag.Parse()
|
||
|
||
config.LoadConfig()
|
||
|
||
// Logging konfigurieren
|
||
logLevel := slog.LevelInfo
|
||
if *verbose {
|
||
logLevel = slog.LevelDebug
|
||
}
|
||
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: logLevel})))
|
||
|
||
if *llmOnly {
|
||
runLLMTest()
|
||
return
|
||
}
|
||
|
||
cfg := config.Cfg.Email
|
||
fmt.Printf("🔌 Verbinde mit %s:%d (TLS=%v StartTLS=%v) als %s ...\n",
|
||
cfg.Host, cfg.Port, cfg.TLS, cfg.StartTLS, cfg.User)
|
||
|
||
cl, err := email.Connect()
|
||
if err != nil {
|
||
log.Fatalf("❌ Verbindung fehlgeschlagen: %v", err)
|
||
}
|
||
defer cl.Close()
|
||
fmt.Println("✅ Login erfolgreich!")
|
||
|
||
var msgs []email.Message
|
||
if *unread {
|
||
fmt.Println("📥 Hole ungelesene Emails...")
|
||
msgs, err = cl.FetchUnread()
|
||
} else {
|
||
fmt.Println("📥 Hole die letzten 5 Emails...")
|
||
msgs, err = cl.FetchRecent(5)
|
||
}
|
||
if err != nil {
|
||
log.Fatalf("❌ Fetch fehlgeschlagen: %v", err)
|
||
}
|
||
if len(msgs) == 0 {
|
||
fmt.Println("📭 Keine Emails gefunden.")
|
||
return
|
||
}
|
||
for i, m := range msgs {
|
||
fmt.Printf("[%d] %s | Von: %s | %s\n", i+1, m.Date, m.From, m.Subject)
|
||
}
|
||
|
||
fmt.Printf("\n🤖 Teste LLM-Zusammenfassung (Modell: %s)...\n", effectiveModel())
|
||
summary, err := email.Summarize()
|
||
if err != nil {
|
||
log.Fatalf("❌ Fehler: %v", err)
|
||
}
|
||
fmt.Println(summary)
|
||
}
|
||
|
||
func runLLMTest() {
|
||
fmt.Printf("🧪 LLM-Testmodus mit %d eingebetteten Testdaten\n", len(testEmails))
|
||
fmt.Printf(" Modell: %s\n\n", effectiveModel())
|
||
for i, m := range testEmails {
|
||
fmt.Printf("[%d] %s | %s | %s\n", i+1, m.Date, m.From, m.Subject)
|
||
}
|
||
|
||
fmt.Println("\n🤖 Starte LLM-Zusammenfassung...")
|
||
result, err := email.SummarizeMessages(testEmails, "Fasse diese Emails zusammen. Priorisiere nach Dringlichkeit und Wichtigkeit.")
|
||
if err != nil {
|
||
log.Fatalf("❌ LLM-Fehler: %v", err)
|
||
}
|
||
fmt.Println("\n--- Ergebnis ---")
|
||
fmt.Println(result)
|
||
}
|
||
|
||
func effectiveModel() string {
|
||
if config.Cfg.Email.Model != "" {
|
||
return config.Cfg.Email.Model
|
||
}
|
||
return config.Cfg.Chat.Model
|
||
}
|