sendMail.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. # coding=utf-8
  2. import logging
  3. from datetime import datetime, timedelta
  4. from babel.dates import format_date
  5. from string import Template
  6. from dotenv import load_dotenv
  7. import os
  8. from apscheduler.schedulers.blocking import BlockingScheduler
  9. import pymongo
  10. from bson import ObjectId
  11. from bson.json_util import dumps
  12. from json import loads
  13. import csv
  14. import requests
  15. class MailSender:
  16. def __init__(self, serialNumber):
  17. load_dotenv()
  18. logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  19. self.logger = logging.getLogger()
  20. # Connection to MongoDB
  21. self.serialNumber = serialNumber
  22. self.mongoClient = pymongo.MongoClient(os.getenv('MONGODB_HOST'))
  23. self.mongoDB = self.mongoClient["Medidores"]
  24. self.meterLogsCollection = self.mongoDB["meters_logs"]
  25. self.schedulerCollection = self.mongoDB["mail_scheduler"]
  26. self.now = datetime.now()
  27. self.hora_inicio = "00:00:00"
  28. self.hora_fin = "00:00:00"
  29. self.ayer = self.now - timedelta(days=1)
  30. self.sg_api_url = os.getenv("SG_API_URL")
  31. self.sg_api_key = os.getenv("SG_API_KEY")
  32. self.sg_template_id = os.getenv("SG_TEMPLATE_ID")
  33. def _read_template(self, filename):
  34. """
  35. Returns a Template object comprising the contents of the
  36. file specified by filename.
  37. """
  38. with open(filename, 'r', encoding='utf-8') as template_file:
  39. template_file_content = template_file.read()
  40. return Template(template_file_content)
  41. def _makeCSV(self, filename, result):
  42. if os.name == 'nt':
  43. file_dest_path = './tmp'
  44. else:
  45. file_dest_path = os.getenv("FILES_BASE_PATH")
  46. filename = os.path.join(file_dest_path, filename)
  47. headers=[]
  48. with open(filename, 'w', newline='') as out:
  49. headers.append("Date")
  50. writer = csv.writer(out)
  51. for med in result[0]['mediciones']:
  52. headers.append(med['descripcion'])
  53. writer.writerow(headers)
  54. for doc in result:
  55. line=[]
  56. line.append(doc['logDate'])
  57. for med in doc['mediciones']:
  58. line.append(med['lectura'])
  59. writer.writerow(line)
  60. out.close()
  61. self.logger.info("Archivo creado con exito.")
  62. def _calculateEnergy(self, result):
  63. totalEnergy = 0
  64. regs = 0
  65. for doc in result:
  66. for med in doc['mediciones']:
  67. if med['registro'] == 4999:
  68. totalEnergy = totalEnergy + float(med['lectura'])/10
  69. regs = regs + 1
  70. return regs, totalEnergy
  71. def _getLogs(self):
  72. ffin = self.now.strftime("%Y-%m-%d ") + self.hora_fin
  73. finicio = self.ayer.strftime("%Y-%m-%d ") + self.hora_inicio
  74. self.logger.info("Fecha Inicio: " + finicio)
  75. self.logger.info("Fecha Fin: " + ffin)
  76. print({"logDate" : {"$gte":finicio, "$lte":ffin},"serialNumber": self.serialNumber, "meterLogNumber":2})
  77. resp = self.meterLogsCollection.find({"logDate" : {"$gte":finicio, "$lte":ffin},"serialNumber": self.serialNumber, "meterLogNumber":2})
  78. resultstr = dumps(resp)
  79. result = loads(resultstr)
  80. return result
  81. def sendMail(self):
  82. fileToSend = "_".join([self.now.strftime("%Y%m%d"), self.serialNumber, "energy_data.csv"])
  83. self.logger.info("Obteniendo información de la base de datos para el medidor {0}".format(self.serialNumber))
  84. result = self._getLogs()
  85. self.logger.info("Escribiendo el archivo {0}".format(fileToSend))
  86. self._makeCSV(fileToSend, result)
  87. _, energiaTotal = self._calculateEnergy(result)
  88. recipients = []
  89. self.logger.info("Leyendo información de destinatarios")
  90. with open("recipients.txt",'r') as recipientList:
  91. for rec in recipientList.readlines():
  92. recipients.append({"email": rec})
  93. data = {
  94. "from":{
  95. "email":"energy_report@energy.inverlec.solar"
  96. },
  97. "personalizations":[
  98. {
  99. "to": recipients,
  100. "dynamic_template_data":{
  101. "fecha": format_date(self.now, locale='es_SV', format='full'),
  102. "medidor": self.serialNumber,
  103. "energia": energiaTotal,
  104. "hora_inicio": self.hora_inicio,
  105. "hora_fin": self.hora_fin,
  106. "fecha_inicio": self.ayer.strftime("%Y-%m-%d ") ,
  107. "fecha_fin": self.now.strftime("%Y-%m-%d"),
  108. "button_link": "https://energy.inverlec.solar/data/meter/" + fileToSend
  109. }
  110. }
  111. ],
  112. "template_id":"d-14e708c347344f6ca01a2f245e278cbb"
  113. }
  114. headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + self.sg_api_key}
  115. self.logger.info("Enviando correo electrónico")
  116. r = requests.post(self.sg_api_url, json=data, headers=headers)
  117. self.logger.info("El resultado del envio de correo es: {0}".format(r))
  118. if __name__ == "__main__":
  119. sender = MailSender("0223412115")
  120. # scheduler = BlockingScheduler()
  121. # scheduler.add_job(sender.sendMail, 'cron', hour=16, minute=35)
  122. # scheduler.add_job(sender.sendMail, 'cron', hour=7, minute=41)# 8
  123. # scheduler.start()
  124. sender.sendMail()