Say you want to extract the names and emails from all the messages under given tag in your gmail. In my case, it’s the 60 readers who took part in the “free PDF if you buy the print version” offer. I’d like to send them an update.
I started clicking around in gmail and compiling the list, but Gmail’s UI is NOT designed for this, you can’t select-text the email field because a popup shows up, and yada yada…. If you’re reading this, you probably got to this post because you have the same problem so I don’t need to explain.
Yes this is horribly repetitive, and yes it can be automated using python:
import imaplib import email from email.utils import parseaddr import getpass user = raw_input("Enter your GMail username:") pwd = getpass.getpass("Enter your password: ") m = imaplib.IMAP4_SSL('imap.gmail.com', 993) m.login(user,pwd) # see IMAP client # m # see tags (i.e. mailboxes) using # m.list() # select the desired tag m.select('miniref/lulureaders', readonly=True) typ, data = m.search(None, 'ALL') # build a list of people from (both FROM and TO headers) people = [] for i in range(1, len(data[0].split(' '))+1 ): typ, msg_data = m.fetch(str(i), '(RFC822)') for response_part in msg_data: if isinstance(response_part, tuple): msg = email.message_from_string(response_part[1]) name1, addr1 = parseaddr( msg['to'] ) name2, addr2 = parseaddr( msg['from'] ) d1 = { "name":name1, "email":addr1 } d2 = { "name":name2, "email":addr2 } people.extend([d1,d2]) # uncomment below to see wat-a-gwaan-on #for header in [ 'subject', 'to', 'from' ]: # print '%-8s: %s' % (header.upper(), msg[header]) #print "-"*70 # lots of people, duplicate entries len(people) # filter uniq # awesome trick by gnibbler # via http://stackoverflow.com/questions/11092511/python-list-of-unique-dictionaries people = {d['email']:d for d in people}.values() # uniq by email # just uniques len(people) # print as comma separated values for import into mailing list for reader in people: print reader['email'] + ", " + reader['name'] # ciao! m.close()