feat(#278): Mail→Paperless Archivierungs-Service mit Tests #312
No reviewers
Labels
No labels
app/archiv
app/einkaufslisten
app/imap-client
app/wissensbasis
arch-answered
arch-question
area/api
area/auth
area/infra
area/mobile
area/shared
area/ui
area/web
portfolio-status
prio/high
prio/low
prio/medium
roadmap/public
size/l
size/m
size/s
size/xl
size/xs
status/blocked
status/needs-info
type/bug
type/chore
type/docs
type/feature
type/idea
type/refactor
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
admin-mrrm/mrrmlabapp!312
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/278-mail-archive-service"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Neuer
MailArchiveServiceim Mail-Modul, der eine einzelne Mail nach Paperless archiviert (Closes #278).Ablauf in
archive(ownerSub, accountId, folder, uid):NotFoundExceptionsonst)mail_archive_linkfür (account, folder, uid)? → existierende Document-ID zurück, kein erneuter UploadImapService.fetchRawByUid(bodies: [''], Header-Parse für Subject/From/Date)["email", "<account-label>"]und Korrespondent (From-Adresse) über neue PaperlessClient-HelperfindOrCreateTag/findOrCreateCorrespondentauflösenuploadDocument→ Task-UUID; viagetTaskpollen bisSUCCESS(Intervall/Timeout configurable, default1s/60s); beiFAILURE/REVOKEDoder Timeout →ServiceUnavailableExceptionmail_archive_linkmit echter Paperless-Document-ID anlegenWarum Polling?
uploadDocumentliefert nur eine Task-UUID; die echte Document-ID gibt es erst nach OCR/Klassifizierung. Schema verlangtpaperless_document_id integer NOT NULL, also muss vor dem Insert auf den fertigen Task gewartet werden.Erweiterungen:
ImapService.fetchRawByUid(config, folder, uid): Promise<RawMessage>mit HeadernPaperlessClient.getTask(uuid)→{ status, relatedDocument, taskId }PaperlessClient.findOrCreateTag(name)/findOrCreateCorrespondent(name)— Search-by-name__iexact+ POST bei MissMailModuleimportiertDocumentsModulefürPaperlessClientDITests: 326 grün gesamt (+5 IMAP, +8 PaperlessClient, +9 MailArchiveService).
Test plan
paperless.dev.mrrm.de— Mail via API archivieren, prüfen ob Eintrag in Paperless +mail_archive_linklandetOrchestriert das Archivieren einer einzelnen Mail nach Paperless: 1. Konto-Besitz prüfen 2. Idempotenz via mail_archive_link (folder + uid) 3. Raw EML via IMAP (neue ImapService.fetchRawByUid) 4. Tags ("email" + Konto-Label) und Korrespondent (From-Adresse) über findOrCreate-Helper in Paperless auflösen 5. uploadDocument liefert Task-UUID; mit getTask pollen bis SUCCESS (configurable Intervall/Timeout, default 1s/60s) 6. mail_archive_link mit echter Paperless-Document-ID anlegen Erweiterungen: - ImapService.fetchRawByUid: bodies: [''] → Raw RFC822 + Header-Parse - PaperlessClient: getTask, findOrCreateTag, findOrCreateCorrespondent - MailModule importiert DocumentsModule (PaperlessClient DI) Tests: 326 grün gesamt (+5 imap, +8 paperless.client, +9 mail-archive) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>