Skip to content

Unreleased Changes in The Mainline

Breaking Changes

  • Enabling batch_handling="BatchByDomain" will cause message:recipient and the recipient field of Log Record to switch to an array holding the list of recipients. These are NOT active by default, but if you wish to enable them you should audit your policy and consider switching to using message:recipient_list as well as review your log processors to ensure that they are able to handle the recipient field being either an array or a string, or otherwise adjusting your log templates accordingly.
  • HTTP injections no longer consider the Forwarded header as a source of information to populate the received_from metadata. Instead, only the directly connecting IP information will be used. See the upstream issue for more information.

Other Changes and Enhancements

  • msg:check_fix_conformance now supports optionally detecting and fixing 8-bit charsets.
  • smtp_server_data event enables once-per-transaction processing of a message and recipient list modification for alias expansion and legal capture.
  • Admin bounces and scheduled queue suspensions can now optionally target the complete queue name instead of matching by domain/campaign/tenant. This is useful in certain automation scenarios where you wish to target a specific queue precisely. The kcli commands support a --queue option to select the queue name, while the API expose that via a queue_names field.
  • New kcli xfer and kcli xfer-cancel commands enable migration of queues to alternative kumomta nodes as part of operational tasks such draining a queue for decomissioning or scaling down infrastructure. These commands are building blocks for you to deploy auto-scaling or similar functionality within your infrastructure orchestration. The new xfer_message_received can be used to fixup messages as they are arrive on the target node via xfer. XferOut and XferIn are two new log record types associated with message transfers. The kcli commands have corresponding HTTP API endpoints: xfer and xfer-cancel #311
  • New kumo.file_type module provides functions for reasoning about file types.
  • kumo.amqp.build_client is deprecated in favor of kumo.amqp.basic_publish.
  • New kumo.dns.ptr_host, kumo.dns.reverse_ip, kumo.dns.define_resolver and kumo.dns.rbl_lookup functions. #269
  • new smtp_server_rejections counter to track the number of Rejection log records produced by the smtp listener. The service key is the listener address and port, and there is a total key that represents the total across all listeners.
  • new kumo.spf.check_msg convenience function for checking SPF and producing Authentication-Results once the data has been received.
  • new kumo.crypto module. Thanks to @dariomaiocchi! #395
  • new Time and TimeDelta objects.
  • new smtp_server_rewrite_response event.
  • msg:append_header and msg:prepend_header both now accept an optional ENCODE parameter that opts in to wrapping or quoted-printable encoding the value as appropriate.
  • new headermap:append method for appending a header. This supplements the already available :prepend method.
  • new kumo.string.wrap function that enables manual wrapping of strings for use in, for example, header values.

Fixes

  • smtp server would incorrectly return a 451 instead of a 452 status when max_recipients_per_message or max_messages_per_connection limits were exceeded.
  • spf: a NoRecordsFound response from DNS during an exists: rule check could cause the result to incorrectly be reported a temperror
  • spf: %{h} macro expansion could incorrectly enclose the domain in double quotes
  • spf: relax macro parsing to allow spaces in, for example, explanation txt records
  • kumo.spf.check_host: %{h} will be assumed to have the value of the domain field when sender is not set, as ehlo_domain won't be set in the connection context until after smtp_server_ehlo returns successfully.
  • kumo.start_esmtp_listener.line_length_hard_limit could by off-by-two in certain cases when applied to DATA, and could sometimes allow up to 1024 bytes for a single SMTP command outside of DATA, even though the limit was set smaller.
  • Message builder API didn't quote every possible character that needed to be quoted in the display name of a mailbox. #428
  • Incorrectly treated a 552 as a transient failure for non-RCPT-TO 552 responses. #431
  • spf: we now populate smtp.mailfrom in the Authentication-Results props map.
  • keysource now supports inline binary bytes being passed via key_data. Previously, only UTF-8 strings could be passed that way.
  • keysource now supports callback/event based data loading, which is similar to inline key_data, but allows for more efficient cache keys that use less RAM.