2013-08-05 3 views
0

Я использую библиотеку IMAPClient, но при выполнении поиска я получаю UnicodeEncodeError. Ниже приведен фрагмент кода и трассировки стека:Python IMAPClient/imaplib search unicode issue

imap_client = imapclient.IMAPClient('imap.gmail.com', use_uid=True, ssl=True) 
imap_client.oauth2_login('[email protected]', 'xxx') 
subject = u'Test \u0153\u2211\u00b4\u00e5\u00df\u2202' 
from_email = u'[email protected]' 
to_emails = [u'[email protected]'] 
cc_emails = [] 
approx_date_sent = '05-Aug-2013' 

imap_client.select_folder(r'\Sent') 
search_criteria = [ 
    u'FROM %s' % from_email, 
    u'SUBJECT %s'.encode('utf-8') % subject, 
    u'TO %s' % ';'.join(to_emails) or '', 
    u'CC %s' % ';'.join(cc_emails) or '', 
    u'SENTON %s' % approx_date_sent 
] 
msg_ids = imap_client.search(search_criteria, charset='utf-8') 

'ascii' codec can't encode characters in position 77-82: ordinal not in range(128) 
Traceback (most recent call last): 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 570, in dispatch 
    return method(*args, **kwargs) 
    File "/base/data/home/apps/s~app/dev.369284735686497536/imapapi.py", line 269, in post 
    to_emails=to_emails, cc_emails=cc_emails, approx_date_sent=approx_date_sent 
    File "/base/data/home/apps/s~app/dev.369284735686497536/utils/imap.py", line 123, in search_message 
    msg_ids = imap_client.search(search_criteria, charset='utf-8') 
    File "/base/data/home/apps/s~app/dev.369284735686497536/imapclient/imapclient.py", line 569, in search 
    typ, data = self._imap.search(charset, *criteria) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/imaplib.py", line 625, in search 
    typ, dat = self._simple_command(name, 'CHARSET', charset, *criteria) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/imaplib.py", line 1070, in _simple_command 
    return self._command_complete(name, self._command(name, *args)) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/imaplib.py", line 857, in _command 
    self.send('%s%s' % (data, CRLF)) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/imaplib.py", line 1178, in send 
    sent = self.sslobj.write(data) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/ssl.py", line 232, in write 
    return self._sslobj.write(data) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 77-82: ordinal not in range(128) 

Кажется, этот вопрос происходит в ssl.py? И ssl=True необходим для oauth2_login.

+0

Какая версия IMAPClient вы используете? Обработка юникода и критериев поиска значительно улучшилась с 1.0. –

ответ

0

Попробовать это

Python IMAP search using a subject encoded with iso-8859-1

Он охватывает UTF-8, а также изо-8859-1

+0

Я уже делаю то же самое, хотя? 'subject = u'Test \ u0153 \ u2211 \ u00b5 \ u00df \ u2202'' ...' u'SUBJECT% s'.encode ('utf-8')% subject, '. – john2x

+0

Кроме того, это полезно http://stackoverflow.com/questions/9997928/python-imap-search-using-a-subject-encoded-with-utf-8?rq=1 – willo