Search code examples
javapythonapigmail

Programmatically Save Draft in Gmail drafts folder


Preferably using Python or Java, I want to compose an email and save it into gmail drafts without user intervention,


Solution

  • Here's a Python script to access a Gmail account. First you need to generate an OAuth token. Download Google's xoauth.py module and run it. It will walk you through the steps. You'll get a url to obtain a verification code -- paste this into the script and it will spit out your token and secret:

    % python xoauth.py --generate_oauth_token [email protected]
    

    Once you've obtained your token and secret, copy them into the Python script below. It uses xoauth.py to authenticate the IMAP client, connects to IMAP, constructs a message and drops it into the Drafts folder.

    import email.message
    import imaplib
    import random
    import time
    import xoauth
    
    MY_EMAIL = '[email protected]'
    MY_TOKEN = '<token>'
    MY_SECRET = '<secret>'
    
    # construct the oauth access token
    nonce = str(random.randrange(2**64 - 1))
    timestamp = str(int(time.time()))
    consumer = xoauth.OAuthEntity('anonymous', 'anonymous')
    access = xoauth.OAuthEntity(MY_TOKEN, MY_SECRET)
    token = xoauth.GenerateXOauthString(
        consumer, access, MY_EMAIL, 'imap', MY_EMAIL, nonce, timestamp)
    
    # connect to gmail's imap service.
    imap = imaplib.IMAP4_SSL('imap.googlemail.com')
    imap.debug = 4
    imap.authenticate('XOAUTH', lambda x: token)
    
    # create the message
    msg = email.message.Message()
    msg['Subject'] = 'subject of the message'
    msg['From'] = MY_EMAIL
    msg['To'] = MY_EMAIL
    msg.set_payload('Body of the message')
    
    # append the message to the drafts folder
    now = imaplib.Time2Internaldate(time.time())
    imap.append('[Gmail]/Drafts', '', now, str(msg))
    
    imap.logout()