mirror of
https://github.com/KumoCorp/kumomta.git
synced 2026-09-06 00:00:51 +00:00
This commit adds some plumbing to facilitate generation of RFC 3464 non-delivery reports and some corresponding glue to enable calling it from lua. Examples in the docs that are also added.
115 lines
2.7 KiB
Lua
115 lines
2.7 KiB
Lua
local kumo = require 'kumo'
|
|
package.path = '../../assets/?.lua;' .. package.path
|
|
|
|
local TEST_DIR = os.getenv 'KUMOD_TEST_DIR'
|
|
local SINK_PORT = tonumber(os.getenv 'KUMOD_SMTP_SINK_PORT')
|
|
|
|
local queue_module = require 'policy-extras.queue'
|
|
local log_hooks = require 'policy-extras.log_hooks'
|
|
|
|
local queue_helper = queue_module:setup {
|
|
{
|
|
queue = {
|
|
default = {
|
|
-- Redirect traffic to the sink
|
|
protocol = {
|
|
smtp = {
|
|
mx_list = { 'localhost:' .. SINK_PORT },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
local function ndr_generator(msg, log_record)
|
|
print('NDR?', kumo.serde.json_encode_pretty(log_record))
|
|
|
|
local bounce_msg = kumo.generate_rfc3464_message({
|
|
include_original_message = 'FullContent',
|
|
enable_expiration = false,
|
|
enable_bounce = true,
|
|
reporting_mta = {
|
|
mta_type = 'dns',
|
|
name = 'mta1.example.com',
|
|
},
|
|
stable_content = true,
|
|
}, msg, log_record)
|
|
|
|
if bounce_msg then
|
|
print 'YES, try injecting'
|
|
local ok, err = pcall(kumo.inject_message, bounce_msg)
|
|
if not ok then
|
|
kumo.log_error('failed to inject NDR: ', err)
|
|
end
|
|
end
|
|
end
|
|
|
|
log_hooks:new_disposition_hook {
|
|
name = 'ndr_generator',
|
|
hook = ndr_generator,
|
|
}
|
|
|
|
kumo.on('init', function()
|
|
kumo.configure_accounting_db_path(TEST_DIR .. '/accounting.db')
|
|
|
|
local relay_hosts = { '0.0.0.0/0' }
|
|
kumo.start_esmtp_listener {
|
|
listen = '127.0.0.1:0',
|
|
relay_hosts = relay_hosts,
|
|
deferred_queue = false,
|
|
}
|
|
|
|
kumo.start_http_listener {
|
|
listen = '127.0.0.1:0',
|
|
}
|
|
|
|
kumo.configure_local_logs {
|
|
log_dir = TEST_DIR .. '/logs',
|
|
max_segment_duration = '1s',
|
|
headers = { 'X-*', 'Y-*', 'Subject' },
|
|
}
|
|
|
|
kumo.define_spool {
|
|
name = 'data',
|
|
path = TEST_DIR .. '/data-spool',
|
|
}
|
|
|
|
kumo.define_spool {
|
|
name = 'meta',
|
|
path = TEST_DIR .. '/meta-spool',
|
|
}
|
|
end)
|
|
|
|
kumo.on('get_listener_domain', function(domain, listener, conn_meta)
|
|
return kumo.make_listener_domain {
|
|
relay_to = true,
|
|
log_oob = true,
|
|
log_arf = true,
|
|
}
|
|
end)
|
|
|
|
kumo.on('smtp_server_message_received', function(msg)
|
|
local result = msg:import_scheduling_header 'X-Schedule'
|
|
kumo.log_info('schedule result', kumo.serde.json_encode(result))
|
|
end)
|
|
|
|
kumo.on('get_egress_source', function(source_name)
|
|
return kumo.make_egress_source {
|
|
name = source_name,
|
|
}
|
|
end)
|
|
|
|
kumo.on('get_egress_path_config', function(domain, source_name, _site_name)
|
|
-- Allow sending to a sink
|
|
local params = {
|
|
enable_tls = 'OpportunisticInsecure',
|
|
prohibited_hosts = {},
|
|
opportunistic_tls_reconnect_on_failed_handshake = false,
|
|
}
|
|
|
|
kumo.log_warn('get_egress_path_config *******************', domain)
|
|
|
|
return kumo.make_egress_path(params)
|
|
end)
|