Skip to content

Instantly share code, notes, and snippets.

@aleshkashell
Forked from timrichardson/gmail_signatures.py
Created November 16, 2017 14:17
Show Gist options
  • Save aleshkashell/3d409a1e801d4c8312fa2da3001b1aae to your computer and use it in GitHub Desktop.
Save aleshkashell/3d409a1e801d4c8312fa2da3001b1aae to your computer and use it in GitHub Desktop.
Use Python, OAuth2 and Google APIs to mass-update gmail signatures of a Google Apps for Work domain. Using a google service account for the credential.
# python 2.7
""" Read data from a spreadsheet to construct an HTML signature, and update users.
This is enough code to get you going.
You have a service account via a project setup on the Google Developer console.
Download the key in json format.
Next you need to go to the domain's Google admin to enable the correct google API.
The scope is API_scopes =['https://apps-apis.google.com/a/feeds/emailsettings/2.0/']
In more detail:
1. Follow the oauth2 notes to make a service account and download a JSON private key as usual. You do that on the developer console. The service account is not linked to any domain, it is just a credential.
2. In your google apps domain, go the security, advanced, api etc etc.
Steps 1 & 2 are currently documented here: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority
"""
from __future__ import print_function
import pandas as pd
import httplib2
from oauth2client.service_account import ServiceAccountCredentials
import gdata.apps.emailsettings.client
import gdata.gauth
import ssl
from string import Template
excelfile = "email_list.xlsx"
# build a signature
sig_template = Template("""
<html>
<head>
<meta charset="UTF-8">
<title>Email Signature</title>
</head>
<body style="margin:0px; padding:0px;">
...
</body>
</html>
""")
def update_sig(full_name,job_title,telephone,username,sig_template,gmail_client=None):
sig = sig_template.substitute(full_name = full_name,job_title=job_title,
telephone=telephone)
if gmail_client.UpdateSignature(username=username,signature=sig):
return "Signature changed"
else:
return None
def setup_credentials(delegate_email = None):
#delegated credentials seem to be required for email_settings api
key_path = '/tmp/VCI-EMAIL-INTEGRATION-abacbcabc.json'
API_scopes =['https://apps-apis.google.com/a/feeds/emailsettings/2.0/']
credentials = ServiceAccountCredentials.from_json_keyfile_name(key_path, scopes=API_scopes)
if delegate_email:
return credentials.create_delegated(delegate_email)
return credentials
def test_1(credentials,domain,user):
""" a low level test of something simple. If this works, you have the authentication working
User is the name of the user, not the full email address. e.g. tim """
http = httplib2.Http()
# http = credentials.authorize(http)
http = credentials.authorize(http) # this is necessary
url_get_sig = 'https://apps-apis.google.com/a/feeds/emailsettings/2.0/{domain}/{user}/signature'.format(**locals())
r = http.request(url_get_sig, "GET")
return r
if __name__ == "__main__":
delegated_credentials = setup_credentials('tim@vci.com.au') # this user is a super admin.
#test with a low level attempt
(res1,res2) = test_1(delegated_credentials)
assert(res1['status'] == '200')
# try with the EmailSettingsClient
client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='vci.com.au')
auth2token = gdata.gauth.OAuth2TokenFromCredentials(delegated_credentials)
auth2token.authorize(client)
r = client.retrieve_signature('tim')
print (client)
# now read a spreadsheet and bulk update
user_data = pd.ExcelFile(excelfile)
df = user_data.parse("Sheet1")
for r in df.values:
username = r[0]
first_name = "%s" % r[1]
if first_name == "nan":
first_name = ''
second_name = "%s" % r[2]
if second_name == "nan":
second_name = ''
full_name = "%s %s" % (first_name, second_name)
job_title = "%s" % r[3]
if job_title == 'nan':
job_title = ''
telephone = "%s" % r[4]
if telephone == 'nan':
telephone = "1300 863 824"
try:
print (update_sig(full_name=full_name,job_title=job_title,gmail_client=client,
telephone = telephone,username = username, sig_template=sig_template))
except gdata.client.RequestError:
print ("Client Error (user not found probably) for {}".format(full_name))
continue
except ssl.SSLEOFError:
print("SSL handshake Error for {}".format(full_name))
continue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment