mirror of
https://github.com/khoaliber/LetterFeed.git
synced 2026-03-07 21:29:14 +00:00
fix: auto-add decode From header #6
This commit is contained in:
@@ -148,7 +148,9 @@ def _auto_add_newsletter(
|
|||||||
) -> Newsletter:
|
) -> Newsletter:
|
||||||
"""Automatically add a new newsletter."""
|
"""Automatically add a new newsletter."""
|
||||||
logger.info(f"Auto-adding new newsletter for sender: {sender}")
|
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(
|
new_newsletter_schema = NewsletterCreate(
|
||||||
name=newsletter_name,
|
name=newsletter_name,
|
||||||
sender_emails=[sender],
|
sender_emails=[sender],
|
||||||
|
|||||||
@@ -120,3 +120,38 @@ def test_process_single_email_with_content_extraction(
|
|||||||
assert entry_create_arg.body == "Extracted Body"
|
assert entry_create_arg.body == "Extracted Body"
|
||||||
# Subject should still come from the email, not the extracted title
|
# Subject should still come from the email, not the extracted title
|
||||||
assert entry_create_arg.subject == "Test Email"
|
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