API - email service refactoring
This commit is contained in:
@ -7,8 +7,9 @@ from typing import Dict, Optional, Type, Union
|
||||
|
||||
from flask import Flask
|
||||
from jinja2 import Environment, FileSystemLoader, select_autoescape
|
||||
from urllib3.util import parse_url
|
||||
|
||||
from .utils_email import parse_email_url
|
||||
from .exceptions import InvalidEmailUrlScheme
|
||||
|
||||
email_log = logging.getLogger('fittrackee_api_email')
|
||||
email_log.setLevel(logging.DEBUG)
|
||||
@ -69,7 +70,7 @@ class EmailTemplate:
|
||||
return message.generate_message()
|
||||
|
||||
|
||||
class Email:
|
||||
class EmailService:
|
||||
def __init__(self, app: Optional[Flask] = None) -> None:
|
||||
self.host = 'localhost'
|
||||
self.port = 25
|
||||
@ -83,7 +84,7 @@ class Email:
|
||||
self.init_email(app)
|
||||
|
||||
def init_email(self, app: Flask) -> None:
|
||||
parsed_url = parse_email_url(app.config['EMAIL_URL'])
|
||||
parsed_url = self.parse_email_url(app.config['EMAIL_URL'])
|
||||
self.host = parsed_url['host']
|
||||
self.port = parsed_url['port']
|
||||
self.use_tls = parsed_url['use_tls']
|
||||
@ -93,6 +94,23 @@ class Email:
|
||||
self.sender_email = app.config['SENDER_EMAIL']
|
||||
self.email_template = EmailTemplate(app.config['TEMPLATES_FOLDER'])
|
||||
|
||||
@staticmethod
|
||||
def parse_email_url(email_url: str) -> Dict:
|
||||
parsed_url = parse_url(email_url)
|
||||
if parsed_url.scheme != 'smtp':
|
||||
raise InvalidEmailUrlScheme()
|
||||
credentials = (
|
||||
parsed_url.auth.split(':') if parsed_url.auth else [None, None]
|
||||
)
|
||||
return {
|
||||
'host': parsed_url.host,
|
||||
'port': 25 if parsed_url.port is None else parsed_url.port,
|
||||
'use_tls': True if parsed_url.query == 'tls=True' else False,
|
||||
'use_ssl': True if parsed_url.query == 'ssl=True' else False,
|
||||
'username': credentials[0],
|
||||
'password': credentials[1],
|
||||
}
|
||||
|
||||
@property
|
||||
def smtp(self) -> Type[Union[smtplib.SMTP_SSL, smtplib.SMTP]]:
|
||||
return smtplib.SMTP_SSL if self.use_ssl else smtplib.SMTP
|
||||
|
13
fittrackee/emails/tasks.py
Normal file
13
fittrackee/emails/tasks.py
Normal file
@ -0,0 +1,13 @@
|
||||
from typing import Dict
|
||||
|
||||
from fittrackee import dramatiq, email_service
|
||||
|
||||
|
||||
@dramatiq.actor(queue_name='fittrackee_emails')
|
||||
def reset_password_email(user: Dict, email_data: Dict) -> None:
|
||||
email_service.send(
|
||||
template='password_reset_request',
|
||||
lang=user['language'],
|
||||
recipient=user['email'],
|
||||
data=email_data,
|
||||
)
|
@ -1,22 +0,0 @@
|
||||
from typing import Dict
|
||||
|
||||
from urllib3.util import parse_url
|
||||
|
||||
from .exceptions import InvalidEmailUrlScheme
|
||||
|
||||
|
||||
def parse_email_url(email_url: str) -> Dict:
|
||||
parsed_url = parse_url(email_url)
|
||||
if parsed_url.scheme != 'smtp':
|
||||
raise InvalidEmailUrlScheme()
|
||||
credentials = (
|
||||
parsed_url.auth.split(':') if parsed_url.auth else [None, None]
|
||||
)
|
||||
return {
|
||||
'host': parsed_url.host,
|
||||
'port': 25 if parsed_url.port is None else parsed_url.port,
|
||||
'use_tls': True if parsed_url.query == 'tls=True' else False,
|
||||
'use_ssl': True if parsed_url.query == 'ssl=True' else False,
|
||||
'username': credentials[0],
|
||||
'password': credentials[1],
|
||||
}
|
Reference in New Issue
Block a user