Как правильно декодировать цитируемые файлы .eml в Django, чтобы избежать = артефактов?

Я работаю над проектом Django, в котором мне необходимо обрабатывать файлы .eml. Содержимое писем часто имеет кодировку Quoted-Printable, что приводит к некорректному отображению некоторых символов. Например, некоторые символы отображаются как знаки = или имеют знаки =, вставленные в слова.

Вот пример того, как выглядит декодированное содержимое:

We request all our =ustomers - For any Remittance please make sure to stay in touch with =ur office Tel no : +97150 267 4240 Mr .Kalpesh. =o:p>
All the Payment =ill be accepted only to East VISON CONTAINER LINE a/c and NOT any of =he personal account.
Also please make =ure to reply the mails only to domain =vcline.com.
We wouldn't be =esponsible for any financial fraud in case bank account is not verified =ith us on whatsapp / WeChat.

Как видите, такие символы, как «w» и «R», заменяются на = или знак равенства появляется в неожиданных местах.

Что я пробовал:

  1. Стандартное декодирование цитируемой печатной формы: Я попытался декодировать содержимое письма с помощью библиотеки Python quopri, но проблема сохраняется.

  2. Пакет электронной почты в Python: Я использовал пакет Python email для разбора файла .eml и вручную декодировал содержимое на основе заголовка Content-Transfer-Encoding, но результат по-прежнему содержит эти артефакты.

import os
import quopri
from email import message_from_bytes
from django.conf import settings

def save_eml_file(self, eml_content):
    file_name = f"{self.date_received.strftime('%Y%m%d_%H%M%S')}_{self.id}.eml"
    file_path = os.path.join(settings.MEDIA_ROOT, "emails", file_name)
    os.makedirs(os.path.dirname(file_path), exist_ok=True)
    email_message = message_from_bytes(eml_content)
    decoded_content = ""

    if email_message.is_multipart():
        for part in email_message.walk():
            if part.get_content_type() in ["text/plain", "text/html"]:
                charset = part.get_content_charset() or "utf-8"
                content_transfer_encoding = part.get("Content-Transfer-Encoding", "").lower()
                payload = part.get_payload(decode=True) or b""
                if content_transfer_encoding == "quoted-printable":
                    payload = quopri.decodestring(payload)
                try:
                    decoded_content += payload.decode(charset, errors="replace")
                except Exception:
                    decoded_content += str(payload)
    else:
        charset = email_message.get_content_charset() or "utf-8"
        content_transfer_encoding = email_message.get("Content-Transfer-Encoding", "").lower()
        payload = email_message.get_payload(decode=True) or b""
        if content_transfer_encoding == "quoted-printable":
            payload = quopri.decodestring(payload)
        try:
            decoded_content = payload.decode(charset, errors="replace")
        except Exception:
            decoded_content = str(payload)

    with open(file_path, "w", encoding="utf-8") as file:
        file.write(decoded_content)

    self.eml_file_path = f"emails/{file_name}"
    self.save()

Что мне нужно:

Я хочу правильно декодировать содержимое электронной почты, чтобы эти = артефакты были удалены, а содержимое отображалось корректно как в английском, так и в неанглийском (персидском) тексте. Как настроить процесс декодирования, чтобы добиться этого?

Дополнительная информация:

  • Версия Django: 4.2

  • Python Версия: 3.12

  • Окружение: Windows

Я буду признателен за любые предложения или соображения, которые могут помочь решить эту проблему.

Насколько я могу судить, проблема не связана с Django, а заключается в том, что ваш пример не является правильной кодировкой quoted-printable encoding.

[...], могут быть представлены символом «=», за которым следует двухзначное шестнадцатеричное представление значения октета. Адрес Цифры шестнадцатеричного алфавита для этой цели, «0123456789ABCDEF». [...]

Вернуться на верх