| 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') | |
| 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') | |
| ) | |
| else: | |
| raise ValueError('Unsupported mail type {}'.format(app.config.get('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() | |