diff --git a/app/services/smtp.py b/app/services/smtp.py new file mode 100644 index 0000000..d4a2ce0 --- /dev/null +++ b/app/services/smtp.py @@ -0,0 +1,54 @@ +import smtplib +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText + +from app.config import settings as global_settings + +from fastapi.templating import Jinja2Templates + +from pydantic import EmailStr + +from app.utils.logging import AppLogger +from app.utils.singleton import SingletonMetaNoArgs + + +logger = AppLogger().get_logger() + + +class SMTPEmailService(metaclass=SingletonMetaNoArgs): + def __init__(self): + self.server = smtplib.SMTP( + global_settings.smtp.server, global_settings.smtp.port + ) + self.server.starttls() + self.server.login(global_settings.smtp.username, global_settings.smtp.password) + self.templates = Jinja2Templates("templates") + + def send_email( + self, + sender: EmailStr, + recipients: list[EmailStr], + subject: str, + body_text: str = "", + body_html=None, + ): + msg = MIMEMultipart() + msg["From"] = sender + msg["To"] = ",".join(recipients) + msg["Subject"] = subject + msg.attach(MIMEText(body_text, "plain")) + if body_html: + msg.attach(MIMEText(body_html, "html")) + self.server.sendmail(sender, recipients, msg.as_string()) + + def send_template_email( + self, + recipients: list[EmailStr], + subject: str, + template: str = None, + context: dict = None, + sender: EmailStr = global_settings.smtp.from_email, + ): + template_str = self.templates.get_template(template) + body_html = template_str.render(context) + self.send_email(sender, recipients, subject, body_html=body_html)