Processing your offline gmail in Python

3 February 2009

In a discussion in my local Linux group, I was encouraged to try out a new feature of Google's webmail ('Gmail') that allows you to read your email offline.

Inside Gmail, you can click on Settings then Labs then Enable Offline.

This will then prompt you to install a Firefox extension called Google Gears. The one provided this way is only for 32 bit platforms, for 64 bit Linux, I found a third-party 64-bit compiled version in the blog of Niels Peen that works on my 64 Linux laptop.

I had a nosy in my .mozilla directory and found that Google stores your email in a SQLite database. So I thought I would have a play with it in Python.

To follow along at home, set up the Offline Gmail, then type the following commands into the Python shell, which you can open with python (or if you are lucky) ipython.

To start with, you need to set the filepath of the database, have a little ls around and then swap the two instances of something below with whatever it is on your system.

PATH = ".mozilla/firefox/something.default/Google Gears for Firefox/" + \
            "mail.google.com/http_80/something@gmail.com-GoogleMail#database"

Now we can connect to the database:

import sqlite3
conn = sqlite3.connect(PATH)

Lets start by pulling out all the available tables:

tables = conn.execute('SELECT name FROM sqlite_master WHERE type = "table"')
for table in tables:
    print table

Now lets read the first message in the first thread:

messages = conn.execute('SELECT * FROM messagesFT_content')
mymessage = messages.next()
for line in mymessage:
    print line

Now lets make a dictionary of all your contacts

contacts = {}
for contact in conn.execute('SELECT * FROM Contacts'):
    contacts[contact[2]] = contact[3]

print contacts

Now lets make a dictionary of your attachments, sorted by filetype:

attachments = {}
for attachment in conn.execute('SELECT * FROM Attachments'):
    if attachments.has_key(attachment[5]):
        attachments[attachment[5]].append(attachment[3])
    else:
        attachments[attachment[5]] = [attachment[3],]

print attachments

There are lots of useful possibilities. Of course there are other easier ways to access your Gmail in Python, but this approach is useful when you might need to do something offline, e.g. on a train or plane.

If you come up with any interesting uses or code with this, please do leave a comment letting everyone know about it.

1 MG says...

i wonder... if you insert something to the database with the google gears backend update this to the main account when it gets a connection?

if so, this would be quite useful for making changes to your google account without having to make sure that you are online... hijacking the offline ability! the only downside is that the changes would only get refreshed the next time firefox is online (with the gears plugin enabled)

Posted at 12:18 a.m. on February 4, 2009


2 Jerry says...

Wow...I forsee searching gmail messages with Quicksilver/Spotlite !

Posted at 4:54 a.m. on February 5, 2009


3 Aaron says...

Hey, I just wanted to say thank you for point all this out. Now I can Python my way out of this scary Web 2.0 thing and converting to a more private e-mail server. I also have to say, in all sarcasm, thanks a lot for giving me one more diversion this semester! Seriously, though, this is going to be fun...

Posted at 12:19 a.m. on February 6, 2009


4 james says...

note that the "sqlite3" command can open database files, providing a CLI interface supporting stdin

Posted at 8:07 p.m. on April 25, 2009


What do you have to say?

Show Editing Help

About

Hello, my name is Zeth, I'll be your host here.

Command Line Warriors is about taking control of your own technology, it looks at our experiences of computing; especially using GNU/Linux, the Python programming language, the command-line and issues such as techno-ethics, best practices and whatever is cool now. If you take control of your technology then you are a Warrior too!

This site is your site too which means that you can contribute and get involved. You can leave comments using the facility provided. For me, the comments and discussions are by far the best part of the site. So please do have your say!

Latest Discussions

Cupcake

July 31, 2010
Good post! You helped me a lot with my school project! CountryField(blank = True) < (K)
Countries in Django

LeshaShampoo

July 30, 2010
it was very interesting to read commandline.org.uk I want to quote your post in my blog. It can? And you et an account on Twitter?
Email Syntax Check in Python

vemma2018

July 30, 2010
I find myself coming to your blog more and more often to the point where my visits are almost daily now!
On Comment Spam

layecenda

July 30, 2010
Hello. And Bye.test :) http://idfjhvihdfiphvlajbvhalibv.com
PuTTY Series: Adding PuTTY to your system path

scuba

July 30, 2010
I’ve been visiting your blog for a while now and I always find a gem in your new posts. Thanks for sharing.
On Comment Spam

Businesking

July 30, 2010
Great site and articles for hack for win, I said Amazing post
How not to program WSGI

Tehnoking

July 30, 2010
This is Great post to learn about the hack Thumbs-up for you :D
How not to program WSGI

Syabiltech

July 30, 2010
I think this articles for master...because very hard to learning, As blogger beginners like me.
How not to program WSGI

coffeeatea

July 30, 2010
Are you looking for coffee gifts? We can tell you more about the coffee gifts including coffee machines and coffee pods.
Introducing Soturi - yet another Django blog application

noni juice

July 30, 2010
I just sent this post to a bunch of my friends as I agree with most of what you’re saying here and the way you’ve presented it is awesome.
On Comment Spam

Dion Moult

July 29, 2010
What I do know is that ever since I tried out Opera and put their tab bar on the left as a column, I've loved that layout. Back on Firefox ...
We need a thoughout integration of the desktop and the web - not Tab Candy superfast jellyfish

ZonaEntertainment

July 29, 2010
Wow useful articles, I'm read to learn about this and now I bookmark this to my Facebook, thanks for share!
How not to program WSGI

Giacomo

July 29, 2010
Honestly, I think both Mozilla and you are wrong :) This sort of concept adds overhead. A user would have to manage all this crap, constantly dragging and dropping, creating ...
We need a thoughout integration of the desktop and the web - not Tab Candy superfast jellyfish

Matija "hook" Šuklje

July 29, 2010
As a minimalist, you'll probybly moan if I mention KDE, but I'll do so anyway ;) The future I want (and actually see slowly fold out before me) is to ...
We need a thoughout integration of the desktop and the web - not Tab Candy superfast jellyfish

tahitian noni

July 28, 2010
Thank You For This Blog, was added to my bookmarks.
On Comment Spam

Rick

July 28, 2010
I already have piles. It's called A New Window.
We need a thoughout integration of the desktop and the web - not Tab Candy superfast jellyfish

Tech News

July 25, 2010
Thanks for this short tutorial...was auto-FTPing my files from my appserver to webserver for my tech news website. Everything was OK until someone hacked it. Hosting provider is now recommending ...
SFTP in Python: Really Simple SSH

naypalm

July 24, 2010
During the past 3-4 years, I and many others have enjoyed unlimited 2G/3G internet. But ever since the massive cult-like following of i Phone users in the US, most cellular ...
Calling time on mobile internet nonsense?

Steve

July 15, 2010
Very occasionally, you will run into a Java program that uses a lot of memory just to hold all the classes used. It turns out that the JVM uses a ...
Three classic command line tips

no

July 14, 2010
1. number one 2. number two 4. number four 3. number three 6. number six # first # second ## second-ay ## second-bee ### second-bee-one ### second-bee-two
An Introduction to ReStructuredText