# coding=utf-8 import logging from datetime import datetime, timedelta from babel.dates import format_date from string import Template from dotenv import load_dotenv import os from apscheduler.schedulers.blocking import BlockingScheduler import pymongo from bson import ObjectId from bson.json_util import dumps from json import loads import csv import requests class MailSender: def __init__(self, serialNumber): load_dotenv() logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') self.logger = logging.getLogger() # Connection to MongoDB self.serialNumber = serialNumber self.mongoClient = pymongo.MongoClient(os.getenv('MONGODB_HOST')) self.mongoDB = self.mongoClient["Medidores"] self.meterLogsCollection = self.mongoDB["meters_logs"] self.schedulerCollection = self.mongoDB["mail_scheduler"] self.now = datetime.now() self.hora_inicio = "00:00:00" self.hora_fin = "00:00:00" self.ayer = self.now - timedelta(days=1) self.sg_api_url = os.getenv("SG_API_URL") self.sg_api_key = os.getenv("SG_API_KEY") self.sg_template_id = os.getenv("SG_TEMPLATE_ID") def _read_template(self, filename): """ Returns a Template object comprising the contents of the file specified by filename. """ with open(filename, 'r', encoding='utf-8') as template_file: template_file_content = template_file.read() return Template(template_file_content) def _makeCSV(self, filename, result): if os.name == 'nt': file_dest_path = './tmp' else: file_dest_path = os.getenv("FILES_BASE_PATH") filename = os.path.join(file_dest_path, filename) headers=[] with open(filename, 'w', newline='') as out: headers.append("Date") writer = csv.writer(out) for med in result[0]['mediciones']: headers.append(med['descripcion']) writer.writerow(headers) for doc in result: line=[] line.append(doc['logDate']) for med in doc['mediciones']: line.append(med['lectura']) writer.writerow(line) out.close() self.logger.info("Archivo creado con exito.") def _calculateEnergy(self, result): totalEnergy = 0 regs = 0 for doc in result: for med in doc['mediciones']: if med['registro'] == 4999: totalEnergy = totalEnergy + float(med['lectura'])/10 regs = regs + 1 return regs, totalEnergy def _getLogs(self): ffin = self.now.strftime("%Y-%m-%d ") + self.hora_fin finicio = self.ayer.strftime("%Y-%m-%d ") + self.hora_inicio self.logger.info("Fecha Inicio: " + finicio) self.logger.info("Fecha Fin: " + ffin) print({"logDate" : {"$gte":finicio, "$lte":ffin},"serialNumber": self.serialNumber, "meterLogNumber":2}) resp = self.meterLogsCollection.find({"logDate" : {"$gte":finicio, "$lte":ffin},"serialNumber": self.serialNumber, "meterLogNumber":2}) resultstr = dumps(resp) result = loads(resultstr) return result def sendMail(self): fileToSend = "_".join([self.now.strftime("%Y%m%d"), self.serialNumber, "energy_data.csv"]) self.logger.info("Obteniendo información de la base de datos para el medidor {0}".format(self.serialNumber)) result = self._getLogs() self.logger.info("Escribiendo el archivo {0}".format(fileToSend)) self._makeCSV(fileToSend, result) _, energiaTotal = self._calculateEnergy(result) recipients = [] self.logger.info("Leyendo información de destinatarios") with open("recipients.txt",'r') as recipientList: for rec in recipientList.readlines(): recipients.append({"email": rec}) data = { "from":{ "email":"energy_report@energy.inverlec.solar" }, "personalizations":[ { "to": recipients, "dynamic_template_data":{ "fecha": format_date(self.now, locale='es_SV', format='full'), "medidor": self.serialNumber, "energia": energiaTotal, "hora_inicio": self.hora_inicio, "hora_fin": self.hora_fin, "fecha_inicio": self.ayer.strftime("%Y-%m-%d ") , "fecha_fin": self.now.strftime("%Y-%m-%d"), "button_link": "https://energy.inverlec.solar/data/meter/" + fileToSend } } ], "template_id":"d-14e708c347344f6ca01a2f245e278cbb" } headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + self.sg_api_key} self.logger.info("Enviando correo electrónico") r = requests.post(self.sg_api_url, json=data, headers=headers) self.logger.info("El resultado del envio de correo es: {0}".format(r)) if __name__ == "__main__": sender = MailSender("0223412115") # scheduler = BlockingScheduler() # scheduler.add_job(sender.sendMail, 'cron', hour=16, minute=35) # scheduler.add_job(sender.sendMail, 'cron', hour=7, minute=41)# 8 # scheduler.start() sender.sendMail()