From 390c972315129b37795645c2d9ec513a8c07f5b7 Mon Sep 17 00:00:00 2001 From: Leon Date: Tue, 22 Jul 2025 12:29:58 +0200 Subject: [PATCH] fix: imap fetch marks mails as read --- backend/app/services/email_processor.py | 13 ++++++++++--- backend/app/tests/test_core.py | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/backend/app/services/email_processor.py b/backend/app/services/email_processor.py index a91730d..bed25ac 100644 --- a/backend/app/services/email_processor.py +++ b/backend/app/services/email_processor.py @@ -92,7 +92,7 @@ def _process_single_email( settings: Settings, ) -> None: """Process a single email message.""" - status, data = mail.fetch(num, "(RFC822)") + status, data = mail.fetch(num, "(BODY.PEEK[])") if status != "OK": logger.warning(f"Failed to fetch email with id={num}") return @@ -129,8 +129,15 @@ def _process_single_email( if extracted_body: final_body = extracted_body - entry = EntryCreate(subject=subject, body=final_body, message_id=message_id) - create_entry(db, entry, newsletter.id) + entry_schema = EntryCreate(subject=subject, body=final_body, message_id=message_id) + new_entry = create_entry(db, entry_schema, newsletter.id) + + if not new_entry: + logger.error( + f"Failed to create entry for newsletter '{newsletter.name}' from sender {sender}, email will not be marked as read or moved." + ) + return + logger.info( f"Created new entry for newsletter '{newsletter.name}' from sender {sender}" ) diff --git a/backend/app/tests/test_core.py b/backend/app/tests/test_core.py index 29809ab..19e02b6 100644 --- a/backend/app/tests/test_core.py +++ b/backend/app/tests/test_core.py @@ -79,7 +79,7 @@ def test_process_emails(mock_imap, db_session: Session): mock_mail.login.assert_called_once_with("test@test.com", "password") mock_mail.select.assert_called_once_with("INBOX") mock_mail.search.assert_called_once_with(None, "(UNSEEN)") - mock_mail.fetch.assert_called_once_with(b"1", "(RFC822)") + mock_mail.fetch.assert_called_once_with(b"1", "(BODY.PEEK[])") mock_mail.store.assert_any_call(b"1", "+FLAGS", "\\Seen") mock_mail.copy.assert_called_once_with(b"1", "Processed") mock_mail.store.assert_any_call(b"1", "+FLAGS", "\\Deleted")