2015-02-16 3 views
1

Вот не мой код, который подключается к Gmail и разбирает электронную почту:Использования IMAP для извлечения TypeError заголовков ошибки: initial_value должны быть Облами или Нет, не байты

import imaplib 
from email.parser import HeaderParser 

conn = imaplib.IMAP4_SSL('imap.gmail.com') 
conn.login('[email protected]', 'password') 
conn.select() 
conn.search(None, 'ALL') 
data = conn.fetch('1', '(BODY[HEADER])') 
header_data = data[1][0][1] 
parser = HeaderParser() 
msg = parser.parsestr(header_data) 

На этом этапе я получаю сообщение об ошибке «TypeError : initial_value должно быть str или None, а не байтами «

Im using python 3. Как преобразовать результат в строку, чтобы ican проанализировал заголовки, используя parser.parsestr?

ответ

2

Заменить

header_data = data[1][0][1] 

с

header_data = data[1][0][1].decode('utf-8') 

Это должно заставить его работать на Python 3.xx

Это одна из болевых точек миграции кода, чтобы сделать его Python 3, но как только вы это понимаете, это очень легко исправить. Кроме того, если вы сделаете это изменение, оно нарушит совместимость с python 2.x.x

В python 3 все строки являются юникодами, и если вы получаете байты, вы должны сначала преобразовать их в тип данных str. You can read more about that here

+0

Thanks mate. Последнее, где у меня есть данные = conn.fetch ('1', '(BODY [HEADER])'). Вместо 1, как я могу выбрать все электронные письма? –

+0

не уверен, если у вас есть отдельный вопрос, пожалуйста, квалифицируйте его примером кода, чтобы проиллюстрировать проблему и опубликовать ее как новый вопрос. Кроме того, если этот ответ помог решить ваш вопрос, отметьте его принятым, чтобы сообщить об этом сообществу. веселит. –

 Смежные вопросы

  • Нет связанных вопросов^_^