2010-10-21 36 views
5

Tôi cố gắng xóa thư khỏi thư mục hộp thư đến và tất cả đều ổn, nhưng khi tôi chuyển sang thư mục Tất cả thư, việc xóa không hoạt động. expunge() phương thức trả về ('OK', [None]) và thông điệp đã không loại bỏ:Sự cố khi xóa email trong gmail bằng 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]) 

Trả lời

7

Như nó nói trên gmail blog site, thực hiện IMAP của Google là một chút khác nhau. Khi bạn làm theo các hướng dẫn để nhận được ngữ nghĩa thông thường hơn, nó có giúp ích gì không?

Ngoài ra còn có một số tùy chọn tối nghĩa hơn đối với những người bạn của những người muốn làm cho công việc IMAP của Gmail giống như cung cấp dịch vụ IMAP truyền thống: bạn có thể tắt tự động xóa bỏ hoặc thùng rác thông báo khi họ không dài hơn hiển thị qua IMAP.

Các giao thức IMAP cho phép các tin nhắn đến được đánh dấu để xóa, một loại nhà nước tình trạng lấp lửng nơi nhắn vẫn là hiện diện trong thư mục nhưng dự kiến ​​sẽ được xóa vào lần tiếp theo thư mục được xóa mà . Trong triển khai IMAP IMAP chuẩn của chúng tôi, khi bạn đánh dấu thư là bị xóa, Gmail không cho phép nó nằm trong trạng thái đó - nó xóa (hoặc tự động xóa) thư đó khỏi thư mục ngay lập tức. Nếu bạn muốn quá trình xóa hai giai đoạn hai bước, sau khi bạn đã bật Lab này, chỉ cần chọn 'Không tự động xóa thư' dưới tab 'Chuyển tiếp và POP/IMAP' trong Cài đặt.

Tương tự, hầu hết các hệ IMAP không phần khái niệm của Gmail lưu trữ tin nhắn (gửi tin nhắn đến [Gmail]/Tất cả Thư chứ không phải [Gmail]/Thùng rác). Nếu bạn muốn rằng thư đã xóa không còn lại trong bất kỳ thư mục IMAP nào khác có thể được gửi đến [Gmail]/Thùng rác thay thế, Nâng cao IMAP Điều khiển cho phép bạn đặt tùy chọn theo cách này. Trong phần 'Truy cập IMAP:' của tab 'Chuyển tiếp và POP/IMAP', hãy tìm thông báo 'Khi một thông báo bị xóa khỏi tùy chọn thư mục IMAP hiển thị sau cùng'. Chọn 'Chuyển thư vào Thùng rác Gmail'. Nếu bạn muốn thực hiện một bước hơn nữa, bạn có thể chọn 'Ngay lập tức xóa thư vĩnh viễn'.

6

Với Gmail advanced IMAP controls bạn có thể đặt những gì xảy ra với thư khi bạn xóa chúng qua IMAP.

Chỉ cần bật "Kiểm soát IMAP nâng cao" trong Gmail Labs. Trang cài đặt sẽ trông như thế này:

settings

Sau đó, khi bạn đánh dấu thư là xóa và xóa bỏ theo this answer nó sẽ được chuyển vào thùng, xóa vĩnh viễn, hoặc lưu trữ "All Mail" tùy thuộc vào bạn đã chọn cài đặt nào.

+1

Tôi đã thử cách tiếp cận của bạn nhưng khi tôi xóa một tin nhắn, tin nhắn sẽ có nhãn INBOX trong khi nếu chúng tôi xóa khỏi chính gmail thì thông báo sẽ không có bất kỳ nhãn nào. –

+2

Tôi biết đây là một chủ đề thực sự cũ, nhưng để giúp bất cứ ai khác có vấn đề của Rahul ở trên, bạn chỉ cần loại bỏ "nhãn hộp thư đến" trước, trước khi bạn thêm nhãn thùng rác. tức là 'imap.store (num, '-X-GM-LABELS', '\\ Hộp thư đến')' – Shogan

12

nó di chuyển tất cả thư trong một nhãn gmail cho vào Thùng rác 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 

Hãy nhớ để làm mới giao diện gmail của bạn vì nó có bộ nhớ cache

+0

Đề xuất tuyệt vời. Các tài liệu về cách sử dụng này của m.store() ở đâu? – jml

+0

@jml: trích dẫn từ [IMAP spec, RFC 3501] (https://tools.ietf.org/html/rfc3501): '* đại diện cho số lượng lớn nhất trong sử dụng' – ckhan

0

Dưới đây là một trong đó làm việc với Gmail và hiện nó rất một cách nhanh chóng (không lưu trữ trong vòng lặp for). Điều chỉnh theo ý bạn, nhưng ý tưởng là tất cả về cách sử dụng lựa chọn/tìm kiếm và sau đó thực hiện một cửa hàng hoặc chỉ chọn một cửa hàng cho tất cả các mục có nhãn/thư mục cụ thể:

#!/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." 
Các vấn đề liên quan