Ответ 1
Я думаю, что вы должны сначала пометить электронные письма, которые нужно удалить. Например:
for num in data[0].split():
box.store(num, '+FLAGS', '\\Deleted')
box.expunge()
Как удалить сообщения из почтового ящика? Я использую этот код, но буквы не удаляются. Извините за мой английский.
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()
Я думаю, что вы должны сначала пометить электронные письма, которые нужно удалить. Например:
for num in data[0].split():
box.store(num, '+FLAGS', '\\Deleted')
box.expunge()
Это рабочий код для удаления всех писем в почтовом ящике:
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()
Следующий код печатает некоторые поля заголовка сообщения, а затем удаляет сообщение.
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
Если вы используете GMail, процесс немного отличается:
Все письма в [Gmail]/Спам и [Gmail]/Корзина удаляются через 30 дней. Если вы удалите сообщение из [Gmail]/Спама или [Gmail]/Корзина, оно будет удалено навсегда.
Помните также, чтобы вызвать EXPUNGE после установки тега Deleted.
Это то, что работает для меня, и это очень быстро, поскольку я не удаляю каждый адрес электронной почты отдельно (хранилище), но вместо этого передаю индекс списка. Это работает как для личных, так и для корпоративных пользователей (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."