From 4a81c5e2a656b08e8783bc7952d6b488424e08af Mon Sep 17 00:00:00 2001 From: Leon Date: Thu, 7 Aug 2025 17:44:29 +0200 Subject: [PATCH] fix: auto-add decode From header #6 --- backend/app/services/email_processor.py | 4 ++- backend/app/tests/test_email_processor.py | 35 +++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/backend/app/services/email_processor.py b/backend/app/services/email_processor.py index 986d295..ec68d44 100644 --- a/backend/app/services/email_processor.py +++ b/backend/app/services/email_processor.py @@ -148,7 +148,9 @@ def _auto_add_newsletter( ) -> Newsletter: """Automatically add a new newsletter.""" logger.info(f"Auto-adding new newsletter for sender: {sender}") - newsletter_name = email.utils.parseaddr(msg["From"])[0] or sender + # Decode the 'From' header to handle non-ASCII characters in the sender's name + from_header = str(make_header(decode_header(msg.get("From", "")))) + newsletter_name = email.utils.parseaddr(from_header)[0] or sender new_newsletter_schema = NewsletterCreate( name=newsletter_name, sender_emails=[sender], diff --git a/backend/app/tests/test_email_processor.py b/backend/app/tests/test_email_processor.py index c42b3fd..7336df7 100644 --- a/backend/app/tests/test_email_processor.py +++ b/backend/app/tests/test_email_processor.py @@ -120,3 +120,38 @@ def test_process_single_email_with_content_extraction( assert entry_create_arg.body == "Extracted Body" # Subject should still come from the email, not the extracted title assert entry_create_arg.subject == "Test Email" + + +def test_process_single_email_with_encoded_from_header(db_session: Session): + """Test that an encoded From header is correctly decoded for the newsletter name.""" + # 1. ARRANGE + settings_data = SettingsCreate( + imap_server="test.com", + imap_username="test", + imap_password="password", + auto_add_new_senders=True, + ) + settings = create_or_update_settings(db_session, settings_data) + + mock_mail = MagicMock(spec=imaplib.IMAP4_SSL) + msg = Message() + # "Кирилл" in Cyrillic, base64 encoded for UTF-8 + from_header = "=?utf-8?B?0JrQuNGA0LjQu9C7?= " + msg["From"] = from_header + msg["Subject"] = "Test Email" + msg["Message-ID"] = "" + msg.set_payload("

Body

", "utf-8") + mock_mail.fetch.return_value = ("OK", [(b"1 (RFC822)", msg.as_bytes())]) + + sender_map = {} # empty, to trigger auto-add + + # 2. ACT + _process_single_email("1", mock_mail, db_session, sender_map, settings) + + # 3. ASSERT + from app.crud.newsletters import get_newsletters + + newsletters = get_newsletters(db_session) + assert len(newsletters) == 1 + assert newsletters[0].name == "Кирилл" + assert newsletters[0].senders[0].email == "test@example.com"