49 lines
1.3 KiB
Python
49 lines
1.3 KiB
Python
from app.schemas import MailAddress
|
|
|
|
|
|
def _addresses(items: list[dict] | list[MailAddress] | None) -> list[str]:
|
|
if not items:
|
|
return []
|
|
values: list[str] = []
|
|
for item in items:
|
|
if isinstance(item, dict):
|
|
address = item.get("address", "")
|
|
else:
|
|
address = item.address
|
|
if address:
|
|
values.append(address.lower())
|
|
return values
|
|
|
|
|
|
def reply_recipients(
|
|
*,
|
|
message: dict,
|
|
viewer_email: str,
|
|
reply_all: bool = False,
|
|
) -> tuple[list[str], list[str]]:
|
|
viewer = viewer_email.lower()
|
|
own_addresses = {viewer}
|
|
|
|
reply_to = _addresses(message.get("reply_to"))
|
|
sender = _addresses([message.get("sender", {})])
|
|
to = _addresses(message.get("to") or message.get("recipients"))
|
|
cc = _addresses(message.get("cc"))
|
|
|
|
primary = reply_to or sender
|
|
primary = [address for address in primary if address not in own_addresses]
|
|
|
|
if not reply_all:
|
|
return primary, []
|
|
|
|
recipients = []
|
|
for address in [*primary, *to, *cc]:
|
|
if address in own_addresses or address in recipients:
|
|
continue
|
|
recipients.append(address)
|
|
|
|
if not recipients and primary:
|
|
recipients = primary
|
|
|
|
to_out = recipients[:1] if recipients else []
|
|
cc_out = recipients[1:] if len(recipients) > 1 else []
|
|
return to_out, cc_out
|