Навсегда удалить электронную почту Gmail с помощью Python imaplib

#python #python-2.7 #gmail #imap #imaplib

#python #python-2.7 #gmail #imap #imaplib

Вопрос:

Я использую правило Gmail, чтобы помечать определенные электронные письма как «удалить», чтобы отметить их для постоянного удаления. С помощью этого скрипта Python я могу успешно переместить их в корзину Gmail, но не могу окончательно удалить их, как только они там окажутся.

Есть идеи? Я попытался включить / выключить автоматическое удаление в настройках Gmail imap, но ничего не изменилось.

 mail = imaplib.IMAP4_SSL('imap.gmail.com', 993)

try:
    rv, data = mail.login(EMAIL_ACCOUNT, EMAIL_PASS)
except imaplib.IMAP4.error as e:
    print "LOGIN FAILED!!! "
    print e
    sys.exit(1)

print rv, data

mail.select("delete")
type, data = mail.search(None, 'ALL')

mail.store("1:*",' X-GM-LABELS', '\Trash')
mail.store("1:*", " FLAGS", '\Deleted')
mail.expunge()
  

Комментарии:

1. На самом деле вы не можете использовать gmail, не перемещая их в корзину, затем выбирая корзину, снова находя сообщение и снова отправляя флаг удаления. Если вы сначала не переместите ее в корзину, вы просто удалите ярлык папки и поместите его во «Всю почту»

2. По умолчанию в Gmail сообщения будут удалены из корзины через 30 дней, что может быть достаточно для некоторых вариантов использования.

3. @Max разве это не то, что я делаю с mail.store("1:*",' X-GM-LABELS', '\Trash') mail.store("1:*", " FLAGS", '\Deleted') , перемещая его в корзину и устанавливая флаг deleted?

4. Вы устанавливаете флаг удаленного для «копии» в текущей папке, а не для копии в корзине. (Эмуляция Gmail папок IMAP несовершенна и сложна.) Вам нужно будет select("[Gmail]/Bin") (следить за локализацией), найти сообщение (сообщения), затем выполнить ту же mail.store команду, но с идентификаторами UID в корзине. Если вы удаляете все, это просто.

5. @Max большое спасибо за вашу помощь. Вау никогда бы не понял, что такое «копировать». Да, реализация gmail imap должна сопровождаться предупреждающей надписью!

Ответ №1:

Чтобы суммировать проблемы:

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

Установка Deleted флага на сообщение удаляет текущую папку / ярлык из сообщения. Если это последняя метка, это сообщение архивируется и доступно в All Mail папке.

Использование IMAP для перемещения сообщения в корзину или папку Bin (через MOVE или COPY * 1) или добавление метки корзины соответствует присвоению ему метки корзины (и должно автоматически удалять все остальные метки). Затем она будет находиться там и будет удалена через 30 дней.

Чтобы навсегда удалить сообщение, которое вы удалили, вам нужно select открыть папку Bin или Trash (ее название зависит от локали, возможно, вам потребуется list его найти), затем добавьте Deleted флаг, который соответствует постоянному удалению.

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

* 1: Если вы используете UID MOVE или UID COPY , UIDPLUS ответ должен вернуть новый UID в папке корзины, который вы можете использовать для окончательного удаления элемента.

Примечание: Пользовательский интерфейс настроек IMAP в веб-интерфейсе Gmail теоретически имеет настройки для настройки этого поведения, но, по моему опыту, их изменение не имеет реального эффекта.

Ответ №2:

У меня была такая же проблема, поэтому вот полный код, который работает для меня.
Надеюсь, это кому-нибудь поможет.
ВАЖНО: ваши электронные письма должны быть предварительно перемещены в корзину!

 connection = imaplib.IMAP4_SSL('imap.gmail.com')
connection.login("xxxxx@gmail.com", "xxxxx@gmail.com's account app pwd")
connection.select(mailbox='"[Gmail]/Trash"', readonly=False)
connection.store("1:*", ' FLAGS', '\Deleted')
connection.expunge()
connection.close()  # close and logout the connection
connection.logout()