Проблема удаления писем в Gmail с помощью imaplib - PullRequest
5 голосов
/ 21 октября 2010

Я пытаюсь удалить сообщение из папки «Входящие» и все в порядке, но при переключении в папку «Вся почта» удаление не работает. 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])

Ответы [ 4 ]

12 голосов
/ 19 апреля 2012

он перемещает всю почту с заданной меткой 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, поскольку он имеет кэш

8 голосов
/ 21 октября 2010

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

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

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

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

6 голосов
/ 20 марта 2011

С расширенными элементами управления Gmail IMAP вы можете установить, что будет с сообщениями при их удалении через IMAP.

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

settings

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

0 голосов
/ 25 февраля 2014

Вот тот, который работает с Gmail и делает это очень быстро (без сохранения в цикле for).Сделайте это по своему усмотрению, но идея заключается в том, как использовать 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."
...