Проблема Удаление электронных писем в Gmail с использованием imaplib

StackOverflow https://stackoverflow.com/questions/3988583

Вопрос

Я стараюсь удалить сообщение из папки «Входящие» и все в порядке, но когда я переключился на всю папку почты, удаление не работает. expunge() Метод возвращает ('OK', [None]) и сообщение не было удалено:

>>>import imaplib
>>>server = imaplib.IMAP4_SSL('imap.gmail.com','993')
>>>server.login('likvidator89@gmail.com','Password')
>>>server.select('inbox')
>>>for i in server.search(None,'all')[1][0].split():
...    print i+"\n"+server.fetch(i,'(BODY[HEADER.FIELDS (Subject)])')[1][0][1]
...
#  that how i know what UID hame my message? I select by subject
#....
#28
#Subject: 1 Question Has 1 Answer - Stack Overflow
#
#
#29
#Subject: 2222222222
#...
>>>server.store(29,'+FLAGS','\\Deleted')
#('OK', ['29 (FLAGS (\\Seen \\Deleted))'])
>>>server.expunge()
#('OK', ['29'])
>>> server.select('[Gmail]/All Mail')
('OK', ['47'])
>>> for i in server.search(None,'all')[1][0].split():
...  print i+"\n"+server.fetch(i,'(BODY[HEADER.FIELDS (Subject)])')[1][0][1]
... 
#....
#
#46
#Subject: 2222222222
#
#
#47
#Subject: 3333333333333333
#
#....
>>> server.store(47,'+FLAGS','\\Deleted')
('OK', ['47 (FLAGS (\\Seen \\Deleted))'])
>>> server.expunge()
('OK', [None])
Это было полезно?

Решение

Как говорится в Сайт блога Gmail, Реализация Google IMAP немного отличается. Когда вы следуете инструкциям по получению более обычной семантики, помогает ли это?

Есть также несколько более неясных вариантов для тех из вас, кто хочет заставить Gmail's IMAP работать больше, похожие на традиционных поставщиков IMAP: вы можете отключить автоматические сообщения или мусорные сообщения, когда они больше не видны через IMAP.

Протокол IMAP позволяет помечать сообщения для удаления, своего рода состояние неоднократного образования, в котором в папке все еще присутствует сообщение, но намеревается удалить при следующем случае папки. В нашей стандартной реализации IMAP, когда вы отмечаете сообщение как удаленное, Gmail не позволяет ему задержаться в этом состоянии-он сразу же удаляет (или автоматически эксплун) из папки. Если вы хотите двухэтапный процесс удаления, после того, как вы включили эту лабораторию, просто выберите «Не удалять сообщения» на вкладке «пересылка и POP/IMAP» в настройках.

Точно так же большинство систем IMAP не делятся концепцией архивирования Gmail (отправка сообщений в папку [Gmail]/All Mail, а не [Gmail]/Trash). Если вы предпочитаете, что удаленные сообщения, не оставшиеся в каких -либо других видимых папках IMAP, отправляются в [gmail]/мусор, расширенные элементы управления IMAP позволяют вам установить свои предпочтения таким образом. В разделе «IMAP Access:» вкладки «Переадресация и POP/IMAP» найдите «Когда сообщение удаляется из последней видимой папки IMAP:». Выберите «Переместить сообщение в мусор Gmail». Если вы хотите сделать еще один шаг вперед, вы можете выбрать «немедленно удалить сообщение навсегда».

Другие советы

он перемещает всю почту на данном этикетке Gmail в мусор Gmail

#!usr/bin/python
import email, imaplib

user = 'xxx'
pwd = 'xxx'

m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login(user,pwd)

m.select("some_gmail_label")
m.store("1:*",'+X-GM-LABELS', '\\Trash')

m.expunge() # should be useless, but gmail server says it is ok

Не забудьте обновить свой интерфейс Gmail, потому что у него есть кэш

С Gmail Advanced IMAP Controls Вы можете установить то, что происходит с сообщениями, когда вы удаляете их по IMAP.

Просто включите «расширенные элементы управления IMAP» в Gmail Labs. Страница настроек будет выглядеть так:

settings

Затем, когда вы отмечаете сообщение как удаленное и исключенное в соответствии с этот ответ Он будет перемещен в мусорное ведро, навсегда удалено или архивировано в «Всего почту» в зависимости от того, какую настройку вы выбрали.

Вот тот, который работает с Gmail и делает это очень быстро (без магазина в цикле). Адаптируйте это по своему усмотрению, но идея - все о том, как использовать Select/Search, а затем выполните магазин, или просто выберите самостоятельно для всех элементов с определенной меткой/папкой:

#!/bin/python

import datetime
import imaplib

m = imaplib.IMAP4_SSL("imap.gmail.com")  # server to connect to
print "Connecting to mailbox..."
m.login('gmail@your_gmail.com', 'your_password')

print m.select('[Gmail]/All Mail')  # required to perform search, m.list() for all lables, '[Gmail]/Sent Mail'
before_date = (datetime.date.today() - datetime.timedelta(365)).strftime("%d-%b-%Y")  # date string, 04-Jan-2013
typ, data = m.search(None, '(BEFORE {0})'.format(before_date))  # search pointer for msgs before before_date

if data != ['']:  # if not empty list means messages exist
    no_msgs = data[0].split()[-1]  # last msg id in the list
    print "To be removed:\t", no_msgs, "messages found with date before", before_date
    m.store("1:{0}".format(no_msgs), '+X-GM-LABELS', '\\Trash')  # move to trash
    print "Deleted {0} messages. Closing connection & logging out.".format(no_msgs)
else:
    print "Nothing to remove."

#This block empties trash, remove if you want to keep, Gmail auto purges trash after 30 days.
print("Emptying Trash & Expunge...")
m.select('[Gmail]/Trash')  # select all trash
m.store("1:*", '+FLAGS', '\\Deleted')  #Flag all Trash as Deleted
m.expunge()  # not need if auto-expunge enabled

print("Done. Closing connection & logging out.")
m.close()
m.logout()
print "All Done."
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top