Connecting to Gmail API with Python

Google API Gmail LINE Notifications (7 Part Series)

1 Connecting to Gmail API with Python
2 Managing your Labels in Gmail
3 more parts…
3 Searching for and Getting Emails
4 Processing Email Contents
5 Processing Email – Being Selective
6 Processing Email – Single Script / Multiple Emails
7 Automation with Systemd & Code

This will be a series of articles on implementing a notification system using Gmail and Line Bot

The goal here is to be able to query gmail for a select set of emails. Process them and then send a notification. This could be altered to work with a Bot of some other service.

So let’s get started. I am going to take a short cut here because I believe that if there is already a good guide; then you shouldn’t rehash what has been done before. Unless you are adding to it. So I would suggest following one of the guides below and then move on to step two when you are ready.

Getting started with Python and Gmail API. Head over to
Python Quick Start or my prefered option A Beginner’s Guide to the Gmail API and Its Documentation which I found to be well presented and informative.

It boils down to, enabling the API, installing the required modules, and copying the provided code. Don’t forget to download the credentials file you will be given by Google.

Note: I am going to be using python 3

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

Enter fullscreen mode Exit fullscreen mode

Add the folowing code to a file, lets just call it gmail.py

Note: I have removed the following

from __future__ import print_function
from __future__ import print_function
from __future__ import print_function

Enter fullscreen mode Exit fullscreen mode

Please keep this if you are using Python 2

<span>import</span> <span>pickle</span>
<span>import</span> <span>os.path</span>
<span>from</span> <span>googleapiclient.discovery</span> <span>import</span> <span>build</span>
<span>from</span> <span>google_auth_oauthlib.flow</span> <span>import</span> <span>InstalledAppFlow</span>
<span>from</span> <span>google.auth.transport.requests</span> <span>import</span> <span>Request</span>
<span># If modifying these scopes, delete the file token.pickle. </span><span>SCOPES</span> <span>=</span> <span>[</span><span>'https://www.googleapis.com/auth/gmail.readonly'</span><span>]</span>
<span>def</span> <span>main</span><span>():</span>
<span>"""Shows basic usage of the Gmail API. Lists the user's Gmail labels. """</span>
<span>creds</span> <span>=</span> <span>None</span>
<span># The file token.pickle stores the user's access and refresh tokens, and is </span> <span># created automatically when the authorization flow completes for the first </span> <span># time. </span> <span>if</span> <span>os</span><span>.</span><span>path</span><span>.</span><span>exists</span><span>(</span><span>'token.pickle'</span><span>):</span>
<span>with</span> <span>open</span><span>(</span><span>'token.pickle'</span><span>,</span> <span>'rb'</span><span>)</span> <span>as</span> <span>token</span><span>:</span>
<span>creds</span> <span>=</span> <span>pickle</span><span>.</span><span>load</span><span>(</span><span>token</span><span>)</span>
<span># If there are no (valid) credentials available, let the user log in. </span> <span>if</span> <span>not</span> <span>creds</span> <span>or</span> <span>not</span> <span>creds</span><span>.</span><span>valid</span><span>:</span>
<span>if</span> <span>creds</span> <span>and</span> <span>creds</span><span>.</span><span>expired</span> <span>and</span> <span>creds</span><span>.</span><span>refresh_token</span><span>:</span>
<span>creds</span><span>.</span><span>refresh</span><span>(</span><span>Request</span><span>())</span>
<span>else</span><span>:</span>
<span>flow</span> <span>=</span> <span>InstalledAppFlow</span><span>.</span><span>from_client_secrets_file</span><span>(</span>
<span>'credentials.json'</span><span>,</span> <span>SCOPES</span><span>)</span>
<span>creds</span> <span>=</span> <span>flow</span><span>.</span><span>run_local_server</span><span>(</span><span>port</span><span>=</span><span>0</span><span>)</span>
<span># Save the credentials for the next run </span> <span>with</span> <span>open</span><span>(</span><span>'token.pickle'</span><span>,</span> <span>'wb'</span><span>)</span> <span>as</span> <span>token</span><span>:</span>
<span>pickle</span><span>.</span><span>dump</span><span>(</span><span>creds</span><span>,</span> <span>token</span><span>)</span>
<span>service</span> <span>=</span> <span>build</span><span>(</span><span>'gmail'</span><span>,</span> <span>'v1'</span><span>,</span> <span>credentials</span><span>=</span><span>creds</span><span>)</span>
<span># Call the Gmail API </span> <span>results</span> <span>=</span> <span>service</span><span>.</span><span>users</span><span>().</span><span>labels</span><span>().</span><span>list</span><span>(</span><span>userId</span><span>=</span><span>'me'</span><span>).</span><span>execute</span><span>()</span>
<span>labels</span> <span>=</span> <span>results</span><span>.</span><span>get</span><span>(</span><span>'labels'</span><span>,</span> <span>[])</span>
<span>if</span> <span>not</span> <span>labels</span><span>:</span>
<span>print</span><span>(</span><span>'No labels found.'</span><span>)</span>
<span>else</span><span>:</span>
<span>print</span><span>(</span><span>'Labels:'</span><span>)</span>
<span>for</span> <span>label</span> <span>in</span> <span>labels</span><span>:</span>
<span>print</span><span>(</span><span>label</span><span>[</span><span>'name'</span><span>])</span>
<span>if</span> <span>__name__</span> <span>==</span> <span>'__main__'</span><span>:</span>
<span>main</span><span>()</span>
<span>import</span> <span>pickle</span>
<span>import</span> <span>os.path</span>
<span>from</span> <span>googleapiclient.discovery</span> <span>import</span> <span>build</span>
<span>from</span> <span>google_auth_oauthlib.flow</span> <span>import</span> <span>InstalledAppFlow</span>
<span>from</span> <span>google.auth.transport.requests</span> <span>import</span> <span>Request</span>

