12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import smtplib
- import json
- import os
- from email.mime.text import MIMEText
- from email.mime.multipart import MIMEMultipart
- from jinja2 import Environment, BaseLoader
- class Mailer:
- def __init__(self, smtp_host, smtp_port, username, password, use_tls=True):
- self.smtp_host = smtp_host
- self.smtp_port = smtp_port
- self.username = username
- self.password = password
- self.use_tls = use_tls
- self.server = None
- self.env = Environment(loader=BaseLoader())
- def connect(self):
- print("Connecting to the SMTP server...")
- self.server = smtplib.SMTP(self.smtp_host, self.smtp_port)
- if self.use_tls:
- self.server.starttls()
- print("TLS activated!")
- if self.username and self.password:
- self.server.login(self.username, self.password)
- print("Authenticated!")
- def disconnect(self):
- if self.server:
- try:
- if self.server.sock:
- self.server.quit()
- except smtplib.SMTPServerDisconnected:
- pass
- finally:
- self.server = None
- def render_inline_template(self, template_string, context):
- template = self.env.from_string(template_string)
- return template.render(context)
- def send_mail(self, subject, from_addr, to_addrs, template, context = {}):
- try:
- if template == "":
- print("Cannot send email, template is empty!")
- return "Failed: Template is empty."
- body = self.render_inline_template(template, context)
- msg = MIMEMultipart()
- msg['From'] = from_addr
- msg['To'] = ', '.join(to_addrs) if isinstance(to_addrs, list) else to_addrs
- msg['Subject'] = subject
- msg.attach(MIMEText(body, 'html'))
- self.connect()
- self.server.sendmail(from_addr, to_addrs, msg.as_string())
- self.disconnect()
- return f"Success: Email sent to {msg['To']}"
- except Exception as e:
- print(f"Error during send_mail: {type(e).__name__}: {e}")
- return f"Failed: {type(e).__name__}: {e}"
- finally:
- self.disconnect()
|