2012-01-30 2 views
4

Я получаю письма с моего почтового сервера с помощью IMAPClient (Python), проверяя, что сообщения электронной почты помечены как «\ Недавние». После того, как письмо было прочитано, почтовый сервер автоматически устанавливает флаг электронной почты в «\ Seen».Как изменить флаг электронной почты на недавний с помощью IMAPClient

Что я хочу сделать, это сбросить флаг электронной почты в "\ Недавние", поэтому, когда я проверяю адрес электронной почты непосредственно на сервере, по-прежнему отображается как непрочитанное.

Что я нахожу, так это то, что IMAPClient бросает исключение, когда я пытаюсь добавить флаг «\ Recent» в электронное письмо с использованием определения «set_flag» IMAPClient. Добавление любого другого флага отлично работает.

Документация IMAPClient говорит, что флаг «Недавний» доступен только для чтения, но мне было интересно, есть ли способ отметить сообщение электронной почты как нечитаемое.

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

Спасибо.

ответ

1

Отказ от ответственности: Я знаком с IMAP, но не с Python-IMAPClient.

Обычно флаг «видел» определяет, будет ли отображаться сводка по электронной почте как нормальная или жирная. Вы должны иметь возможность сбросить видимый флаг. Однако недавний флаг не может находиться под вашим прямым контролем. Сервер imap установит его, если уведомляет о появлении новых сообщений.

+0

Спасибо за ответ Если это только «видел» флаг, который отвечает за смелый текст, который probbaly все, что мне нужно беспокоиться о том, я могу успешно удалить любой флаг, так от того, что вы говорите, если я просто удалю флаг «видел», письмо должно появиться как непрочитанное? – user788462

+0

да, я считаю, что большинство почтовых клиентов используют флаг «видел», чтобы контролировать, показывать ли жирным шрифтом или нет. Многие серверы IMAP используют механизм «maildir» для хранения механизмов; есть явный устанавливаемый флаг «видел». – seand

+0

Еще раз спасибо. Это имеет смысл, я установил видимый флаг, а не удалял его. – user788462

3

Для полноты здесь приведен пример использования IMAPClient. Флаг \ Seen обновляется, чтобы контролировать, отмечены ли сообщения как прочитанные или непрочитанные.

from imapclient import IMAPClient, SEEN 

client = IMAPClient(...) 
client.select_folder('INBOX') 
msg_ids = client.search(...) 

# Mark messages as read 
client.add_flags(msg_ids, [SEEN]) 

# Mark messages as unread 
client.remove_flags(msg_ids, [SEEN]) 

add_flags Обратите внимание, что и remove_flags используются вместо set_flags, поскольку последние сбрасывает флаги только те, которые указаны. При настройке состояния чтения/непрочтения вы обычно хотите оставить любые другие флаги сообщений неповрежденными.

Следует также отметить, что можно использовать fetch с помощью элемента данных «BODY.PEEK» для извлечения частей сообщений, не затрагивая флаг \ Seen. Это может исключить необходимость установки флажка \ Seen после загрузки сообщения.

Для получения более подробной информации см. section 6.4.5 of RFC 3501.

1

IMAPClient документы специально заявил '\ Recent' флаг ReadOnly:

http://imapclient.readthedocs.org/en/latest/#message-flags

Это, вероятно, особенность (или ограничение) из IMAP и IMAP-серверов. (То есть: возможно, не ограничение IMAPClient).

Используйте флажок «\ Seen», чтобы отметить что-то непрочитанное.

0

@Menno Смитс:

У меня возникли проблемы, добавляющих «\ Seen» флага к почте после разбора через него. Я хочу отмечать почту как ЧИТАТЬ, когда она содержит определенный текст.

Я пытался использовать add_flags, используя «клиент».add_flags (msg_ids, [ВИДЕЛИ])»вы дали выше, но я получаю магазин не удалось: команда получила в нерабочем состоянии Что именно идет в папку [ВИДЕЛИ] (это просто заполнитель или точный синтаксис?)

Вот часть моего кода:..

#login and authentication 
context=ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) 
iobj=imapclient.IMAPClient('outlook.office365.com', ssl=True,ssl_context=context) 
iobj.login(uname,pwd) 
iobj.select_folder('INBOX', readonly=True) 
unread=iobj.search('UNSEEN') 
print('There are: ',len(unread),' UNREAD emails') 
for i in unread: 
    mail=iobj.fetch(i,['BODY[]']) 
    mail_body=html2text.html2text(mcontent.html_part.get_payload().decode(mcontent.html_part.charset)) 
    ##Do some regex to parse the email to check if it contains text 
    meter_no=(re.findall(r'\nACCOUNT NUMBER: (\d+)', mail_body)) 
    req_type=(re.findall(r'Complaint:..+?\n(.+)\n', mail_body)) 
    if 'Key Change' in req_type: 
     if meter_no in kct['Account_no'].values: 
      print 'Going to sendmail'# Call a function            
      sending_email(meter_no,subject,phone_no,req_type,)    
      mail[b'FLAGS']=r'b\Seen'+','+''+r'b\Answered'##Trying to manuaally alter the flag but didn't work## 
      iobj.add_flags(i,br'\Seen')# Didn't work too (but is 'i' my msg_id??) 
      iobj.add_flags(i,[SEEN]) # Complains Name SEEN not defined 

     else: print 'KCT is yet to be generated' 
+0

Хорошо, поэтому после прочтения документации снова и снова без какой-либо помощи ... Я нашел эту книгу «Основы программирования на Python Network» Брэндона Родоса онлайн, и он ответил на мой вопрос. Чтобы добавить флаг «Seen»: iobj.set_flags (i, ['\\ Seen', '\\ Answered]] #' i '- это идентификатор сообщения электронной почты. – RenewAble

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