Skip to content
Related Articles

Related Articles

Improve Article
Save Article
Like Article

How to make a voice assistant for E-mail in Python?

  • Last Updated : 05 Apr, 2021

As we know, emails are very important for communication as each professional communication can be done by emails and the best service for sending and receiving mails is as we all know GMAIL. Gmail is a free email service developed by Google. Users can access Gmail on the web and using third-party programs that synchronize email content through POP or IMAP protocols. 

To connect Gmail with Voice Assistant we have to use Gmail API. In this article, we will see how to send and check emails by giving voice commands. The Gmail API lets you view and manage Gmail mailbox data like threads, messages, and labels. More information about Gmail API can be found here- Gmail API.


  • Python(3 or greater)
  • A Gmail Account
  • Google API Client
  • pyttsx3 module
  • speech_recognition module


Install the libraries by running the following commands:

pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib

Run this or pyttsx3:

pip install pyttsx3

Run this for speech recognition:

pip install SpeechRecognition

Now there is a need to set up a Google Cloud console to interact with the Gmail API. This can be done very easily. You can find information on how to set up a Google cloud console.

After setting up the Google Cloud console, we just need to make an approach for building a voice assistant to speak up emails.


  • Import required modules.
  • Create the below functions:
    • speak( ): This function will help our assistant to speak up.
    • get_audio( ): This function will help the assistant to get the input by the user.
    • check_mails( ): This function is used to check unread emails in the primary section of the inbox.
  • Call the above-created function.

Below is the implementation in Python.


from __future__ import print_function
import datetime
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import os
import pyttsx3
import speech_recognition as sr
from datetime import date
# If modifying these scopes, delete the file token.pickle .
# if you run this for the firs
# t time it will take you to gmail to choose your account
def speak(text):
    voices = engine.getProperty('voices')
    engine.setProperty('voice', voices[1].id)
    rate = engine.getProperty('rate')
    engine.setProperty('rate', rate-20)
speak("Welcome to mail service")
def get_audio():
    with sr.Microphone() as source:
        r.pause_threshold = 1
        r.adjust_for_ambient_noise(source, duration=1)
        speak("Didn't get that")
    return said.lower()
def authenticate_gmail():
    """Shows basic usage of the Gmail API.
    Lists the user's Gmail labels.
    creds = None
    # The file token.pickle stores the user's 
    # access and refresh tokens, and is
    # created automatically when the authorization 
    # flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available,
    # let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port = 0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
    service = build('gmail', 'v1', credentials=creds)
    return service
def check_mails(service):
    # fetching emails of today's date
    today = (  
    today_main = today.strftime('%Y/%m/%d')
    # Call the Gmail API
    results = service.users().messages().list(userId = 'me',
                                              q="after:{0} and category:Primary".format(today_main)).execute()
    # The above code will get emails from primary 
    # inbox which are unread
    messages = results.get('messages',[])
    if not messages:
        # if no new emails
        print('No messages found.')   
        speak('No messages found.')
        # if email found
        speak("{} new emails found".format(len(messages)))  
        speak("if you want to read any particular email just type read ")
        speak("and for not reading type leave ")
        for message in messages:
                                               id = message['id'], format = 'metadata').execute() 
            for add in msg['payload']['headers']:
                if add['name']=="From":
                    # fetching sender's email name
                    speak("email from"+a)
                    if text == "read":  
                        # speak up the mail
                        speak("email passed")


My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!