What we did on our summer vacation. JK - this is a big one

  • October 13, 2025

You have waited much longer than normal for a new KumoMTA release, but the wait is over. We spent the summer grinding out some important feature additions to bring you... wait for it... THE FALL RELEASE!

No, there is no sand in our keyboards, though we tried to enjoy our summer as much as anyone else.  There was, however, a lot of activity on user enhancement requests from our gold sponsors.  These include a range of new tools for message validation and manipulation, injection handling, file system access, and bounce management. If you are active in our Discord, then you knew this a few days ago. The changelog is posted here. Now we can dive into the details.

Let's start with message handling.

Several users asked for the ability to deconstruct a message.  The new function parse_mime gives you the ability to break a message down to its mimeparts for easier security scanning and manipulation, allowing you to do things like strip attachments or scan HTML content.

Messages injected with the HTTP Inject API can now use compression to shrink the size of a payload. All HTTP endpoints now support transparently decompressing deflate and gzip compressed payloads, which means that your injectors can compress the content being injected via the HTTP injection API to reduce bandwidth costs. In addition, HTTP Injected messages now report received_via and hostname in the message metadata.

Trusted injectors can now use XCLIENT to override session properties such as received_via and/or received_from, which is primarily useful for testing.

We now have full support SMTPUTF8 and 8BITMIME, so these extensions are now advertised at EHLO.  Our spin on this is that your policy can choose to perform any necessary conversion from 8bit at reception time. If a message is 8bit at delivery time, and the next hop doesn't also support SMTPUTF8 and/or 8BITMIME, then we'll mark the message as failed.

Further, SMTP messages injected via TLS will report the cipher and protocol version in the trace headers and in the reception log record.

For routing SMTP messages to other hosts, we have included the ability to define a target port when configuring make_queue_config ().protocol with an mx_list or when assigning a routing_domain, for example, which is handy if you are rebinding a message to migrate it to a different host.

Another big area of enhancement request was in logging.

Logging now supports a simple wildcard suffix matching of meta names, allowing capture of all meta fields via * or all prefixed names via prefix*.

In addition, we have added two new fields for reporting sub-second time events.  The new event_time and created_time fields in Log Record provide sub-second time stamp granularity. 

Also, you can now generate RFC 3464 non-delivery reports using kumo.generate_rfc3464_message , where you need to pass a full bounce message back to an injector.

Not specifically for logging, but we have added a kumo.fs module for efficiently working with the filesystem.  Functions include kumo.fs.read_dir, kumo.fs.glob and kumo.fs.uncached_glob as well as a new kumo.fs.open function that can create async-capable file handles; reading/writing via these functions cooperates with the IO scheduler and won't bog down the rest of the system when the storage device(s) are under pressure.

In other networking enhancements...

We've added a new tls_required_client_ca parameter to aid in configuring mTLS. This allows you to specify a certificate authority file for validating client certificates.

You can now use the kumo.dns.lookup_ptr function for looking up PTR records.  In certain situations, you may want to validate the PTR record of a sender or recipient IP.  Among other things, this can aid in security scanning of senders. 

We added the shaping/egress_path try_next_host_on_transport_error option to more aggressively retry transport error failures. This helps aid with faster delivery when you encounter transport or protocol errors not directly related to the message itself.

This was a big one, and we certainly did not do it alone.  Many thanks go to all of our gold sponsors for supporting our work, but special thanks go to those who generated enhancement requests, particularly @kayozaki , @dschaaff and @pankajrathi95, who contributed some great PRs to the project.

------------------------------------------------------------------

KumoMTA is the first open-source MTA designed from the ground up for the world's largest commercial senders. We are fueled by Professional Services and Sponsorship revenue.

Join the Discord | Review the Docs | Read the Blog | Grab the Code | Support the team