|
| 1 | +import smtplib |
| 2 | +from email.mime.multipart import MIMEMultipart |
| 3 | +from email.mime.text import MIMEText |
| 4 | + |
| 5 | +from app.config import settings as global_settings |
| 6 | + |
| 7 | +from fastapi.templating import Jinja2Templates |
| 8 | + |
| 9 | +from pydantic import EmailStr |
| 10 | + |
| 11 | +from app.utils.logging import AppLogger |
| 12 | +from app.utils.singleton import SingletonMetaNoArgs |
| 13 | + |
| 14 | + |
| 15 | +logger = AppLogger().get_logger() |
| 16 | + |
| 17 | + |
| 18 | +class SMTPEmailService(metaclass=SingletonMetaNoArgs): |
| 19 | + def __init__(self): |
| 20 | + self.server = smtplib.SMTP( |
| 21 | + global_settings.smtp.server, global_settings.smtp.port |
| 22 | + ) |
| 23 | + self.server.starttls() |
| 24 | + self.server.login(global_settings.smtp.username, global_settings.smtp.password) |
| 25 | + self.templates = Jinja2Templates("templates") |
| 26 | + |
| 27 | + def send_email( |
| 28 | + self, |
| 29 | + sender: EmailStr, |
| 30 | + recipients: list[EmailStr], |
| 31 | + subject: str, |
| 32 | + body_text: str = "", |
| 33 | + body_html=None, |
| 34 | + ): |
| 35 | + msg = MIMEMultipart() |
| 36 | + msg["From"] = sender |
| 37 | + msg["To"] = ",".join(recipients) |
| 38 | + msg["Subject"] = subject |
| 39 | + msg.attach(MIMEText(body_text, "plain")) |
| 40 | + if body_html: |
| 41 | + msg.attach(MIMEText(body_html, "html")) |
| 42 | + self.server.sendmail(sender, recipients, msg.as_string()) |
| 43 | + |
| 44 | + def send_template_email( |
| 45 | + self, |
| 46 | + recipients: list[EmailStr], |
| 47 | + subject: str, |
| 48 | + template: str = None, |
| 49 | + context: dict = None, |
| 50 | + sender: EmailStr = global_settings.smtp.from_email, |
| 51 | + ): |
| 52 | + template_str = self.templates.get_template(template) |
| 53 | + body_html = template_str.render(context) |
| 54 | + self.send_email(sender, recipients, subject, body_html=body_html) |
0 commit comments