Check unread count of Gmail messages with Python

29,008

Solution 1

import imaplib
obj = imaplib.IMAP4_SSL('imap.gmail.com','993')
obj.login('username','password')
obj.select()
obj.search(None,'UnSeen')

Solution 2

Well, I'm going to go ahead and spell out an imaplib solution as Cletus suggested. I don't see why people feel the need to use gmail.py or Atom for this. This kind of thing is what IMAP was designed for. Gmail.py is particularly egregious as it actually parses Gmail's HTML. That may be necessary for some things, but not to get a message count!

import imaplib, re
conn = imaplib.IMAP4_SSL("imap.gmail.com", 993)
conn.login(username, password)
unreadCount = re.search("UNSEEN (\d+)", conn.status("INBOX", "(UNSEEN)")[1][0]).group(1)

Pre-compiling the regex may improve performance slightly.

Solution 3

I advise you to use Gmail atom feed

It is as simple as this:

import urllib

url = 'https://mail.google.com/mail/feed/atom/'
opener = urllib.FancyURLopener()
f = opener.open(url)
feed = f.read()

You can then use the feed parse function in this nice article: Check Gmail the pythonic way

Solution 4

For a complete implementation of reading the value from the atom feed:

import urllib2
import base64
from xml.dom.minidom import parse

def gmail_unread_count(user, password):
    """
        Takes a Gmail user name and password and returns the unread
        messages count as an integer.
    """
    # Build the authentication string
    b64auth = base64.encodestring("%s:%s" % (user, password))
    auth = "Basic " + b64auth

    # Build the request
    req = urllib2.Request("https://mail.google.com/mail/feed/atom/")
    req.add_header("Authorization", auth)
    handle = urllib2.urlopen(req)

    # Build an XML dom tree of the feed
    dom = parse(handle)
    handle.close()

    # Get the "fullcount" xml object
    count_obj = dom.getElementsByTagName("fullcount")[0]
    # get its text and convert it to an integer
    return int(count_obj.firstChild.wholeText)

Solution 5

Well it isn't a code snippet but I imagine using imaplib and the Gmail IMAP instructions get you most of the way there.

Share:
29,008
Steven Hepting
Author by

Steven Hepting

iOS on TwitterKit on the Fabric team.

Updated on April 07, 2020

Comments

  • Steven Hepting
    Steven Hepting about 4 years

    How can I check the number of unread Gmail message in my inbox with a short Python script? Bonus points for retrieving the password from a file.

  • Nadia Alramli
    Nadia Alramli almost 15 years
    I checked the module source, what it does it open gmail in html mode and parse the page. This is bad! holovaty.com/code/gmail.py
  • Matthew Flaschen
    Matthew Flaschen almost 15 years
    What's so bad about IMAP? Note that this snippet is not complete, despite the "simple as this".
  • Matthew Flaschen
    Matthew Flaschen almost 15 years
    Also note that this solution will prompt the user for username, password on the TTY. However, you can subclass the opener to handle this.
  • Tom
    Tom almost 15 years
    While I happen to agree IMAP is the way to go here, there are some portability issues that could occur. Since the other methods are using HTTP connections, they could conceivably work when IMAP wouldn't (in restrictive environments like Google App Engine or on networks where non-HTTP traffic is restricted).
  • Matthew Flaschen
    Matthew Flaschen almost 15 years
    Tom, that's true. But the OP didn't say they were dealing with those limitations, so we should not invent them prematurely.
  • Steven Hepting
    Steven Hepting over 13 years
    I really like this solution. Generally clean with only one import. To get the number you'd just: len(obj.search(None, 'UnSeen')[1][0].split())
  • gennad
    gennad about 13 years
    It always returns unauthorized for me File "/opt/python2.7/lib/python2.7/urllib.py", line 379, in http_error_default raise IOError, ('http error', errcode, errmsg, headers) IOError: ('http error', 401, 'Unauthorized', <httplib.HTTPMessage instance at 0x126cc68>)
  • DataGreed
    DataGreed over 11 years
    can I get message bodies and subjects with this solution?
  • Samuel Lampa
    Samuel Lampa over 11 years
    @DataGreed: With the search, you get only the mail id's, but you can then use that with "obj.fetch(..." to get the mails you want. See this link for example of how to do that: yuji.wordpress.com/2011/06/22/…
  • Olli
    Olli almost 11 years
    That gmail.py (fortunately) do not exist anymore.
  • Bunyk
    Bunyk over 5 years
    Using this I got notification that someone just used my password to try to log in using unsecure app, with link to this doc: support.google.com/accounts/answer/…
  • nurettin
    nurettin over 3 years
    For those who are curious about connecting to gmail using imaplib, google will periodically disable 3rd party access and you will have to manually enable it. Better to create an app and use the gmail api instead.
  • Ruslan
    Ruslan almost 2 years
    Since June 2022 IMAP access no longer works.