Gestiona las firmas de gmail con la cuenta de servicio de python

Quiero editar las firmas de los usuarios en un dominio de Google Apps. Planeo usar una cuenta de servicio. La cuenta de servicio está delegada a todo el dominio. Tengo esto trabajando con la API de gmail para enviar y recuperar correos electrónicos, pero las firmas se modifican utilizando una API diferente. Según https://developers.google.com/admin-sdk/email-settings/, esta API es el SDK de administración que he habilitado a través de la Consola de desarrollador de Google.

Estoy intentando usar la biblioteca gdata.apps.emailsettings.client (que no es compatible con Python 3.x)

La construcción de las credenciales funciona, pero cuando bash hacerlo

gmail_client.RetrieveSignature(username) 

Obtengo gdata.client.Unauthorized: No autorizado – El servidor respondió con: 401.

 # python 2.7 from macports def setup_gmail_client_new_api(): client_email = '...3@developer.gserviceaccount.com' key_path = 'VCI-EMAIL-INTEGRATION-f493528321ba.json' sender = 'tim@vci.com.au' API_scope = 'https://apps-apis.google.com/a/feeds/emailsettings/2.0/' filename=key_path, scopes=API_scope) credentials = ServiceAccountCredentials.from_json_keyfile_name(key_path, scopes=API_scope) return credentials if __name__ == "__main__": credentials = setup_gmail_client_new_api() client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='vci.com.au') auth = gdata.gauth.OAuth2Token( credentials.client_id,#serviceEmail credentials.client_secret,#private key scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/', access_token=credentials.access_token, refresh_token=credentials.refresh_token, user_agent=credentials.user_agent) auth.authorize(client) result = retrieve_sig(client,"tim") print (result) 

el bash de recuperar la firma:

     gdata.client.Unauthorized: Unauthorized - Server responded with: 401, 

    La cuenta de servicio tiene delegación de dominio. En el panel de control de seguridad del dominio de Google Apps (Administrar acceso de cliente API), el ID de servicio tiene permiso para “Configuración de correo electrónico (lectura / escritura) https://apps-apis.google.com/a/feeds/emailsettings/2.0/ ”

    La API de configuración de correo electrónico requiere que se autentique como superadministrador; los usuarios normales no pueden acceder a la API. Por lo tanto, su cuenta de servicio debe actuar como superadministrador y luego como superadministrador que realiza el cambio para el usuario especificado en la llamada a la API.

    Tenga en cuenta: esta respuesta está desactualizada y utiliza una API en desuso. Esta idea muestra la nueva forma de hacerlo (y en python3) https://gist.github.com/timrichardson/e6ee6640a8b7fe664f3a5a80406ca980


    Derecha. Espero que este post te ahorre horas de trabajo.

    Punto faltante clave que no se documentó muy bien (bueno, en absoluto, pero tal vez lo perdí). Debe usar delegated_credentials y autorizar el email_settings_client con ese objeto.

    1. Siga las notas de oauth2 para crear una cuenta de servicio y descargue una clave privada JSON como de costumbre. Lo haces en la consola de desarrolladores. La cuenta de servicio no está vinculada a ningún dominio, es solo una credencial.
    2. En su dominio de Google Apps, vaya a seguridad, avanzado, api, etc. Los pasos 1 y 2 se documentan actualmente aquí: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority

    Ahora, el código de python. Utilicé 2.7 porque creo que gdata no es compatible con v3.

    Este es un ejemplo mínimo.

     from __future__ import print_function import httplib2 from oauth2client.service_account import ServiceAccountCredentials import gdata.apps.emailsettings.client import gdata.gauth def setup_credentials(): key_path = '/Users/tim/Dropbox/pycharm_projects_27/gmail_admin/.json' API_scopes =['https://apps-apis.google.com/a/feeds/emailsettings/2.0/'] credentials = ServiceAccountCredentials.from_json_keyfile_name(key_path, scopes=API_scopes) return credentials if __name__ == "__main__": credentials = setup_credentials() # pass the email address of a domain super-administrator delegated_credentials = credentials.create_delegated('tim@vci.com.au') http = httplib2.Http() #http = credentials.authorize(http) http = delegated_credentials.authorize(http) #this is necessary url_get_sig = 'https://apps-apis.google.com/a/feeds/emailsettings/2.0/vci.com.au/tim/signature' r = http.request(url_get_sig,"GET") print (r) # now use the library 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) 

    Este es un ejemplo más rico aquí: https://gist.github.com/timrichardson/a43462aedc0797ecb76c48deb9c96d36