2010-10-21 1 views
5

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

>>>import imaplib 
>>>server = imaplib.IMAP4_SSL('imap.gmail.com','993') 
>>>server.login('[email protected]','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]) 

ответ

7

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

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

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

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

6

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

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

settings

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

+1

Я попытался ваш подход, но когда я удалю сообщение, сообщение будет иметь метку INBOX, а если мы удалим из самой gmail, сообщение не будет иметь никакой метки. –

+2

Я знаю, что это действительно старая тема, но чтобы помочь кому-либо еще с проблемой Рахула выше, вам просто нужно сначала удалить ярлык «Входящие», прежде чем добавить метку корзины. то есть 'imap.store (num, '-X-GM-LABELS', '\\ Inbox')' – Shogan

12

он перемещает всю почту в данной метке GMAIL к GMAIL Trash

#!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 потому что имеет кэш

+0

Отличное предложение. Где находятся документы об этом использовании m.store()? – jml

+0

@jml: цитирование из спецификации [IMAP spec, RFC 3501] (https://tools.ietf.org/html/rfc3501): '* представляет наибольшее используемое число' – ckhan

0

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

#!/bin/python 

import datetime 
import imaplib 

m = imaplib.IMAP4_SSL("imap.gmail.com") # server to connect to 
print "Connecting to mailbox..." 
m.login('[email protected]_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." 
Смежные вопросы