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 }