Last active
April 2, 2018 14:39
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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