all repos — postern @ fc287763b9ce6b6f9823e11c0b1173da0446ebc5

Modern mail management

policy.star (view raw)

 1def init():
 2    # Same TLS cert for all handlers
 3    cert_file = "./localhost.pem"
 4    key_file = "./localhost-key.pem"
 5
 6    # SMTP Inbound
 7    reception_addr = os.getenv("RECEPTION_ADDR", "0.0.0.0:10025")
 8    mda.listen(
 9        address = reception_addr,
10        role = "smtp_inbound",
11        tls_cert_file = cert_file,
12        tls_key_file = key_file,
13    )
14
15    # SMTP Submission
16    submission_addr = os.getenv("SUBMISSION_ADDR", "0.0.0.0:465")
17    mda.listen(
18        address = submission_addr,
19        role = "smtp_submission",
20        tls_cert_file = cert_file,
21        tls_key_file = key_file,
22    )
23
24    # SMTP Local Submission
25    mda.listen(
26        address = "127.0.0.1:12325",
27        role = "smtp_local_submission",
28        tls_cert_file = "",
29        tls_key_file = "",
30    )
31
32    # IMAP
33    imap_addr = os.getenv("IMAP_ADDR", "0.0.0.0:993")
34    mda.listen(
35        address = imap_addr,
36        role = "imap",
37        tls_cert_file = cert_file,
38        tls_key_file = key_file,
39    )
40
41def on_message_deliver(conn, user, msg):
42    if msg.header_to.address.startswith("extra-address"):
43        return "extra"
44    dec = user.gatekeeper.get_decision(msg)
45    if not dec:
46        return "Gatekeeper"
47    return dec
48
49def on_message_moved(user, msg, source_folder, dest_folder):
50    if source_folder == "Gatekeeper" and dest_folder in ["Junk", "Trash"]:
51        user.gatekeeper.route_to(msg.header_from, "Junk")
52        return
53    if source_folder == "Gatekeeper":
54        user.gatekeeper.route_to(msg.header_from, "INBOX")
55
56def on_message_submit(user, msg):
57    return {
58        "host": "relay.p25.dev",
59        "port": 2587,
60        "username": os.getenv("RELAY_USERNAME", ""),
61        "password": os.getenv("RELAY_PASSWORD", ""),
62    }