Español

Cómo: Generar una actualización de correo electrónico programada cuando una entidad se agregue a un servicio de entidades alojado con Python

Resumen

Es posible agregar un servicio de entidades alojado a una aplicación web pública. Ofrece a los usuarios capacidades de edición. En algunos casos, es posible que los propietarios prefieran recibir notificaciones de actualizaciones programadas cuando se agregan nuevas entidades alojadas al servicio de entidades alojado. Puede crear un script de Python para comprobar la existencia de cambios en el servicio de entidades alojado durante un intervalo determinado y enviar un correo electrónico al propietario. Puede enviar un correo electrónico automático con el módulo smptlib para acceder al protocolo SMTP de correo electrónico del proveedor de correo web deseado, por ejemplo, Gmail o Hotmail.

Procedimiento

A continuación, se muestran los pasos para generar y enviar un correo electrónico automático con ObjectID recién creados cuando se agregan nuevas entidades a un servicio de entidades alojado:

  1. Importe las bibliotecas necesarias.
import urllib2, json, urllib, datetime, time, smtplib  
from datetime import timedelta
  1. Cree un parámetro de matriz para almacenar los datos de ObjectID en el campo ObjectID y especifique las variables requeridas, por ejemplo, la URL y el campo de Id. único.
username = 'Username'  # Nombre de usuario de ArcGIS Online
password = 'password'  # Contraseña de ArcGIS Online

URL = 'https://services.arcgis.com/[Folder]/arcgis/rest/services/[Feature Data]/FeatureServer/2/query'       # URL del servicio de entidades
uniqueID = 'OBJECTID'   # Campo que desea comprobar 
dateField = 'Date'      # Campo de fecha que desea consultar
hoursValue = 1          # Número de horas para comprobar cuándo se agregó una entidad

fromEmail = 'Sample@email.com' # Correo electrónico del remitente
toEmail = 'Sample@email.com'   # Correo electrónico del destinatario 
#smtpServer = 'smtp.gis.com'   # Nombre del servidor SMPT
#portNumber = 25               # Puerto del servidor SMTP

# Cree una lista vacía para los uniqueID
oidList = []
  1. Genere el token de ArcGIS Online para acceder a la URL especificada.
try:
    print('Generating Token')
    tokenURL = 'https://www.arcgis.com/sharing/rest/generateToken'
    params = {'f': 'pjson', 'username': username, 'password': password, 'referer': 'http://www.arcgis.com'}
    req = urllib2.Request(tokenURL, urllib.urlencode(params))
    response = urllib2.urlopen(req)
    data = json.load(response)
    token = data['token']
except:
    token = ''
  1. Cree una solicitud para abrir el objeto de red definido por una URL para su lectura.
params = {'f': 'pjson', 'where': "1=1", 'outfields' : '*' , 'returnGeometry' : 'false', 'token' : token}
req = urllib2.Request(URL, urllib.urlencode(params))
response = urllib2.urlopen(req)
data = json.load(response)
  1. Cree una instrucción de bucle para buscar ediciones o cambios, si está disponible, a lo largo de un intervalo de tiempo.
for feat in data['features']:
    createDate = feat['attributes'][dateField]
    createDate = int(str(createDate)[0:-3])
    t = datetime.datetime.now() - timedelta(hours=hoursValue)
    t = time.mktime(t.timetuple())
    if createDate > t:
        oidList.append(feat['attributes'][uniqueID])
        print("Edited feature")
  1. Cree una plantilla de correo electrónico que incluya las direcciones de correo electrónico del remitente y destinatario.
FROM = 'remitente@hotmail.com'  
TO = ['destinatario@yahoo.com']  
SUBJECT = 'Nueva entidad agregada'  
TEXT = "Se agregaron entidades con OBJECTID " + str(oidList) + "."
  1. Recupere los parámetros especificados en el paso 6 como datos de cadena de caracteres.
message = """\ 
From: %s 
To: %s 
Subject: %s 

%s 
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
emailPassword = 'Password' 
  1. Recupere el protocolo SMTP de la cuenta de correo electrónico con el módulo smtplib.
Nota:
Algunos proveedores de correo electrónico, por ejemplo, Gmail, requieren inicios de sesión de acceso seguro desde las aplicaciones. La opción que permite el acceso menos seguro de aplicaciones se requiere para establecer correctamente una conexión con el servidor smtp. 
if len(oidList) > 0:
    server = smtplib.SMTP_SSL('smtp.gmail.com')
    server.connect('smtp.gmail.com')
    server.ehlo()
    server.login(FROM, gmailPWD)
    server.sendmail(FROM, TO, message)
    print "Correo electrónico enviado correctamente"
    server.close()
else:
 print "No se encontraron nuevos datos."

El siguiente script muestra el código final:

import urllib2, json, urllib, datetime, time, smtplib
from datetime import timedelta

# Variables
username = 'Username'    
password = 'password'    

URL = 'https://services.arcgis.com/Wl7Y1m92PbjtJs5n/arcgis/rest/services/tem_data/FeatureServer/2/query'       # URL del servicio de entidades
uniqueID = 'OBJECTID'          
dateField = 'EditDate'      
hoursValue = 1              

fromEmail = 'test@gmail.com' 
toEmail = 'test@esri.com'   

oidList = []

try:
    print('Generating Token')
    tokenURL = 'https://www.arcgis.com/sharing/rest/generateToken'
    params = {'f': 'pjson', 'username': username, 'password': password, 'referer': 'http://www.arcgis.com'}
    req = urllib2.Request(tokenURL, urllib.urlencode(params))
    response = urllib2.urlopen(req)
    data = json.load(response)
    token = data['token']
except:
    token = ''

params = {'f': 'pjson', 'where': "1=1", 'outfields' : '*' , 'returnGeometry' : 'false', 'token' : token}
req = urllib2.Request(URL, urllib.urlencode(params))
response = urllib2.urlopen(req)
data = json.load(response)
for feat in data['features']:
    createDate = feat['attributes'][dateField]
    createDate = int(str(createDate)[0:-3])
    t = datetime.datetime.now() - timedelta(hours=hoursValue)
    t = time.mktime(t.timetuple())
    if createDate > t:
        oidList.append(feat['attributes'][uniqueID])
        print("Edited feature")

print(oidList)

FROM = fromEmail
TO = [toEmail]
SUBJECT = 'Nuevas entidades agregadas'
TEXT = "Se agregaron entidades con {0}s {1}.".format(uniqueID, oidList)

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
gmailPWD = 'password'

if len(oidList) > 0:
    server = smtplib.SMTP_SSL('smtp.gmail.com')
    server.connect('smtp.gmail.com')
    server.ehlo()
    server.login(FROM, gmailPWD)
    server.sendmail(FROM, TO, message)
    print "Correo electrónico enviado correctamente"
    server.close()
else:
	print "No se encontraron nuevos datos."

Información relacionada