Mailer.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import smtplib
  2. import json
  3. import os
  4. from email.mime.text import MIMEText
  5. from email.mime.multipart import MIMEMultipart
  6. from jinja2 import Environment, BaseLoader
  7. class Mailer:
  8. def __init__(self, smtp_host, smtp_port, username, password, use_tls=True):
  9. self.smtp_host = smtp_host
  10. self.smtp_port = smtp_port
  11. self.username = username
  12. self.password = password
  13. self.use_tls = use_tls
  14. self.server = None
  15. self.env = Environment(loader=BaseLoader())
  16. def connect(self):
  17. print("Connecting to the SMTP server...")
  18. self.server = smtplib.SMTP(self.smtp_host, self.smtp_port)
  19. if self.use_tls:
  20. self.server.starttls()
  21. print("TLS activated!")
  22. if self.username and self.password:
  23. self.server.login(self.username, self.password)
  24. print("Authenticated!")
  25. def disconnect(self):
  26. if self.server:
  27. try:
  28. if self.server.sock:
  29. self.server.quit()
  30. except smtplib.SMTPServerDisconnected:
  31. pass
  32. finally:
  33. self.server = None
  34. def render_inline_template(self, template_string, context):
  35. template = self.env.from_string(template_string)
  36. return template.render(context)
  37. def send_mail(self, subject, from_addr, to_addrs, template, context = {}):
  38. try:
  39. if template == "":
  40. print("Cannot send email, template is empty!")
  41. return "Failed: Template is empty."
  42. body = self.render_inline_template(template, context)
  43. msg = MIMEMultipart()
  44. msg['From'] = from_addr
  45. msg['To'] = ', '.join(to_addrs) if isinstance(to_addrs, list) else to_addrs
  46. msg['Subject'] = subject
  47. msg.attach(MIMEText(body, 'html'))
  48. self.connect()
  49. self.server.sendmail(from_addr, to_addrs, msg.as_string())
  50. self.disconnect()
  51. return f"Success: Email sent to {msg['To']}"
  52. except Exception as e:
  53. print(f"Error during send_mail: {type(e).__name__}: {e}")
  54. return f"Failed: {type(e).__name__}: {e}"
  55. finally:
  56. self.disconnect()