Steven Hepting
Steven Hepting

Reputation: 12504

Check unread count of Gmail messages with Python

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.

Upvotes: 34

Views: 30069

Answers (8)

miksus
miksus

Reputation: 3417

I didn't like the existing solutions so I decided to make a sister library for my email sender called Red Box.

It has a pre-configured gmail instance:

from redbox import gmail

# Configure Gmail
gmail.username = "[email protected]"
gmail.password = "<PASSWORD>"

# Select inbox folder
inbox = gmail.inbox

# Get unread emails
msgs_unread = inbox.search(seen=False)

# Print unread count
print(len(msgs_unread))

Red Box fetches the email contents only when needed. The above does not do that as we didn't access the contents of these messages. You can also easily access various parts of the messages if you need.

I also wrote how to configure Gmail's app password here:

To install:

pip install redbox

Links:

Upvotes: 0

Nadia Alramli
Nadia Alramli

Reputation: 114933

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

Upvotes: 25

PaulF
PaulF

Reputation: 79

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)

Upvotes: 7

Avadhesh
Avadhesh

Reputation: 4703

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

Upvotes: 56

Matthew Flaschen
Matthew Flaschen

Reputation: 284786

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.

Upvotes: 25

Unknown
Unknown

Reputation: 46773

Once you are logged in (do this manually or with gmail.py) you should use the feed.

It is located here: http://mail.google.com/mail/feed/atom

It is the way Google does it. Here is a link to their js chrome extension: http://dev.chromium.org/developers/design-documents/extensions/samples/gmail.zip

You will then be able to parse xml that looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#">
<title>Gmail - Inbox for [email protected]</title>
<tagline>New messages in your Gmail Inbox</tagline>
<fullcount>142</fullcount>

Upvotes: 1

ahawker
ahawker

Reputation: 3364

Use Gmail.py

file = open("filename","r")
usr = file.readline()
pwd = file.readline()
gmail = GmailClient()
gmail.login(usr, pwd)
unreadMail = gmail.get_inbox_conversations(is_unread=True)
print unreadMail

Gets login information from a text file assuming the login name and password are on separate lines.

Upvotes: -1

cletus
cletus

Reputation: 625037

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

Upvotes: 6

Related Questions