// 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 }