Skip to content

Instantly share code, notes, and snippets.

@marcelovilla
Last active April 2, 2018 14:39
Show Gist options
  • Select an option

  • Save marcelovilla/3bbcc853389e6b478ee631cdf82ce87d to your computer and use it in GitHub Desktop.

Select an option

Save marcelovilla/3bbcc853389e6b478ee631cdf82ce87d to your computer and use it in GitHub Desktop.
Envía un correo electrónico a la dirección especificada con un archivo adjunto, el cual consiste en un archivo de Excel o CSV con la tabla de atributos (completa o filtrada) de un Feature Service de ArcGIS. Para mayor información consultar los doc strings de las funciones que se encuentran en el código.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Author: Esri Colombia (Marcelo Villa)
Date: 27/03/2018
Envía un correo electrónico a la dirección especificada con un archivo adjunto,
el cual consiste en un archivo de Excel (o CSV) con la tabla de atributos para
todos los eventos 'activos' de un Feature Service de ArcGIS.
"""
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate
from email import encoders
from os.path import basename
import smtplib
from pandas.io.json import json_normalize
import pandas as pd
import datetime
import requests
def get_attrs_from_fs(url):
"""
Obtiene los atributos de un servicio de ArcGIS previamente consultado y
filtrado y los almacena en un DataFrame (similar a la tabla de atributos).
:param url: url del servicio previamente consultado y en formato json
:return: DataFrame donde las columnas son los atributos y las
filas son los eventos
"""
return json_normalize(requests.get(url).json()['features'])
def save_df(df, directory, name='ReporteEventos', ext='.xlsx'):
"""
Guarda un DataFrame a un archivo de Excel o CSV con un nombre específicado
que incluye la fecha en la que se ejecuta el programa.
:param df: DataFrame
:param directory: directorio para guardar el archivo de excel
:param name: nombre del archivo de salida
:param ext: extensión del archivo de salida (.xlsx o .csv)
:return: ruta del archivo de salida
"""
df.columns = map(lambda col: col[11:], df.columns)
date = datetime.date.today()
if ext == '.xlsx':
path = r"{0}\{1}_{2}.xlsx".format(directory, name, date)
writer = pd.ExcelWriter(path)
df.to_excel(excel_writer=writer, sheet_name='{0}'.format(date))
return path
elif ext == '.csv':
path = r"{0}\{1}_{2}.csv".format(directory, name, date)
df.to_csv(path)
return path
else:
raise ValueError('La extensión del archivo no es válida.'
'Debe ser ".xlsx" o ".csv"')
def send_mail(send_from, send_to, password, server, port, subject=None,
text=None, files=[]):
"""
Envía un correo electrónico desde una dirección específica a uno o varios
destinatarios. Posibilidad de específicar el asunto y el texto del correo,
además de adjuntar uno o varios archivos.
Para información sobre el nombre del servidor y el número del puerto
consultar el siguiente link:
https://www.arclab.com/en/kb/email/list-of-smtp-and-pop3-servers-
mailserver-list.html
:param send_from: remitente
:param send_to: destinatario; lista de destinatarios
:param password: contraseña del correo
:param server: servidor del correo
:param port: puerto del servidor
:param subject: asunto del correo (opcional)
:param text: mensaje del correo (opcional)
:param files: ruta del archivo; lista de rutas de los archivos
(opcional)
:return: None
"""
if isinstance(send_to, str):
send_to = [send_to]
if isinstance(files, str):
files = [files]
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = ','.join(send_to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach(MIMEText(text, _charset='utf-8'))
for fn in files:
part = MIMEBase('application', "file")
part.set_payload(open(fn, "rb").read())
encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment; filename="{}"'.format(basename(fn)))
msg.attach(part)
smtp = smtplib.SMTP(server, port)
smtp.ehlo()
smtp.starttls()
smtp.login(user=send_from, password=password)
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.close()
if __name__ == '__main__':
# Definir url, directorio y nombre de archivo del reporte
service_url = r""
directory = r""
report_fn = ''
service_df = get_attrs_from_fs(url=service_url)
report_path = save_df(df=service_df, directory=directory, name=report_fn)
# Definir parámetros del correo
sender = ''
receiver = ['']
password = ''
server = ''
port = None
subject = ''
text = ""
send_mail(
send_from=sender,
send_to=receiver,
password=password,
server=server,
port=port,
subject=subject,
text=text,
files=[report_path]
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment