Как правильно декодировать цитируемые файлы .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», заменяются на =
или знак равенства появляется в неожиданных местах.
Что я пробовал:
Стандартное декодирование цитируемой печатной формы: Я попытался декодировать содержимое письма с помощью библиотеки Python
quopri
, но проблема сохраняется.Пакет электронной почты в 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». [...]