File size: 2,849 Bytes
			
			| a8b3f00 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | 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()
 | 
