Решение
Похоже, вы либо испортили файл mbox "mailfolder", либо в модуле Python mailbox
произошла ошибка, вызванная чем-то в вашем файле. Я не могу сказать, что происходит, не имея входного файла mbox или минимального входного файла примера, который воспроизводит проблему.
Вы можете сделать некоторую отладку самостоятельно. Каждое сообщение в файле начинается со строки «От», которая должна выглядеть следующим образом:
From - Mon Mar 30 18:18:04 2020
Из отправленной вами трассировки стека похоже, что эта строка искажена в одном из сообщений. Лично я бы использовал отладчик IDE (PyCharm), чтобы отследить, какой была неправильная строка, но это можно сделать с помощью встроенного в Python pdb
. Оберните ваш l oop следующим образом:
import pdb
try:
for message in mflder:
print(header_to_string(message["subject"]))
except:
pdb.post_mortem()
Когда вы запустите код сейчас, он появится в отладчике при возникновении исключения. В этом приглашении вы можете ввести l
, чтобы отобразить код, в котором остановился отладчик; это должно соответствовать последнему кадру, напечатанному в вашей трассировке стека, которую вы первоначально разместили. Когда вы окажетесь там, есть две команды, которые скажут вам, что происходит:
p from_line
покажет вам искаженную строку «От».
p start
покажет вам на какое смещение в файле код mailbox
считает, что сообщение должно быть.
Предыдущий ответ, который не решил исходную проблему, но по-прежнему применяется
В реальном мире быть сообщения, которые не соответствуют стандартам. Вы можете попытаться сделать код более терпимым, если не хотите отклонять плохие сообщения. Декодирование с помощью "latin-1" является одним из способов обработки этих заголовков байтами вне ASCII. Это не может завершиться ошибкой, поскольку все возможные значения байтов отображаются на действительные символы Unicode (сопоставление первых 256 кодов Unicode в формате «один к одному» против ISO / IEC 8859-1, или «латинский-1»). Это может или не может дать вам текст, предназначенный отправителю.
import mailbox
from email.header import decode_header
mflder = mailbox.mbox("mailfolder")
def get_subject(message):
header = message["subject"]
if not header:
return ''
header, encoding = decode_header(header)[0]
if encoding is not None:
try:
header = header.decode(encoding)
except:
header = header.decode('latin-1')
return header
for message in mflder:
print(get_subject(message))