2008-09-23 48 views
13
khác

(sử dụng các lệnh IMAP, không phải với sự hỗ trợ của bất kỳ gói mail khác)IMAP: làm thế nào để di chuyển một thông điệp từ một thư mục để

+0

Mặc dù không có lệnh "di chuyển" IMAP trong thông số hiện tại, có đề xuất cho tiện ích mở rộng: http://tools.ietf.org/html/draft-gulbrandsen-imap-move-01 (Arnt Gulbrandsen, Tháng 3 năm 2012). Đáng buồn thay, liên kết có thể sẽ chết vào thời điểm bạn muốn nhấp vào liên kết, do chính sách hết hạn dự thảo tích cực của IETF. – tripleee

+1

RFC6851 MOVE Extension: http://tools.ietf.org/html/rfc6851. Tất nhiên nếu máy chủ của bạn không hỗ trợ COPY, 'STORE \ DELETED flag' và EXPUNGE là tùy chọn duy nhất (như trong câu trả lời dưới đây) –

+1

@triplee: links.ietf.org links không hết hạn. Bản nháp hết hạn, nhưng tools.ietf.org tiếp tục đưa ra câu trả lời hợp lý. – arnt

Trả lời

15

Tôi không chắc chắn bạn hiểu rõ thế nào, nhưng về cơ bản sau khi đăng nhập, "CHỌN" hộp thư nguồn, "COPY" thư và "EXPUNGE" các thư (hoặc "DELETE" hộp thư cũ nếu nó trống bây giờ :-).

a login a s 
b select source 
c copy 1 othermbox 
d store 1 +flags (\Deleted) 
e expunge 

sẽ là ví dụ về thư cần gửi. (Lưu ý: thông báo imap yêu cầu tiền tố uniqe trước mỗi lệnh, do đó "a b c" ở phía trước)

Xem chi tiết RFC 2060.

+5

Thay vào đó, hãy xem [RFC 3501] (http://tools.ietf.org/html/rfc3501). – dkarp

+3

Lưu ý rằng 'expunge' sẽ xóa các tin nhắn _all_ bị gắn cờ' \ Deleted', có thể không phải là những gì bạn muốn. –

3

Tôi đoán bạn COPY thông điệp vào thư mục mới và sau đó xóa (Xoá) nó trong cái cũ.

RFC351

GỢI Ý Không có lệnh DELETE mà những gì bạn có nghĩa là, bạn phải cờ được thông báo là bị xóa và sau đó xóa bỏ các hộp thư. Hãy xem RFC. Hãy cẩn thận với DELETE, vì nó xóa toàn bộ các hộp thư, không phải thư duy nhất.

8

Nếu bạn có uid của email sẽ được di chuyển.

import imaplib 

obj = imaplib.IMAP4_SSL('imap.gmail.com', 993) 
obj.login('username', 'password') 
obj.select(src_folder_name) 
apply_lbl_msg = obj.uid('COPY', msg_uid, desti_folder_name) 
if apply_lbl_msg[0] == 'OK': 
    mov, data = obj.uid('STORE', msg_uid , '+FLAGS', '(\Deleted)') 
    obj.expunge() 

đâu msg_uid là uid của thư.

+3

-1: "sử dụng lệnh IMAP, không phải với sự hỗ trợ của bất kỳ gói thư nào khác" – dkarp

+1

+1 Đây là liên kết tốt nhất mà tôi đã tìm thấy khi sử dụng python cho tác vụ này. –

20

Có nhiều cách để thực hiện điều đó. Tốt nhất là lệnh UID MOVE quy định tại RFC 6851 từ đầu năm 2013:

C: a UID MOVE 42:69 foo 
S: * OK [COPYUID 432432 42:69 1202:1229] 
S: * 22 EXPUNGE 
S: (more expunges) 
S: a OK Done 

Sự hiện diện của phần mở rộng này được chỉ định bởi khả năng MOVE.

Nếu nó không phải là có sẵn, nhưng UIDPLUS (RFC 4315) là lựa chọn tốt nhất thứ hai là sử dụng sự kết hợp của UID STORE, UID COPYUID EXPUNGE:

C: a01 UID COPY 42:69 foo 
S: a01 OK [COPYUID 432432 42:69 1202:1229] Copied 
C: a02 UID STORE 42:69 +FLAGS.SILENT (\Deleted) 
S: a02 OK Stored 
C: a03 UID EXPUNGE 42:69 
S: * 10 EXPUNGE 
S: * 10 EXPUNGE 
S: * 10 EXPUNGE 
S: a03 Expunged 

Nếu UIDPLUS là mất tích, không có gì là hợp lý mà bạn có thể làm - lệnh EXPUNGE xóa vĩnh viễn tất cả các thư được đánh dấu để xóa, bao gồm cả những thư bạn chưa chạm vào. Điều tốt nhất là chỉ sử dụng UID COPYUID STORE trong trường hợp đó.

+0

Máy chủ của tôi không hỗ trợ cho 'UID MOVE':/ –

+0

Cơ hội tốt thứ hai của bạn là đúng trong danh sách mã thứ hai, sau đó. –

Các vấn đề liên quan