Today I had to automatically access my Gmail inbox from Python. I needed the ability to get an unread email count, the subjects of those unread emails and then download them. I found a Gmail.py library on sourceforge, but it actually opened the normal gmail webpage and site scraped the info. I wanted something much faster, luckily gmail can now be accessed with both pop and imap.
After a tiny amount of research I decided imap was the better albiet slightly more difficult protocol. Enabling imap in gmail is straight forward, it was under labs.
The address for gmail's imap server is:
imap.gmail.com:993
Python has a library module called imaplib, we will make heavy use of that to access our emails. I'm going to assume that we have already defined two globals - username and password. To connect and login to the gmail server and select the inbox we can do:
All pretty straight forward so far, lets find out how many unread emails we have:
Now I'm not saying this is a particularly nice way of doing this, but if you print the response and reverse engineer it you will see how I arrived with that string parsing. Regex would be another option, but I try avoid that unless it is required. Now lets get a list of the identifiers for each unread message, I'm going to call it email_ids:
If I want to download a particular list of messages, or maybe download the subjects for a list of messages I can use the following functions:
And I often search for emails from someone in particular, I can do that easily from Python as well:
Now this can all be combined to print the body of the latest 3 emails sent by my friend bob:
Thats all folks!
After a tiny amount of research I decided imap was the better albiet slightly more difficult protocol. Enabling imap in gmail is straight forward, it was under labs.
The address for gmail's imap server is:
imap.gmail.com:993
Python has a library module called imaplib, we will make heavy use of that to access our emails. I'm going to assume that we have already defined two globals - username and password. To connect and login to the gmail server and select the inbox we can do:
import imaplib imap_server = imaplib.IMAP4_SSL("imap.gmail.com",993) imap_server.login(username, password) imap_server.select('INBOX')
All pretty straight forward so far, lets find out how many unread emails we have:
# Count the unread emails status, response = imap_server.status('INBOX', "(UNSEEN)") unreadcount = int(response[0].split()[2].strip(').,]')) print unreadcount
Now I'm not saying this is a particularly nice way of doing this, but if you print the response and reverse engineer it you will see how I arrived with that string parsing. Regex would be another option, but I try avoid that unless it is required. Now lets get a list of the identifiers for each unread message, I'm going to call it email_ids:
# Search for all new mail status, email_ids = imap_server.search(None, '(UNSEEN)') print email_ids
If I want to download a particular list of messages, or maybe download the subjects for a list of messages I can use the following functions:
def get_emails(email_ids): data = [] for e_id in email_ids: _, response = imap_server.fetch(e_id, '(UID BODY[TEXT])') data.append(response[0][1]) return data def get_subjects(email_ids): subjects = [] for e_id in email_ids: _, response = imap_server.fetch(e_id, '(body[header.fields (subject)])') subjects.append( response[0][1][9:] ) return subjects
And I often search for emails from someone in particular, I can do that easily from Python as well:
def emails_from(name): '''Search for all mail from name''' status, response = imap_server.search(None, '(FROM "%s")' % name) email_ids = [e_id for e_id in response[0].split()] print 'Number of emails from %s: %i. IDs: %s' % (name, len(email_ids), email_ids) return email_ids
Now this can all be combined to print the body of the latest 3 emails sent by my friend bob:
for email in get_emails(emails_from("bob")[-3:-1]): print email
Thats all folks!