107 lines
3.3 KiB
Python
107 lines
3.3 KiB
Python
from dataclasses import dataclass
|
|
from typing import Any, Collection, Dict, Optional
|
|
|
|
from ._model import AccountConfig
|
|
from ._plugin import BaseMailPlugin, MailInPlugin, MailOutPlugin
|
|
|
|
|
|
@dataclass
|
|
class Account:
|
|
"""
|
|
Models a mail account.
|
|
"""
|
|
|
|
name: str
|
|
poll_interval: float
|
|
display_name: Optional[str] = None
|
|
incoming: Optional[MailInPlugin] = None
|
|
outgoing: Optional[MailOutPlugin] = None
|
|
monitor_folders: Optional[Collection[str]] = None
|
|
default: bool = False
|
|
last_check: Optional[float] = None
|
|
|
|
@classmethod
|
|
def build(
|
|
cls,
|
|
name: str,
|
|
timeout: float,
|
|
poll_interval: float,
|
|
display_name: Optional[str] = None,
|
|
incoming: Optional[Dict[str, Any]] = None,
|
|
outgoing: Optional[Dict[str, Any]] = None,
|
|
monitor_folders: Optional[Collection[str]] = None,
|
|
username: Optional[str] = None,
|
|
password: Optional[str] = None,
|
|
password_cmd: Optional[str] = None,
|
|
keyfile: Optional[str] = None,
|
|
certfile: Optional[str] = None,
|
|
access_token: Optional[str] = None,
|
|
oauth_mechanism: Optional[str] = None,
|
|
oauth_vendor: Optional[str] = None,
|
|
default: bool = False,
|
|
last_check: Optional[float] = None,
|
|
) -> 'Account':
|
|
account_args = {
|
|
'username': username,
|
|
'password': password,
|
|
'password_cmd': password_cmd,
|
|
'access_token': access_token,
|
|
'oauth_mechanism': oauth_mechanism,
|
|
'oauth_vendor': oauth_vendor,
|
|
'display_name': display_name,
|
|
}
|
|
|
|
in_plugin = None
|
|
if incoming:
|
|
server = incoming.pop('server', None)
|
|
assert server, 'No server provided for incoming mail for account "{name}"'
|
|
|
|
keyfile = incoming.pop('keyfile', keyfile)
|
|
certfile = incoming.pop('certfile', certfile)
|
|
account = AccountConfig(**{**account_args, **incoming})
|
|
in_plugin = BaseMailPlugin.build(
|
|
server=server,
|
|
account=account,
|
|
timeout=timeout,
|
|
keyfile=keyfile,
|
|
certfile=certfile,
|
|
)
|
|
|
|
assert isinstance(
|
|
in_plugin, MailInPlugin
|
|
), 'Incoming mail plugin expected for account "{name}"'
|
|
|
|
out_plugin = None
|
|
if outgoing:
|
|
server = outgoing.pop('server', None)
|
|
assert server, 'No server provided for outgoing mail for account "{name}"'
|
|
|
|
keyfile = outgoing.pop('keyfile', keyfile)
|
|
certfile = outgoing.pop('certfile', certfile)
|
|
account = AccountConfig(**{**account_args, **outgoing})
|
|
out_plugin = BaseMailPlugin.build(
|
|
server=server,
|
|
account=account,
|
|
timeout=timeout,
|
|
keyfile=keyfile,
|
|
certfile=certfile,
|
|
)
|
|
|
|
assert isinstance(
|
|
out_plugin, MailOutPlugin
|
|
), 'Outgoing mail plugin expected for account "{name}"'
|
|
|
|
return cls(
|
|
name=name,
|
|
display_name=display_name,
|
|
incoming=in_plugin,
|
|
outgoing=out_plugin,
|
|
monitor_folders=monitor_folders,
|
|
poll_interval=poll_interval,
|
|
default=default,
|
|
last_check=last_check,
|
|
)
|
|
|
|
|
|
# vim:sw=4:ts=4:et:
|