Поиск в Python IMAP с использованием темы, закодированной с помощью iso-8859-1 - PullRequest
3 голосов
/ 12 апреля 2011

Из другой учетной записи я отправил себе электронное письмо с темой Test de réception en local. Теперь, используя IMAP, я хочу найти этот адрес электронной почты для поиска по теме.

При поиске ALL и поиске электронного письма среди выходных данных я вижу:
Subject: =?ISO-8859-1?Q?Test_de_r=E9ception_en_local?=

Итак, теперь, используя imap, я пытаюсь:

M = imaplib.IMAP4_SSL('imap.gmail.com', 993)
M.login('user@gmail.com', 'password')
M.select('[Gmail]/All Mail')

subject = Header(email_model.subject, 'iso-8859-1').encode() #email_model.subject is in unicode, utf-8 encoded
typ, data = M.search('iso-8859-1', '(SUBJECT "%s")' % subject)
for num in data[0].split():
    typ, data = M.fetch(num, '(RFC822)')
    print 'Message %s\n%s\n' % (num, data[0][1])
M.close()
M.logout()

print 'Fin'

Если вы распечатаете subject, вы увидите, что результат выглядит точно так же, как то, что я получаю с сервера IMAP при моем предыдущем, более широком поиске. Тем не менее, это не похоже на совпадение при выполнении этого более конкретного поиска.

Для поиска я перепробовал все, что мог придумать:

typ, data = M.search('iso-8859-1', '(HEADER subject "%s")' % subject)
typ, data = M.search('iso-8859-1', 'ALL (SUBJECT "%s")' % subject)

И другие, которые я не могу вспомнить в данный момент, все без удачи.

Я могу искать (и сопоставлять) электронные письма, в которых есть темы, в которых используется только ASCII, но он не работает с темами, к которым применена кодировка. Итак ...

В IMAP, как правильно искать электронную почту, используя тему, к которой применена кодировка?

Спасибо

1 Ответ

6 голосов
/ 12 мая 2011

При разговоре с серверами IMAP проверьте с помощью IMAP RFC .

Вы должны удалить лишние кавычки и не должны кодировать строки. Кроме того, charset указывает кодировку поискового запроса, а не кодировку заголовка сообщения. Это должно работать (работает для меня):

M.search("utf-8", "(SUBJECT %s)" % u"réception".encode("utf-8"))
# this also works:
M.search("iso8859-1", "(SUBJECT %s)" % u"réception".encode("iso8859-1"))

Edit:

Очевидно, что некоторые серверы (по крайней мере, gmail на август 2013 г.) поддерживают строки utf-8 только при отправке в виде литералов. Python imaplib имеет очень ограниченную поддержку буквенных аргументов, лучшее, что можно сделать, это что-то вроде:

term = u"réception".encode("utf-8")
M.literal = term
M.search("utf-8", "SUBJECT")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...