Files
mealie/mealie/services/email/email_service.py
Hayden 4d5550ad85 chore: mypy, ruff, extract, openapi, and recipes-scraper updates (#1968)
* bump ruff and mypy

* mypy fixes

* bump and fix openapi

* drop debug statement

* bump extruct

* bump recipes-scrapers
2023-01-01 13:47:27 -09:00

76 lines
2.6 KiB
Python

from pathlib import Path
from jinja2 import Template
from pydantic import BaseModel
from mealie.core.root_logger import get_logger
from mealie.services._base_service import BaseService
from .email_senders import ABCEmailSender, DefaultEmailSender
CWD = Path(__file__).parent
logger = get_logger()
class EmailTemplate(BaseModel):
subject: str
header_text: str
message_top: str
message_bottom: str
button_link: str
button_text: str
def render_html(self, template: Path) -> str:
tmpl = Template(template.read_text())
return tmpl.render(data=self.dict())
class EmailService(BaseService):
def __init__(self, sender: ABCEmailSender | None = None) -> None:
self.templates_dir = CWD / "templates"
self.default_template = self.templates_dir / "default.html"
self.sender: ABCEmailSender = sender or DefaultEmailSender()
super().__init__()
def send_email(self, email_to: str, data: EmailTemplate) -> bool:
if not self.settings.SMTP_ENABLE:
return False
return self.sender.send(email_to, data.subject, data.render_html(self.default_template))
def send_forgot_password(self, address: str, reset_password_url: str) -> bool:
forgot_password = EmailTemplate(
subject="Mealie Forgot Password",
header_text="Forgot Password",
message_top="You have requested to reset your password.",
message_bottom="Please click the button above to reset your password.",
button_link=reset_password_url,
button_text="Reset Password",
)
return self.send_email(address, forgot_password)
def send_invitation(self, address: str, invitation_url: str) -> bool:
invitation = EmailTemplate(
subject="Invitation to join Mealie",
header_text="You're Invited!",
message_top="You have been invited to join Mealie.",
message_bottom="Please click the button above to accept the invitation.",
button_link=invitation_url,
button_text="Accept Invitation",
)
return self.send_email(address, invitation)
def send_test_email(self, address: str) -> bool:
test_email = EmailTemplate(
subject="Test Email",
header_text="Test Email",
message_top="This is a test email.",
message_bottom="Please click the button above to test the email.",
button_link="https://www.google.com",
button_text="Test Email",
)
return self.send_email(address, test_email)