sendMail.py 5.2 KB

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