mirror of
https://github.com/grillazz/fastapi-sqlalchemy-asyncpg.git
synced 2025-08-26 16:40:40 +03:00
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
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)
|