2013-06-16 3 views
0

Я в пути через голову. Может кто-то, пожалуйста, немой это для меня?Python UnicodeEncodeError и электронная почта

Я портирую свой код с Python 2.6 до 2.7, и вдруг я больше не могу получить полезную нагрузку по электронной почте из-за проблемы с unicode (он буквально вытаскивает один и тот же адрес электронной почты, просто используя разные версии Py. Я читаю Unicode HOWTO и получаю . потерял

следующие работы: при запуске на Python 2.6:

response = server.fetch(messages, ['RFC822']) 
for msgid, data in response.iteritems(): 
    msg_string = data['RFC822'] 
    msg = email.message_from_string(msg_string) 

    body = msg.get_payload() 
    abody = str(body[1]) #converts the HTML instance to a string 

Но когда я запускаю это под 2.7 я получаю следующее сообщение об ошибке:

File "./foo.py", line 75, in main 
    msg = email.message_from_string(msg_string) 
File "/usr/lib/python2.7/email/__init__.py", line 57, in message_from_string 
    return Parser(*args, **kws).parsestr(s) 
File "/usr/lib/python2.7/email/parser.py", line 82, in parsestr 
    return self.parse(StringIO(text), headersonly=headersonly) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 3041: ordinal not in range(128) 

Так ясно, что переводчик 2.7 не любит какую-то часть сообщения электронной почты, которое я читаю. И я подозреваю, что мне нужно преобразовать тип (или как-то гадость с типом вывода), но я потерялся относительно истинной проблемы и решение.

Я нахожусь на 2 часа и могу использовать руку помощи. Благодарю.

ответ

0

Дикое предположение: ваш msg_string кодируется с использованием UTF-8. Он также может быть дополнительно закодирован как «quoted printable».

Я хотел бы попробовать сделать что-то вроде этого:

#... 
msg_string = data['RFC822'].decode('utf8') 
#... etc 

И если это помогает, но вы все еще видите странные символы (= C3 = 96 ...), попробуйте следующее:

import quopri 
#... 
msg_string = data['RFC822'].decode('quopri').decode('utf8') 
#... etc 
+0

Спасибо, но это не помогло. При дальнейшем обследовании он заставил ошибку получить бросок ранее. Не уверен, что это поможет объяснить проблему. Это все та же ошибка. Вот что я получаю ... Файл "./getAmex.py", строка 250, в основной() File "./getAmex.py", строки 70, в главном msg_string = данные [ 'RFC822'] .decode ('utf8') Файл «/usr/lib/python2.7/encodings/utf_8.py», строка 16, в декоде return codecs.utf_8_decode (ввод, ошибки, True) UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xa0' в позиции 3029: порядковый номер не в диапазоне (128) – jond

+0

Извините, не удалось выяснить, как получить отступ-4 для работы с этим выходом кода. :-( – jond

+1

Я обнаружил, что в модуль электронной почты было внесено одно изменение в 2.7: [link] (http://docs.python.org/dev/whatsnew/2.7.html). В частности ... Класс сообщений модуля электронной почты будет теперь принимаем полезную нагрузку в кодировке Unicode, автоматически преобразуя полезную нагрузку в кодировку, заданную с помощью output_charset. Другое, что я сделал, это обновление RFC822 до RFC2822, но это, похоже, не имеет значения. – jond

0

Вы пробовали

msg_string = data['RFC822'].encode('ascii','ignore') 
Смежные вопросы