Move an email in GMail with Python and imaplib Move an email in GMail with Python and imaplib python python

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()