fix(projekt-matching): store outgoing mail copies in Sent via IMAP append
This commit is contained in:
@@ -71,6 +71,39 @@ class MailBox:
|
||||
pass
|
||||
|
||||
|
||||
def _sent_folder(conn):
|
||||
"""Find the server's Sent folder via special-use flag, fallback names."""
|
||||
typ, data = conn.list()
|
||||
candidates = []
|
||||
for raw in data or []:
|
||||
line = raw.decode() if isinstance(raw, bytes) else str(raw)
|
||||
name = line.rsplit(" ", 1)[-1].strip('"')
|
||||
if "\\Sent" in line.split(")")[0]:
|
||||
return name
|
||||
candidates.append(name)
|
||||
for cand in ("Sent", "INBOX.Sent"):
|
||||
if cand in candidates:
|
||||
return cand
|
||||
return "Sent"
|
||||
|
||||
|
||||
def append_sent(user, password, msg, conn=None):
|
||||
"""Store a copy of an outgoing message in the Sent folder (best effort)."""
|
||||
own = conn is None
|
||||
conn = conn or imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT)
|
||||
try:
|
||||
if own:
|
||||
conn.login(user, password)
|
||||
folder = _sent_folder(conn)
|
||||
conn.append(folder, "(\\Seen)", None, msg.as_bytes())
|
||||
finally:
|
||||
if own:
|
||||
try:
|
||||
conn.logout()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
def send_mail(user, password, to, subject, body):
|
||||
msg = EmailMessage()
|
||||
msg["From"], msg["To"], msg["Subject"] = user, to, subject
|
||||
@@ -81,3 +114,7 @@ def send_mail(user, password, to, subject, body):
|
||||
server.starttls(context=ssl.create_default_context())
|
||||
server.login(user, password)
|
||||
server.send_message(msg)
|
||||
try:
|
||||
append_sent(user, password, msg)
|
||||
except Exception: # noqa: BLE001 — copy is best effort; the mail went out
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user