mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-11-22 03:42:20 -05:00
* bump ruff and mypy * mypy fixes * bump and fix openapi * drop debug statement * bump extruct * bump recipes-scrapers
76 lines
2.6 KiB
Python
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)
|