import logging from typing import Optional import resend from flask import Flask class Mail: def __init__(self): self._client = None self._default_send_from = None def is_inited(self) -> bool: return self._client is not None def init_app(self, app: Flask): if app.config.get("MAIL_TYPE"): if app.config.get("MAIL_DEFAULT_SEND_FROM"): self._default_send_from = app.config.get("MAIL_DEFAULT_SEND_FROM") if app.config.get("MAIL_TYPE") == "resend": api_key = app.config.get("RESEND_API_KEY") if not api_key: raise ValueError("RESEND_API_KEY is not set") api_url = app.config.get("RESEND_API_URL") if api_url: resend.api_url = api_url resend.api_key = api_key self._client = resend.Emails elif app.config.get("MAIL_TYPE") == "smtp": from libs.smtp import SMTPClient if not app.config.get("SMTP_SERVER") or not app.config.get("SMTP_PORT"): raise ValueError("SMTP_SERVER and SMTP_PORT are required for smtp mail type") if not app.config.get("SMTP_USE_TLS") and app.config.get("SMTP_OPPORTUNISTIC_TLS"): raise ValueError("SMTP_OPPORTUNISTIC_TLS is not supported without enabling SMTP_USE_TLS") self._client = SMTPClient( server=app.config.get("SMTP_SERVER"), port=app.config.get("SMTP_PORT"), username=app.config.get("SMTP_USERNAME"), password=app.config.get("SMTP_PASSWORD"), _from=app.config.get("MAIL_DEFAULT_SEND_FROM"), use_tls=app.config.get("SMTP_USE_TLS"), opportunistic_tls=app.config.get("SMTP_OPPORTUNISTIC_TLS"), ) else: raise ValueError("Unsupported mail type {}".format(app.config.get("MAIL_TYPE"))) else: logging.warning("MAIL_TYPE is not set") def send(self, to: str, subject: str, html: str, from_: Optional[str] = None): if not self._client: raise ValueError("Mail client is not initialized") if not from_ and self._default_send_from: from_ = self._default_send_from if not from_: raise ValueError("mail from is not set") if not to: raise ValueError("mail to is not set") if not subject: raise ValueError("mail subject is not set") if not html: raise ValueError("mail html is not set") self._client.send( { "from": from_, "to": to, "subject": subject, "html": html, } ) def init_app(app: Flask): mail.init_app(app) mail = Mail()