Как изменить флаг электронной почты на Недавние, используя IMAPClient - PullRequest
4 голосов
/ 30 января 2012

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

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

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

Документация IMAPClient гласит, что флаг Recent доступен только для чтения, но мне было интересно, есть ли способ пометить письмо как не прочитанное.

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

Спасибо.

Ответы [ 4 ]

3 голосов
/ 09 мая 2012

Для полноты, вот реальный пример использования 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 после загрузки сообщения.

См. раздел 6.4.5 RFC 3501 для получения дополнительной информации.

1 голос
/ 30 января 2014

В IMAPClient docs специально указано, что флаг 'Recent' имеет значение ReadOnly:

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

Это, вероятно, функция (или ограничение) серверов IMAP и IMAP.(То есть: вероятно, не ограничение IMAPClient).

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

1 голос
/ 30 января 2012

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

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

0 голосов
/ 20 октября 2017

@ Менно Смитс:

У меня проблемы с добавлением флага '\ Seen' к письму после его анализа.Я хочу пометить письмо как READ, только когда оно содержит определенный текст.

Я пытался использовать add_flags, используя "client.add_flags (msg_ids, [SEEN])", который вы дали выше, но япродолжать получать хранить не удалось: команда получена в недопустимом состоянии Что именно входит в [SEEN] (это просто заполнитель или точный синтаксис?)

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

#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'
...