mirror of
https://github.com/khoaliber/LetterFeed.git
synced 2026-03-02 05:29:13 +00:00
fix: auto-add decode From header #6
This commit is contained in:
@@ -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],
|
||||
|
||||
@@ -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?= <test@example.com>"
|
||||
msg["From"] = from_header
|
||||
msg["Subject"] = "Test Email"
|
||||
msg["Message-ID"] = "<test-message-id-encoded-from>"
|
||||
msg.set_payload("<html><body><p>Body</p></body></html>", "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"
|
||||
|
||||
Reference in New Issue
Block a user