1{
2 d,
3 ifThen,
4 otherwise,
5}:
6# Queue Management
7# https://stalw.art/docs/mta/outbound/overview
8{
9 # Virtual Queues
10 # https://stalw.art/docs/mta/outbound/queue
11 virtual.default.threads-per-node = 100;
12 virtual.admin.threads-per-node = 10;
13 virtual.local.threads-per-node = 100;
14 # Schedules
15 # https://stalw.art/docs/mta/outbound/schedule
16 schedule =
17 let
18 queue = {
19 retry = [
20 "1m"
21 "2m"
22 "5m"
23 "10m"
24 "15m"
25 "30m"
26 "1h"
27 "2h"
28 ];
29 notify = [
30 "1d"
31 "3d"
32 ];
33 max-attempts = 15;
34 };
35 in
36 {
37 default = queue // {
38 queue-name = "default";
39 };
40 admin = queue // {
41 queue-name = "admin";
42 };
43 local = queue // {
44 queue-name = "local";
45 };
46 };
47 # Routes
48 # https://stalw.art/docs/mta/outbound/routing
49 route = {
50 local.type = "local";
51 remote = {
52 type = "mx";
53 ip-lookup = "ipv6_then_ipv4";
54 tls.implicit = false;
55 tls.allow-invalid-certs = false;
56 };
57 };
58 # Strategies
59 # https://stalw.art/docs/mta/outbound/strategy
60 strategy = {
61 schedule = [
62 (ifThen "is_local_domain('', rcpt_domain)" "'local'")
63 (ifThen "source = 'dsn'" "'admin'")
64 (ifThen "source = 'report'" "'admin'")
65 (ifThen "source = 'autogenerated'" "'admin'")
66 (otherwise "'default'")
67 ];
68 route = [
69 (ifThen "is_local_domain('', rcpt_domain)" "'local'")
70 (otherwise "'remote'")
71 ];
72 connection = "'default'";
73 tls = "'default'";
74 };
75 # Remote Connection
76 # https://stalw.art/docs/mta/outbound/connection
77 connection.default = {
78 ehlo-hostname = d.extUrl;
79 source-ips = d.extIPs;
80 timeout = {
81 connect = "3m";
82 greeting = "3m";
83 ehlo = "3m";
84 mail-from = "3m";
85 rcpt-to = "3m";
86 data = "10m";
87 };
88 };
89 tls.default = {
90 dane = "optional";
91 mta-sts = "optional";
92 starttls = "optional";
93 allow-invalid-certs = false;
94 timeout.tls = "3m";
95 timeout.mta-sts = "3m";
96 };
97}