sendMail.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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. if med['registro'] in [4999, 5007, 5001, 5009]:
  59. line.append(float(med['lectura'])*100)
  60. else:
  61. line.append(med['lectura'])
  62. writer.writerow(line)
  63. out.close()
  64. self.logger.info("Archivo creado con exito.")
  65. def _calculateEnergy(self, result):
  66. totalEnergy = 0
  67. regs = 0
  68. for doc in result:
  69. for med in doc['mediciones']:
  70. if med['registro'] == 4999:
  71. totalEnergy = totalEnergy + float(med['lectura'])*0.1
  72. regs = regs + 1
  73. return regs, totalEnergy
  74. def _getLogs(self):
  75. ffin = self.now.strftime("%Y-%m-%d ") + self.hora_fin
  76. finicio = self.ayer.strftime("%Y-%m-%d ") + self.hora_inicio
  77. self.logger.info("Fecha Inicio: " + finicio)
  78. self.logger.info("Fecha Fin: " + ffin)
  79. print({"logDate" : {"$gte":finicio, "$lte":ffin},"serialNumber": self.serialNumber, "meterLogNumber":2})
  80. resp = self.meterLogsCollection.find({"logDate" : {"$gte":finicio, "$lte":ffin},"serialNumber": self.serialNumber, "meterLogNumber":2})
  81. resultstr = dumps(resp)
  82. result = loads(resultstr)
  83. return result
  84. def sendMail(self):
  85. fileToSend = "_".join([self.now.strftime("%Y%m%d"), self.serialNumber, "energy_data.csv"])
  86. self.logger.info("Obteniendo información de la base de datos para el medidor {0}".format(self.serialNumber))
  87. result = self._getLogs()
  88. self.logger.info("Escribiendo el archivo {0}".format(fileToSend))
  89. self._makeCSV(fileToSend, result)
  90. _, energiaTotal = self._calculateEnergy(result)
  91. recipients = []
  92. self.logger.info("Leyendo información de destinatarios")
  93. with open("recipients.txt",'r') as recipientList:
  94. for rec in recipientList.readlines():
  95. recipients.append({"email": rec})
  96. data = {
  97. "from":{
  98. "email":"energy_report@energy.inverlec.solar"
  99. },
  100. "personalizations":[
  101. {
  102. "to": recipients,
  103. "dynamic_template_data":{
  104. "fecha": format_date(self.now, locale='es_SV', format='full'),
  105. "medidor": self.serialNumber,
  106. "energia": energiaTotal,
  107. "hora_inicio": self.hora_inicio,
  108. "hora_fin": self.hora_fin,
  109. "fecha_inicio": self.ayer.strftime("%Y-%m-%d ") ,
  110. "fecha_fin": self.now.strftime("%Y-%m-%d"),
  111. "button_link": "https://energy.inverlec.solar/data/meter/" + fileToSend
  112. }
  113. }
  114. ],
  115. "template_id":"d-14e708c347344f6ca01a2f245e278cbb"
  116. }
  117. headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + self.sg_api_key}
  118. self.logger.info("Enviando correo electrónico")
  119. r = requests.post(self.sg_api_url, json=data, headers=headers)
  120. self.logger.info("El resultado del envio de correo es: {0}".format(r))
  121. if __name__ == "__main__":
  122. meters = ['0223412115' , '0223406118']
  123. for meter in meters:
  124. sender = MailSender(meter)
  125. sender.sendMail()
  126. del(sender)