Spaces:
Build error
Build error
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() | |