<span># If modifying these scopes, delete the file token.pickle. </span><span>SCOPES</span> <span>=</span> <span>[</span><span>'https://www.googleapis.com/auth/gmail.readonly'</span><span>]</span>

<span>def</span> <span>main</span><span>():</span>
    <span>"""Shows basic usage of the Gmail API. Lists the user's Gmail labels. """</span>
    <span>creds</span> <span>=</span> <span>None</span>
    <span># The file token.pickle stores the user's access and refresh tokens, and is </span>    <span># created automatically when the authorization flow completes for the first </span>    <span># time. </span>    <span>if</span> <span>os</span><span>.</span><span>path</span><span>.</span><span>exists</span><span>(</span><span>'token.pickle'</span><span>):</span>
        <span>with</span> <span>open</span><span>(</span><span>'token.pickle'</span><span>,</span> <span>'rb'</span><span>)</span> <span>as</span> <span>token</span><span>:</span>
            <span>creds</span> <span>=</span> <span>pickle</span><span>.</span><span>load</span><span>(</span><span>token</span><span>)</span>
    <span># If there are no (valid) credentials available, let the user log in. </span>    <span>if</span> <span>not</span> <span>creds</span> <span>or</span> <span>not</span> <span>creds</span><span>.</span><span>valid</span><span>:</span>
        <span>if</span> <span>creds</span> <span>and</span> <span>creds</span><span>.</span><span>expired</span> <span>and</span> <span>creds</span><span>.</span><span>refresh_token</span><span>:</span>
            <span>creds</span><span>.</span><span>refresh</span><span>(</span><span>Request</span><span>())</span>
        <span>else</span><span>:</span>
            <span>flow</span> <span>=</span> <span>InstalledAppFlow</span><span>.</span><span>from_client_secrets_file</span><span>(</span>
                <span>'credentials.json'</span><span>,</span> <span>SCOPES</span><span>)</span>
            <span>creds</span> <span>=</span> <span>flow</span><span>.</span><span>run_local_server</span><span>(</span><span>port</span><span>=</span><span>0</span><span>)</span>
        <span># Save the credentials for the next run </span>        <span>with</span> <span>open</span><span>(</span><span>'token.pickle'</span><span>,</span> <span>'wb'</span><span>)</span> <span>as</span> <span>token</span><span>:</span>
            <span>pickle</span><span>.</span><span>dump</span><span>(</span><span>creds</span><span>,</span> <span>token</span><span>)</span>

    <span>service</span> <span>=</span> <span>build</span><span>(</span><span>'gmail'</span><span>,</span> <span>'v1'</span><span>,</span> <span>credentials</span><span>=</span><span>creds</span><span>)</span>

    <span># Call the Gmail API </span>    <span>results</span> <span>=</span> <span>service</span><span>.</span><span>users</span><span>().</span><span>labels</span><span>().</span><span>list</span><span>(</span><span>userId</span><span>=</span><span>'me'</span><span>).</span><span>execute</span><span>()</span>
    <span>labels</span> <span>=</span> <span>results</span><span>.</span><span>get</span><span>(</span><span>'labels'</span><span>,</span> <span>[])</span>

    <span>if</span> <span>not</span> <span>labels</span><span>:</span>
        <span>print</span><span>(</span><span>'No labels found.'</span><span>)</span>
    <span>else</span><span>:</span>
        <span>print</span><span>(</span><span>'Labels:'</span><span>)</span>
        <span>for</span> <span>label</span> <span>in</span> <span>labels</span><span>:</span>
            <span>print</span><span>(</span><span>label</span><span>[</span><span>'name'</span><span>])</span>

<span>if</span> <span>__name__</span> <span>==</span> <span>'__main__'</span><span>:</span>
    <span>main</span><span>()</span>
import pickle import os.path from googleapiclient.discovery import build from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request # If modifying these scopes, delete the file token.pickle. SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'] def main(): """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: creds.refresh(Request()) else: 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) # Call the Gmail API results = service.users().labels().list(userId='me').execute() labels = results.get('labels', []) if not labels: print('No labels found.') else: print('Labels:') for label in labels: print(label['name']) if __name__ == '__main__': main()

Enter fullscreen mode Exit fullscreen mode

A note on the sign in process. This may not work if you are using safari, so use Brave or some other browser if needed. You can copy and paste the link generated in your terminal for this.

When you are done. You can move on to the next article in the series.

Google API Gmail LINE Notifications (7 Part Series)

1 Connecting to Gmail API with Python
2 Managing your Labels in Gmail
3 more parts…
3 Searching for and Getting Emails
4 Processing Email Contents
5 Processing Email – Being Selective
6 Processing Email – Single Script / Multiple Emails
7 Automation with Systemd & Code

原文链接:Connecting to Gmail API with Python

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
May you live like a child forever.
愿你永远活的像个孩子
评论 抢沙发

请登录后发表评论

    暂无评论内容