diff --git a/app/plugins/builtins/mail/services.py b/app/plugins/builtins/mail/services.py index 79f476a..27873b8 100644 --- a/app/plugins/builtins/mail/services.py +++ b/app/plugins/builtins/mail/services.py @@ -772,13 +772,19 @@ async def imap_sync_account( if existing_att_count == 0: for att_data in attachments: try: + raw_filename = att_data["filename"] or "attachment" + try: + from email.header import decode_header, make_header + decoded_filename = str(make_header(decode_header(raw_filename))) + except Exception: + decoded_filename = raw_filename storage_path = await _save_attachment_to_storage( - existing_mail.id, att_data["filename"], att_data["content"] + existing_mail.id, decoded_filename, att_data["content"] ) attachment = MailAttachment( tenant_id=tenant_id, mail_id=existing_mail.id, - filename=_sanitize_filename(att_data["filename"]), + filename=_sanitize_filename(decoded_filename), mime_type=att_data["mime_type"], size_bytes=att_data["size"], storage_path=storage_path, @@ -823,13 +829,20 @@ async def imap_sync_account( # Save attachments to storage and DB for att_data in attachments: try: + # Decode MIME-encoded filenames (e.g. =?utf-8?q?...?=) + raw_filename = att_data["filename"] or "attachment" + try: + from email.header import decode_header, make_header + decoded_filename = str(make_header(decode_header(raw_filename))) + except Exception: + decoded_filename = raw_filename storage_path = await _save_attachment_to_storage( - mail.id, att_data["filename"], att_data["content"] + mail.id, decoded_filename, att_data["content"] ) attachment = MailAttachment( tenant_id=tenant_id, mail_id=mail.id, - filename=_sanitize_filename(att_data["filename"]), + filename=_sanitize_filename(decoded_filename), mime_type=att_data["mime_type"], size_bytes=att_data["size"], storage_path=storage_path,