|
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() |
|
|