- Fixed settings form silently dropping fields (multipart/form-data parse) - Fixed IMAP test connection (multipart parse + raw field logging) - Added IMAPUsername field throughout (model, settings, handlers, worker) - Replaced smtp.SendMail with custom sendMail (explicit HELO + STARTTLS) - Added From header to OTP/Welcome emails (RFC5322 compliance) - Worker now processes ALL INBOX emails (FetchBatch instead of FetchUnseen) - Fixed go build . compiling debug scripts instead of src/cmd/main.go - Added Notifications, Finance, Social classification folders (7 total) - Refined AI prompt with precise category descriptions - Added session guardrail to AGENTS.md
7.9 KiB
7.9 KiB
Changelog
All notable changes to inBOXER will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[2026-04.5] - 2026-04-23
Fixed
- Settings form silently dropped fields: JavaScript
FormDatasendsmultipart/form-data, but Go'sr.ParseForm()doesn't handle it; replaced withr.ParseMultipartForm()+ directr.MultipartForm.Valuereads - IMAP test connection always failed: Exposed and raw-logged all form fields; confirmed
imap_host=imap.openxchange.euwas sent but not parsed due to multipart issue - IMAPUsername not sent to worker: Missing
IMAPUsernamefield inMailboxSettingsmodel, settings form,SettingsHandler,TestConnectionHandler, and workerprocessUser() - SMTP HELO rejected: Custom
sendMail()with explicit HELO hostname + STARTTLS handshake (replaced standardsmtp.SendMail) - OTP/Welcome emails missing From header: Added
From:header to both email bodies (RFC5322 compliance required by VadeSecure) - Worker skipped SEEN emails:
runSteadyStateusedFetchUnseen()which only finds emails without\Seenflag; changed toFetchBatch()(UID range) to process ALL INBOX emails unconditionally go build .compiled wrong entry point: Root-level debug*_test.gofiles withpackage maincausedgo build .to compile the debug script instead ofsrc/cmd/main.go; build now uses./src/cmdexplicitly
Added
- 7-way AI classification: New
Notifications,Finance,Socialfolders alongsideImportant,eCommerce,Other,Spam; updated prompt.txt with precise category descriptions - Guardrail in AGENTS.md: "Never terminate sessions or kill processes" rule to prevent accidental session termination
- Root-level folder creation:
Important,eCommerce,Other,Notifications,Finance,Social,Spamconfirmed via IMAP LIST
Changed
- Replaced
r.PostFormValue()/r.FormValue()withr.MultipartForm.Valuemap reads for all settings fields - Removed stale
:=declarations that shadowed correctly parsed values with empty strings - IMAPUsername takes priority over Email Address for IMAP login when non-empty
[2026-04.4] - 2026-04-23
Fixed
- Settings page unusable: Password field referenced nonexistent struct field (
IMAPPassvsIMAPPassEncrypted), rendered blank on every page load - Password wiped on save: Leaving password field blank (because it showed empty) overwrote encrypted password with empty string; now only updates when user enters a new password
- "Test Connection" never worked:
TestConnectionHandlerreturned"Not implemented yet"; now performs actual IMAP connect+login using go-imap and returns success/failure JSON - "Process Now" was a no-op:
ProcessNowHandlerjust redirected; now signals worker to run an immediate processing cycle via newWorker.ProcessNow()channel - Dashboard showed 0 for emails processed: Template referenced
{{ .Stats.TotalProcessed }}butTotalProcessedis a separate struct field, not a map key; corrected to{{ .TotalProcessed }} - No getting-started guidance: Dashboard now shows an info banner on first visit directing users to configure their IMAP account in Settings
- Password field
required: Removed HTML5requiredattribute so users can save other settings without re-entering their password
Changed
Handlerstruct now holds a*worker.Workerreference forProcessNowHandler- Worker initialization moved before handler creation in
main.goto satisfy the dependency Handler.NewHandler()signature extended withbgWorker *worker.Workerparameter- Settings POST handler re-reads decrypted settings after save so the form reflects the current state
Added
Worker.ProcessNow()— sends signal toprocessNowchannel (buffered, capacity 1) to triggerprocessAllUsers()outside the normal poll intervalWorker.processNowchannel field (buffered, prevents goroutine block)encoding/jsonimport in handlers forTestConnectionHandlerJSON responses
[2026-04.3] - 2026-04-23
Added
- AI classification package (
src/internal/ai/):- DeepSeek API client with chat completion requests (chat.deepseek.com API)
- Configurable model, temperature, max tokens via
config.yaml - Prompt template engine: loads
bin/prompt.txtat runtime, substitutes{sender},{subject},{body}placeholders - Response parser validates folder names (Important/eCommerce/Spam/Other) and confidence scores (1-100)
- Graceful fallback to placeholder classifier if prompt file is missing or API key unset
- Unit tests for JSON parsing, prompt loading, and API client creation
- Email body text now fetched up to 4000 chars (from 200) for AI classification context
Changed
- Replaced
EmailSummary.SnippetwithEmailSummary.Body(4000 char limit) - Main orchestrator now initializes DeepSeek classifier and passes to worker
- Worker uses real AI classifier when available; falls back to placeholder on init failure
[2026-04.2] - 2026-04-23
Added
- IMAP client package (
src/internal/imap/):- Secure connection management (TLS & STARTTLS) with auto-reconnect
- Fetch unseen messages with envelope and body snippet extraction
- Batch fetching by UID range for catch-up processing
- Message move/copy operations (RFC 6851 UID MOVE)
- Ensure folder existence before operations
- Unit tests covering error paths (connection failures, not-connected scenarios)
- Background worker package (
src/internal/worker/):- Steady-state mode: polls unseen emails at configurable interval
- Catch-up mode: processes backlog in batches with cooldown
- Per-user processing with isolated IMAP connections
- Test mode support (logs without moving emails)
- AI classifier interface (placeholder routes everything to "Other")
- Graceful shutdown with signal handling
- Unit tests for classifier and lifecycle
- Database:
GetUsersWithAutoStart()method for worker user discovery
Changed
- Replaced placeholder background worker with full IMAP-driven implementation
- Worker now creates target folders automatically on connect
- Email processing respects per-user poll interval and batch size
[2026-04.1] - 2026-04-23
Added
- Initial repository structure per
PROJECT_PLAN.md - Go module initialization with core dependencies (go-imap, gorm, sqlite, slog, gorilla)
- Git repository setup with remote configuration using
.envcredentials - Basic documentation files (README, CHANGELOG, LICENSE, AGENTS.md)
- Directory hierarchy for modular packages:
src/cmd/- Main orchestratorsrc/internal/auth/- OTP authentication packagesrc/internal/imap/- IMAP client (placeholder)src/internal/ai/- DeepSeek AI integration (placeholder)src/internal/db/- SQLite database with GORM models and encryptionsrc/internal/worker/- Background worker (placeholder)src/web/- Web interface (templates + static)src/pkg/- Shared utilities (config loader)bin/- Compiled binary and configuration
- Modular authentication package:
- OTP generation & hashing (bcrypt)
- SMTP sender with
.envcredentials - Session cookie management (gorilla/sessions)
- Database-backed OTP store
- Mobile-first frontend:
- Responsive CSS with modern design system
- Go HTML templates (login, verify, dashboard, settings)
- Authentication flow (email + OTP)
- Database schema:
- User model with OTP storage
- Mailbox settings with encrypted passwords
- Processed email tracking
- Configuration system:
- YAML configuration file (
bin/config.yaml) - Environment variable loading (
.env) - Secret management for session encryption
- YAML configuration file (
- Web server with routing:
- Gorilla mux router with middleware
- Authentication middleware for protected routes
- Static file serving
- Makefile with build, run, test targets
- Unit tests for authentication package