Raspberry Pi Lab

Tag: email

GMail Notify

by on Jan.03, 2014, under Code, Projects

gmail-plus-raspberryThe idea of today’s project is to make an Gmail Notify program for the RPi.  I started with the idea for this program from the AdaFruit tutorial site, but I have made some significant changes to their code to make it do more of what I thought would be useful.

I used the same circuit I built for the Three LED Blink program I built in my previous post.  That circuit used a blue LED.  This program doesn’t use the blue LED, but since it is on the circuit, I went ahead and set up the pin on the GPIO and insured that it was, in fact, turned off.

Before building this project. I added these three lines to my python setup.

sudo pip install feedparser
sudo easy_install -U distribute
sudo pip install RPi.GPIO

The ‘feedparser’ line is specific to the needs for this program.  However, I believe the other two lines should be added to my RPi GPIO setup script.  I have NOT added them to the script – yet.  So I executed them before starting this project.

The idea of this program is simple.  When the program starts assume that I already know I have messages that are unread and just go ahead and set the alert status to “all clear.”  The fact is, I have – quite letterally – thousands of unread messages.  So if I were to set the “alert condition” If I have any unread messages would be pretty counter productive.

The “all clear” condition sets the green LED to a solid on state.  The “alert status” condition sets the red LED to a blinking state.  This lighting scheme is based on alert vs all clear.  If a stop light makes more sense to you, then you might want to reverse the colors.  Make it what works for you.

With that said, here is the code…

#!/usr/bin/env python

# Script:   r00t   root@bjbranson.com
# v1.0      2 January 2014

# GMail Atom RSS Feed: http://email.about.com/od/gmailtips/qt/et081005.htm
# Feedparser Docs: http://pythonhosted.org/feedparser/

# GMail and Google Apps use the same URL for the RSS Feed:
# Use your full email address as the username to distinguish
# that you are using Google Apps.

# I have thousands of unread messages so I want the program
# to start with the assumption of "no new messages" then alert
# me when additional new mail arrives.

import RPi.GPIO as GPIO
import feedparser
import time
 
DEBUG = 0                 # turn debug mode on or off
USER = "youruserid"       # if gmail just userid before the @; if apps use full email address
PASS = "yourpassword"
BASE_OFFSET = 0           # How many more than inital count will trigger alert
MAIL_CHECK_FREQ = 10      # check mail every X seconds
 
def get_new_messages ():
   feed = feedparser.parse(imapurl)
   newmails=int(feed["feed"]["fullcount"])
   return newmails   

GPIO.setmode(GPIO.BCM)
GREEN_LED = 24
RED_LED = 25
BLUE_LED = 18                   # Blue LED not used, but is wired
GPIO.setup(GREEN_LED, GPIO.OUT)
GPIO.setup(RED_LED, GPIO.OUT)
GPIO.setup(BLUE_LED, GPIO.OUT)

GPIO.output(RED_LED, False)     # Used as alert
GPIO.output(BLUE_LED, False)    # Not used but make sure it is turned off 
GPIO.output(GREEN_LED, False)   # Used to indicate "no attention needed"

imapurl = "https://"+USER+":"+PASS+"@mail.google.com/gmail/feed/atom" 
if DEBUG:
   print imapurl

initial_count = get_new_messages()
offset = BASE_OFFSET + initial_count

while True:

   newmails = get_new_messages()
 
   if DEBUG:
      print "You have", newmails, "new emails!"
 
   if newmails > offset:
      GPIO.output(GREEN_LED, False)  # Set alert condition.
      GPIO.output(RED_LED, True)     # Red LED on and Green LED off.
      blinks = MAIL_CHECK_FREQ
      while (blinks > 0):
         blinks = blinks - 1
         GPIO.output(RED_LED, True)  # Program is intended to check messages every
         time.sleep(0.5)             # MAIL_CHECK_FREQ seconds. Therefore, the blink
         GPIO.output(RED_LED, False) # rate can not take more than one second per cycle.
         time.sleep(0.5)             # So be on 1/2 second and off 1/2 second.
         if DEBUG:
            print ("Blinks Remaining is %s." % (BLINKS))
   else:
      GPIO.output(GREEN_LED, True)   # NO alert
      GPIO.output(RED_LED, False)    # Green on; Red off
      time.sleep(MAIL_CHECK_FREQ)    # Since we are NOT blinking we can just sleep
                

 

Leave a Comment :, , , more...

Archives

All entries, chronologically...

Our Partners

Please take a minute to visit our partners

Looking for something?

Search the Site

If you can't find what you are looking for, please leave a comment somewhere, subscribe to our feed and hopefully your question will be answered shortly, so please visit again!