In the last post, we talked about how to teach your Google Home device (or Google Assistant on your Android phone) to send emails.

But that itself is not too interesting (unless you really enjoy spamming yourself). What would be more useful is if you create a program to read and act on the emails automatically. Because, then, you have the ingredients for building your own Virtual Assistant.

The simplest (and cheapest way) I found to do this is using Google App Engine. It has a generous daily free quota. For all my home automation projects, I haven’t run above the free limit.

Start by following the “hello world” instructions to make your first web app: https://cloud.google.com/appengine/docs/standard/python/quickstart

Then, add the files/code below to enhance your web app to handle emails. (Note: the code I provided below is an example of how I use email to control my home sprinkler system. This lets me say “Turn on sprinkler 1” to my Google Home Mini, which triggers IFTTT to send an email to my web app, which reads the email and triggers my home sprinkler system to turn on zone 1.)

app.yaml:

application: your_appengine_application_name
version: 1-0
runtime: python27
api_version: 1
threadsafe: true
  
default_expiration: "30m"

handlers:
- url: /_ah/mail/.+
  script: receive_mail.app
  login: admin

inbound_services: 
- mail

receive_mail.py:

from handlers_mail import *  
import webapp2
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler
      
app = webapp2.WSGIApplication([ReceiveMail.mapping()], debug=True)

handlers_mail.py:

import logging
import webapp2
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler

class ReceiveMail(InboundMailHandler):
  def receive(self, message):
    tos = message.to.split(',')
    for to in tos:
      logging.info("received mail from %s %s %s" \
        % (message.sender, to, message.subject))
      if 'sprinkler' in to:
        handleSprinklerEmail(message)

def handleSprinklerEmail(message):
  if 'your@email.com' not in message.sender:
    # sender unknown - ignore this message
    return

  logging.info("sprinkler email request from %s %s" \
    % (message.sender, message.subject))

  # process email to get body
  bodies = message.bodies('text/plain')
  bodyText = ''
  for ctype, body in bodies:
    lastLine = [i for i in body.decode().split('\n') if i][-1]
    bodyText = lastLine
    break

  # you can now decide what to do based on:
  #   message.subject
  #   bodyText

After you set up the above, you can send emails to your Google App Engine web app using its special address: this_can_be_anything@your_appengine_application_name.appspotmail.com

Now that you have a web app, there’s much more you can do beyond handling emails. It opens up a couple more opportunities for your home automation. E.g.:

Give it a go. I think the code I gave you above should work. If I missed something, please let me know at aaron@secretsciencelab.com. Happy hacking!