Question: I'm running the quickstart code from https://developers.google.com/people/quickstart/python in a colab notebook. # \[START people_quickstart\] from __future__ import print_function import os.path from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build from googleapiclient.errors import HttpError # If modifying these scopes, delete the file token.json. SCOPES = \['https://www.googleapis.com/auth/contacts.readonly'\] def main(): """Shows basic usage of the People API. Prints the name of the first 10 connections. """ creds = None \# The file token.json 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.json'): creds = Credentials.from_authorized_user_file('token.json', SCOPES) \# 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.json', 'w') as token: token.write(creds.to_json()) try: service = build('people', 'v1', credentials=creds) # Call the People API print('List 10 connection names') results = service.people().connections().list( resourceName='people/me', pageSize=10, personFields='names,emailAddresses').execute() connections = results.get('connections', []) for person in connections: names = person.get('names', []) if names: name = names[0].get('displayName') print(name) except HttpError as err: print(err) if __name__ == '__main__': main() # \[END people_quickstart\]  but it fails the authentication at this stage:  http://localhost:52591/?state=K8nzFjxOrWJkPEqjeG1AZiGpsT5DSx&code=4/0ARtbsJoAH2rD9UYgHOKJ__UdJcq87d2vuFjEAqcI3aKJpj1rLJ-93TXR0_v-LnBR4Fytsg&scope=https://www.googleapis.com/auth/gmail.readonly  why is it redirected to localhost? There is a simple way to send e-mail at google colab? with or without using gmail? i'm using the google colab at opera browser. Can anyone help me how i can send a simple e-mail at google colab without lowing the gmail security level? T.T

Answer: today I came across the same problem and the way I found to fix it was running the code in a Jupyter Notebook and then saving the token it was generated there and uploading it to colab. I ran the code bellow and then a json file named 'token' was generated in the folder where my notebook is located: import os.path import google.auth.exceptions from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build from googleapiclient.errors import HttpError SCOPES = ["https://www.googleapis.com/auth/gmail.send"] creds = None if os.path.exists('token.json'): try: creds = Credentials.from_authorized_user_file('token.json', SCOPES) creds.refresh(Request()) except google.auth.exceptions.RefreshError as error: # if refresh token fails, reset creds to none. creds = None print(f'An error occurred: {error}') # 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) InstalledAppFlow.from_client_secrets_file('credentials_web.json', SCOPES) creds = flow.run_local_server(port=0) with open('token.json', 'w') as token: token.write(creds.to_json())  When this is over just run the same code in colab and make sure you updated the token to the environment and thats it. Not simple, but it works