Search code examples
pythongmailimapimaplib

Move an email in GMail with Python and imaplib


I want to be able to move an email in GMail from the inbox to another folder using Python. I am using imaplib and can't figure out how to do it.


Solution

  • 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, re
    pattern_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 imap
    
    def 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)