In this Python tutorial, we will learn how to send an email using Google Gmail API service.
Using Gmail API, we can Read and send messages, manage drafts and attachments, search threads and messages, work with labels, setup push notifications, and manage Gmail settings, all in one place.
Step 1. Enable Gmail API service
- Log in to your Google Cloud Platform,
- Select your project
- Enable Gmail API service
Step 2. Install Python Library
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
Send an email
Before we are starting writing the script, few things to consider.
1. Maximum file size is 35MB
2. Accepted Media MIME type is message/rfc822
3. The special value “me” can be used to indicate the authenticated user.
References
- Gmail Scopes (https://developers.google.com/gmail/api/auth/scopes)
- Email Mime (https://docs.python.org/3/library/email.mime.html)
Buy Me a Coffee? Your support is much appreciated!
PayPal Me: https://www.paypal.me/jiejenn/5
Venmo: @Jie-Jenn
Source Code
from Google import Create_Service
import base64
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
CLIENT_SECRET_FILE = 'client_secret.json'
API_NAME = 'gmail'
API_VERSION = 'v1'
SCOPES = ['https://mail.google.com/']
service = Create_Service(CLIENT_SECRET_FILE, API_NAME, API_VERSION, SCOPES)
emailMsg = 'You won $100,000'
mimeMessage = MIMEMultipart()
mimeMessage['to'] = '<Receipient>@gmail.com'
mimeMessage['subject'] = 'You won'
mimeMessage.attach(MIMEText(emailMsg, 'plain'))
raw_string = base64.urlsafe_b64encode(mimeMessage.as_bytes()).decode()
message = service.users().messages().send(userId='me', body={'raw': raw_string}).execute()
print(message)
Google.py
import pickle
import os
from google_auth_oauthlib.flow import Flow, InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload, MediaIoBaseDownload
from google.auth.transport.requests import Request
def Create_Service(client_secret_file, api_name, api_version, *scopes):
print(client_secret_file, api_name, api_version, scopes, sep='-')
CLIENT_SECRET_FILE = client_secret_file
API_SERVICE_NAME = api_name
API_VERSION = api_version
SCOPES = [scope for scope in scopes[0]]
print(SCOPES)
cred = None
pickle_file = f'token_{API_SERVICE_NAME}_{API_VERSION}.pickle'
# print(pickle_file)
if os.path.exists(pickle_file):
with open(pickle_file, 'rb') as token:
cred = pickle.load(token)
if not cred or not cred.valid:
if cred and cred.expired and cred.refresh_token:
cred.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET_FILE, SCOPES)
cred = flow.run_local_server()
with open(pickle_file, 'wb') as token:
pickle.dump(cred, token)
try:
service = build(API_SERVICE_NAME, API_VERSION, credentials=cred)
print(API_SERVICE_NAME, 'service created successfully')
return service
except Exception as e:
print('Unable to connect.')
print(e)
return None
def convert_to_RFC_datetime(year=1900, month=1, day=1, hour=0, minute=0):
dt = datetime.datetime(year, month, day, hour, minute, 0).isoformat() + 'Z'
return dt
Great video, very informative. Thanks
Thanks your code is a gold mine for beginners and I mean it. Thanks for the help.
Is there a way to do it standalone without copying link and finally never worked for me even if I put my ip server!?
Hello, is there a way to add multiple recipients? to send the same email to multiple addresses. thanks
To add another email address, simply join them with a semicolon. For example, “user1@abc.com;user2@aaa.com”.
this error as well when tries to load build from discovery. ModuleNotFoundError: No module named ‘dicovery’
Have you install Google Python client library?
pip install –upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
It also says ERROR: google-api-python-client has an invalid wheel, WHEEL is missing Wheel-Version
I can’t believe it is that simple! I think I have waded through 8 tutorials, a dozen Stackoverflow threads and a mind numbing maze of Googe API docs.
I suspect this simple script would have failed too If I had not tripped over every mistake one can make: IDLE running with 3.7 while my PowerShell was seeing 3.9, google examples that have not been updated since the days of python 2….so many things you don’t mention have to go right but when they do, this simple code is all it takes to send email. The google email api documents had a “quickstart” example which was complete and ran…so I assumed I was on my way but nope! two days later I was still looking for the minimum of imports that suffice to do a send mail. And here it is. Thank you.
Any way to make the api stop formatting the text as it wants, after about 150chars it newlines. Pretty annoying! Ps. Great tutorial