2010-07-05 4 views
11

Как удалить сообщения из почтового ящика? Я использую этот код, но буквы не удаляются. Извините за мой английский.imap удаление сообщений

def getimap(self,server,port,login,password): 
    import imaplib, email 
    box = imaplib.IMAP4(server,port) 
    box.login(login,password) 
    box.select() 
    box.expunge() 
    typ, data = box.search(None, 'ALL') 
    for num in data[0].split() : 
     typ, data = box.fetch(num, '(UID BODY[TEXT])') 
     print num 
     print data[0][1] 
    box.close() 
    box.logout() 

ответ

13

Я думаю, вы должны отметить, что письма должны быть удалены, первый .. Например:

for num in data[0].split(): 
    box.store(num, '+FLAGS', '\\Deleted') 
box.expunge() 
2

Если вы используете GMail процесс немного отличается:

  1. Переместите его в папку [Gmail]/Корзина.
  2. Удалить его из [Gmail]/папку Trash (Добавить \ Удалить флаг)

Все письма в [Gmail]/Спам и [Gmail]/Trash удаляются через 30 дней. Если вы удалите сообщение из [Gmail]/Спама или [Gmail]/Корзина, оно будет удалено навсегда.

Помните, что бы позвонить по телефону EXPUNGE после установки тега Удалено.

10

Это рабочий код для удаления всех сообщений электронной почты в почтовом ящике:

import imaplib 
box = imaplib.IMAP4_SSL('imap.mail.microsoftonline.com', 993) 
box.login("[email protected]","paswword") 
box.select('Inbox') 
typ, data = box.search(None, 'ALL') 
for num in data[0].split(): 
    box.store(num, '+FLAGS', '\\Deleted') 
box.expunge() 
box.close() 
box.logout() 
5

Следующий код выводит некоторые поля заголовка сообщения, а затем удалить сообщение.

import imaplib 
from email.parser import HeaderParser 
m = imaplib.IMAP4_SSL("your_imap_server") 
m.login("your_username","your_password") 
# get list of mailboxes 
list = m.list(); 
# select which mail box to process 
m.select("Inbox") 
resp, data = m.uid('search',None, "ALL") # search and return Uids 
uids = data[0].split()  
mailparser = HeaderParser() 
for uid in uids: 
    resp,data = m.uid('fetch',uid,"(BODY[HEADER])")   
    msg = mailparser.parsestr(data[0][1])  
    print (msg['From'],msg['Date'],msg['Subject'])   
    print m.uid('STORE',uid, '+FLAGS', '(\\Deleted)') 
print m.expunge() 
m.close() # close the mailbox 
m.logout()# logout 
1

Это то, что работает для меня, и это действительно быстро, как я не удалять каждое письмо в отдельности (магазин), но передать индекс списка вместо этого. Это работает как для личных, так и для корпоративных пользователей (Google Apps для бизнеса). Сначала он выбирает папку/метку для использования m.list(), показывая вам все доступные. Затем он ищет электронные письма в течение года и выполняет переход к корзине. Затем он помещает все электронные письма в корзину с флагом удаления и исключает все:

#!/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."