import logging from typing import Optional import resend from flask import Flask from configs import dify_config 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): mail_type = dify_config.MAIL_TYPE if not mail_type: logging.warning("MAIL_TYPE is not set") return if dify_config.MAIL_DEFAULT_SEND_FROM: self._default_send_from = dify_config.MAIL_DEFAULT_SEND_FROM match mail_type: case "resend": api_key = dify_config.RESEND_API_KEY if not api_key: raise ValueError("RESEND_API_KEY is not set") api_url = dify_config.RESEND_API_URL if api_url: resend.api_url = api_url resend.api_key = api_key self._client = resend.Emails case "smtp": from libs.smtp import SMTPClient if not dify_config.SMTP_SERVER or not dify_config.SMTP_PORT: raise ValueError("SMTP_SERVER and SMTP_PORT are required for smtp mail type") if not dify_config.SMTP_USE_TLS and dify_config.SMTP_OPPORTUNISTIC_TLS: raise ValueError("SMTP_OPPORTUNISTIC_TLS is not supported without enabling SMTP_USE_TLS") self._client = SMTPClient( server=dify_config.SMTP_SERVER, port=dify_config.SMTP_PORT, username=dify_config.SMTP_USERNAME, password=dify_config.SMTP_PASSWORD, _from=dify_config.MAIL_DEFAULT_SEND_FROM, use_tls=dify_config.SMTP_USE_TLS, opportunistic_tls=dify_config.SMTP_OPPORTUNISTIC_TLS, ) case _: raise ValueError("Unsupported mail type {}".format(mail_type)) 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()