Source code for yaenv.email

"""E-mail URL parser."""

from typing import Any, NewType
from urllib import parse as urlparse

from .utils import is_truthy

EmailConfig = NewType('EmailConfig', dict[str, Any])
EmailConfig.__qualname__ = 'yaenv.email.EmailConfig'

# Supported schemes.
SCHEMES: dict[str, str] = {
    'console': 'django.core.mail.backends.console.EmailBackend',
    'dummy': 'django.core.mail.backends.dummy.EmailBackend',
    'file': 'django.core.mail.backends.filebased.EmailBackend',
    'memory': 'django.core.mail.backends.locmem.EmailBackend',
    'smtp': 'django.core.mail.backends.smtp.EmailBackend',
}

# Scheme aliases.
SCHEMES['smtp+ssl'] = SCHEMES['smtp']
SCHEMES['smtp+tls'] = SCHEMES['smtp']

# Register e-mail schemes in URLs.
urlparse.uses_netloc += list(SCHEMES)


[docs]def parse(url: str) -> EmailConfig: """ Parse an e-mail URL. Parameters ---------- url : str The e-mail URL to be parsed. Returns ------- EmailConfig A dictionary that can be used in :dj:`django.settings.EMAIL_* <email-backend>`. Examples -------- >>> parse('smtp+tls://user:pass@example.com') { 'EMAIL_BACKEND': 'django.core.mail.backends.smtp.EmailBackend', 'EMAIL_HOST_USER': 'user', 'EMAIL_HOST_PASSWORD': 'pass', 'EMAIL_HOST': 'example.com', 'EMAIL_USE_TLS': True, 'EMAIL_PORT': 587 } """ # Parse the given URL. uri = urlparse.urlparse(url) # Update with environment configuration config = EmailConfig({ 'EMAIL_BACKEND': SCHEMES[uri.scheme], 'EMAIL_HOST_USER': urlparse.unquote(uri.username or ''), 'EMAIL_HOST_PASSWORD': urlparse.unquote(uri.password or ''), 'EMAIL_HOST': uri.hostname or 'localhost', }) # Set config for file. if uri.scheme == 'file': config['EMAIL_FILE_PATH'] = uri.path[1:] # Set config for smtp. if uri.scheme == 'smtp': config['EMAIL_PORT'] = uri.port or 25 if uri.port == 587: config['EMAIL_USE_TLS'] = True if uri.port == 465: config['EMAIL_USE_SSL'] = True # Set config for smtp+tls. if uri.scheme == 'smtp+tls': config['EMAIL_PORT'] = uri.port or 587 config['EMAIL_USE_TLS'] = True # Set config for smtp+ssl. if uri.scheme == 'smtp+ssl': config['EMAIL_PORT'] = uri.port or 465 config['EMAIL_USE_SSL'] = True # Set extra config from the query string. qs = urlparse.parse_qs(uri.query) for key, values in qs.items(): if key == 'tls': config['EMAIL_USE_TLS'] = is_truthy(values[-1]) if key == 'ssl': config['EMAIL_USE_SSL'] = is_truthy(values[-1]) if key == 'certfile': config['EMAIL_SSL_CERTFILE'] = values[-1] if key == 'keyfile': config['EMAIL_SSL_KEYFILE'] = values[-1] if key == 'timeout': config['EMAIL_TIMEOUT'] = int(values[-1]) if key == 'localtime': config['EMAIL_USE_LOCALTIME'] = is_truthy(values[-1]) return config
__all__ = ['EmailConfig', 'parse']