Move an email in GMail with Python and imaplib
There is no explicit move command for IMAP. You will have to execute a COPY
followed by a STORE
(with suitable flag to indicate deletion) and finally expunge
. The example given below worked for moving messages from one label to the other. You'll probably want to add more error checking though.
import imaplib, getpass, repattern_uid = re.compile(r'\d+ \(UID (?P<uid>\d+)\)')def connect(email): imap = imaplib.IMAP4_SSL("imap.gmail.com") password = getpass.getpass("Enter your password: ") imap.login(email, password) return imapdef disconnect(imap): imap.logout()def parse_uid(data): match = pattern_uid.match(data) return match.group('uid')if __name__ == '__main__': imap = connect('<your mail id>') imap.select(mailbox = '<source folder>', readonly = False) resp, items = imap.search(None, 'All') email_ids = items[0].split() latest_email_id = email_ids[-1] # Assuming that you are moving the latest email. resp, data = imap.fetch(latest_email_id, "(UID)") msg_uid = parse_uid(data[0]) result = imap.uid('COPY', msg_uid, '<destination folder>') if result[0] == 'OK': mov, data = imap.uid('STORE', msg_uid , '+FLAGS', '(\Deleted)') imap.expunge() disconnect(imap)
As for Gmail, based on its api working with labels, the only thing for you to do is adding dest label and deleting src label:
import imaplibobj = imaplib.IMAP4_SSL('imap.gmail.com', 993)obj.login('username', 'password')obj.select(src_folder_name)typ, data = obj.uid('STORE', msg_uid, '+X-GM-LABELS', desti_folder_name)typ, data = obj.uid('STORE', msg_uid, '-X-GM-LABELS', src_folder_name)
I suppose one has a uid of the email which is going to be moved.
import imaplibobj = 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()