<a id="changelog"></a>

# Changelog

<a id="v6-12"></a>

<a id="id1"></a>

## 6.12

Released 2026-10-28

- **Imp** MTA improvements
  - Added support for [`servers[].timeout.idle`](config_smtpd.html.md#confval-servers-.timeout.idle) for HTTP servers
  - Added support for [`monitor.timeout.idle`](config_smtpd.html.md#confval-monitor.timeout.idle) for the monitoring interface
  - Added support exposing the HSL cache statistics on the monitoring interface
  - Added support in the Proxy hook to request the `Next` line without sending a response
  - Added support for lookupdirs for cert and CRL ([`environment.controlsocket.tls.lookupdirs.paths[]`](config_startup.html.md#confval-environment.controlsocket.tls.lookupdirs.paths))
  - Added `expires` argument to Post-delivery hook to see how many messages there are left until the message expires
  - Added `expired` and `expires` argument to Pre-delivery hook
  - Added message bound immutable data (context) to the queued message object, `MailMessage.setContext` and  `MIME.setContext`
  - Added [`resolver.threads.ready`](config_startup.html.md#confval-resolver.threads.ready) threads to process ready DNS resolvings
  - Added `state` to more `error`’s in post-delivery hook
- **Imp** Script language improvements
  - Added a `reverse` options to `MIMEPart.getHeader` function
  - Added support for `maxmessagesize` setting to the Connect hook
  - Added support for `tls` setting to the Connect hook
  - Added support for `password` protected private key `ec/ed25519/rsa_privatekey`
  - Added support for a `miss_function` callback for `cache []`s
  - Added a deterministic seed to `array_shuffle`, `array_random` and `random_number`
  - Added a `keys` options to `array_filter` and `array_find` function
  - Added a `exclude_headers` options to `Bounce` function
  - Added support for sub-second resolution in `Socket.settimeout`
  - Added support objects decoding options in `json_decode`
  - Added support objects encoding in `json_encode`
  - `foreach` may now iterate objects public members
  - For SMTP verfications, `tls_verify_name` may now include the connecting peer with `tls_verify_name_include_host`
- **Imp** Native (C ABI) plugin improvements
  - `HalonMTA_inject_new2` to support selecting the transactionid during injection
- **Bug**
  - Expired DKIM signature errors now include full tag list
  - Minor formating issues with DSN (missing <> on References)
  - Outbound XCLIENT now sends HELO as first command after negotiation
  - Protobuf API: Exclude on tag was not respected for policies and suspend listing
  - Protobuf API: Removed unused support for using exclude on local-part in queue list and queue groupby
  - Protobuf API: suspended filter did not work with only one suspend that suspends everything
  - DNS cached the results by the longest and not shortest of multiple RR type responses
- **Note** Important changes
  - Verifies that privatekey matches X.509 certificates during startup (early error)
- **Pkg** Packaging
  - Update curl to 8.23.0
  - Update openssl to 3.6.5
  - Update c-ares to 1.34.9

<a id="v6-11-4"></a>

<a id="id2"></a>

## 6.11.4

Released 2026-09-11

- **Bug** Fix deadlock that could occur when `halon-clusterd` was restarted

<a id="v6-11-3"></a>

<a id="id3"></a>

## 6.11.3

Released 2026-07-31

- **Bug** Fix deadlock that could occur when `halon-clusterd` was restarted

<a id="v6-11-2"></a>

<a id="id4"></a>

## 6.11.2

Released 2026-07-13

- **Bug** systemd services now depend on `network-online.target` (instead of `network.target`)
- **Bug** C-ABI define issue with `HALONMTA_METRIC_*`
- **Bug** Fix timeout with fractions of seconds for outbound connections
- **Pkg** Packaging
  - Reverted c-ares to 1.34.6 (patch release introduced a bug, CVE risk is low)

<a id="v6-11-1"></a>

<a id="id5"></a>

## 6.11.1

Released 2026-07-07

- **Bug** `halonconfig --unpack` could fail to unpack some files (keeping them in smtpd.yaml)
- **Bug** Made OpenMetrics output more compliant with standard
- **Pkg** Packaging
  - Update libevent to 2.1.13
  - Update c-ares to 1.34.7

<a id="v6-11"></a>

<a id="id6"></a>

## 6.11

Released 2026-06-25

- **Imp** MTA improvements
  - Added support for [`servers[].tls.groups`](config_smtpd.html.md#confval-servers-.tls.groups) to configure TLS key exchange groups throughout
  - Now [`cluster.startup.hosts`](config_startup.html.md#confval-cluster.startup.hosts) works without [`cluster.address`](config_startup.html.md#confval-cluster.address)
  - Added support for client name verification on the API endpoint `environment.controlsocket.tls.clientnames`
  - Added support for custom CAs on the API endpoint `environment.controlsocket.tls.cacerts`
  - Added support for custom CRLs on the API endpoint `environment.controlsocket.tls.crls`
  - Added [`queues.pickup.prereaddata`](config_smtpd.html.md#confval-queues.pickup.prereaddata) to control spool in behaviour and [`queues.pickup.backpressure`](config_smtpd.html.md#confval-queues.pickup.backpressure) to enforce backpressure while stressed
- **Imp** Script language improvements
  - Added native support for `soa` records in `dns_query` function
  - Added `Map.toArray` and `Set.toArray` functions
  - Added `X509.chain` functions
  - Added `cms_type` function
  - Added `cms_recipients` function
  - Added `pkcs11_load` function to fetch `PrivateKeys` from an HSM
  - Added `is_x509_resource` and `is_x509crl_resource` functions
  - Added `cipher`, `usekeyid` option to `cms_encrypt` function
  - Added `noattr`, `binary`, `nosmimecap`, `usekeyid` and `digest` option to `cms_sign` functions
  - Added `binary` option to `cms_verify` functions
  - `cms_verify` now always include `certs` in results (not trusted).
- **Imp** Command line tool improvements
  - Improved performance on `queue list` with `--json` output.
  - Added a `--localip-exact` option to always match a specific set of IPs.
  - Added a `--localip-exclude` option.
- **Note** Important changes
  - HTTP, Plugin and protobuf now also checks the [`queues.maxmessages`](config_smtpd.html.md#confval-queues.maxmessages) setting
  - Optional TLS is not default for configuration version 6.11 and above
- **Pkg** Packaging
  - Update OpenSSL to 3.6.3
  - Update Iconv to 1.19
  - Update curl to 8.21.0
  - Added support for Ubuntu 26.04 and RHEL10 (amd64, arm64)
- **Note** Reduced syslog output from verifyDKIM function in HSL
- **Note** Metadata keys prefix with `_` are no longer reserved
- **Note** 5min TCP keep-alive enabled for [`cluster.address`](config_startup.html.md#confval-cluster.address) peer
- **Note** Improved random distribution for localip in the queue for certain traffic patterns

<a id="v6-10-7"></a>

<a id="id7"></a>

## 6.10.7

Released 2026-06-23

- **Bug** Formating of IPv6 DNS servers in `halontop` broke table rendering
- **Bug** Issue with multiple subnets matching in Protobuf queue filter logic
- **Bug** Fix issue with split threadpool for pre and post-delivery with background tasks

<a id="v6-10-6"></a>

<a id="id8"></a>

## 6.10.6

Released 2026-04-28

- **Pkg** Update OpenSSL to 3.5.6
- **Bug** Fixed issue where `helo` and `remotegreet` was not always available in Post-delivery hook
- **Bug** Fixed wrong content type for attached original messages in async bounces

<a id="v6-10-5"></a>

<a id="id9"></a>

## 6.10.5

Released 2026-04-10

- **Bug** Fixed a slow-growing memory leak
- **Bug** Do not include hqf or eml data in audit logs on import

<a id="v6-10-4"></a>

<a id="id10"></a>

## 6.10.4

Released 2026-03-17

- **Bug** Fixed issue with `halonconfig` on CentOS 7
- **Bug** Fixed issue with symlinks and `rootpath`/`pluginspath`
- **Bug** Fixed issue with `int` and `float` casting when using env variables in YAML config

<a id="v6-10-3"></a>

<a id="id11"></a>

## 6.10.3

Released 2026-03-13

- **Bug** Fixing a version issue in the configuration files with `version: 6.10`

<a id="v6-10-2"></a>

<a id="id12"></a>

## 6.10.2

Released 2026-03-12

- **Bug** Fix rare deadlock when fetching the queue suspend list on a busy system
- **Pkg** Update curl to 8.19.0

<a id="v6-10-1"></a>

<a id="id13"></a>

## 6.10.1

Released 2026-03-05

- **Bug** Fix issue with `halonconfig` `dist` output when using custom `!Env` tags

<a id="v6-10"></a>

<a id="id14"></a>

## 6.10

Released 2026-02-23

- **Imp** MTA improvements
  - Inbound processing performance improvements
  - Queue policy lookup performance with multiple conditions
  - TLS support for smtpd control socket ([`environment.controlsocket.tls`](config_startup.html.md#confval-environment.controlsocket.tls))
  - Automatic priority for DNS resolver queues
  - Added [`cluster.tls.verifyname`](config_startup.html.md#confval-cluster.tls.verifyname) setting
  - Start with a fixed number of assumed hosts if `clusterd` service is unavailable ([`cluster.startup.hosts`](config_startup.html.md#confval-cluster.startup.hosts))
  - Added support for `!Env` (environment variable substitution) in configuration files
  - Allow for a custom search path ([`environment.pluginspath`](config_startup.html.md#confval-environment.pluginspath))
  - Set the supplementary groups (from the user) when privdropping
- **Imp** Script language improvements
  - Added a `MailMessage.renameHeader` function
  - Added support for `X509CRL` (Certificate Revocation List)
  - Added a `metrics_get` function
  - `json_decode` function now supports `unicode_byte` encoding
  - Added capability to extract peer certificate chain
  - Access HELO hostname from post-delivery
  - Added support for `"tls" => "trust", "tls_trust_anchor" = []`
  - Added easier support for none-expiring cache item (only by size and config reload)
  - Added `remoteptrresult` to connect hooks arguments (to understand why a no FCrDNS was set)
  - Allow HSL plugins to access it’s plugin configuration
- **Imp** Native (C ABI) plugin improvements
  - `HalonMTA_hsl_value_to_json2` to support encoding flags
  - `HalonMTA_hsl_value_from_json2` to support decoding flags
- **Imp** Command line tool improvements
  - Added command to view the DNS queue (`halonctl resolver queue`)
  - Added a queue analyze command to view queue structure (`halonctl queue analyze`)
  - Show table footer and if more data is available in output
- **Dep** Important changes
  - Renamed configuration setting `cluster.pki` to `cluster.tls` (for 6.10 configuration versions)
- **Pkg** Packaging
  - Update OpenSSL to 3.5.5
  - Update curl to 8.18.0
  - Update c-ares to 1.34.6
- **Bug** Fix issue with casing for the `signDKIM` `exclude_headers` option
- **Bug** Fix schema validation issue with event threads for HTTP servers

<a id="v6-9-1"></a>

<a id="id15"></a>

## 6.9.1

Released 2025-12-08

- **Bug** Active config counter could get out of sync in `process-stats` output
- **Bug** Fix issue when unpacking configuration with `halonconfig`
- **Bug** Fix issue with metrics histograms without explicit +inf buckets
- **Bug** Use correct metric types for OpenMetrics endpoint
- **Bug** Fix logging issue when unloading messages from queue
- **Pkg** Update c-ares to 1.34.6

<a id="v6-9"></a>

<a id="id16"></a>

## 6.9

Released 2025-10-13

- **Imp** MTA improvements
  - Policy API now supports static policies and improved filtering
  - Structured audit logs for all control socket requests
  - Added statistics counter for requeues by plugin
- **Imp** Script language improvements
  - Added `ec_privatekey` and `is_ec_privatekey` functions
  - Added `cms_(encrypt,decrypt,sign,verify)` functions
  - Added `MIMEPart.getTypeParameter()` function to MailMessage
  - Added `server_concurrency(serverid, remoteip)` to hooks
  - Added `remotegreet` to connection object in postdelivery hook
- **Pkg** Packaging
  - Update OpenSSL to 3.5.4
  - Update curl to 8.16.0
- **Bug** Bug fixes
  - Improved DNS behavior for multi-stack DNS error

<a id="v6-8"></a>

<a id="id17"></a>

## 6.8

Released 2025-08-27

- **Imp** MTA improvements
  - Added support for multiple certificates on the same listern (eg. ECDSA and RSA)
  - A new and modern SPF implementation
- **Pkg** Packaging
  - Updated OpenSSL to 3.5.2
  - Dropped 3rd party dependency on libfort (for CLI tables)
  - Dropped 3rd party dependency on libspf2
- **Bug** Bug fixes
  - The `mx_include` and `mx_exclude` resolver settings in HSL now match caseless
  - Using negative numbers for custom properties in `smtpd-policy.yaml` is now allowed
  - It was not possible to navigate to the system page in `halontop` using they arrow keys
  - Fixed concurrency issue with clusterd and deliver plugins (eg. http-deliver)
  - Improve error message for specific socket error

<a id="v6-7-1"></a>

<a id="id18"></a>

## 6.7.1

Released 2025-06-30

- **Bug** Fix configuration validation issue with `metrics_` functions
- **Pkg** Update curl to 8.14.1

<a id="v6-7"></a>

<a id="id19"></a>

## 6.7

Released 2025-06-25

- **Imp** MTA improvements
  - Added regex matching for tags, when querying the list of current suspensions via [API](api_reference.html.md)
  - Added support for [`custom metrics`](config_smtpd.html.md#confval-monitor.metrics) in [OpenMetrics](openmetrics.html.md) output, see also [Monitor](api_monitor.html.md) HTTP endpoint
  - Added support for different types of [dynamic policies](queue_policy.html.md#queue-policy-precedence) (backoff and warmup) with precedence
  - Break dynamic, backoff and warmup policies into distinct lists (performance enhancement)
  - Can set custom `algorithm` per policy in [`policies[].conditions[].then.rate`](config_policy.html.md#confval-policies-.conditions-.then.rate) (also via protobuf API and HSL). This is used by the new warm-up process
  - Disable Halon-generated DSNs on specific [`transports`](config_smtpd.html.md#confval-transportgroups-.transports), useful when DSNs are enabled at [`transportgroups[].dsn`](config_smtpd.html.md#confval-transportgroups-.dsn) level
  - Can force sending a success notification (useful to work around misbehaving receiving systems, i.e. regardless of the DSN extension support declared by the recipient side)
  - [halonctl process-stats](cli_stats.html.md#halonctl-process-stats) now shows number of queries using TCP statistics (also in [halontop](cli_stats.html.md#halontop))
  - DNS resolver: treat certain recipient domains as higher-priority ([`resolver.domain.priority[]`](config_smtpd.html.md#confval-resolver.domain.priority))
  - DNS resolver: added support for priority queue deduplication
  - DNS resolver: set custom [`resolver.ednsbuffersize`](config_startup.html.md#confval-resolver.ednsbuffersize)
  - DNS resolver: Can now set equal (ipv4/ipv6) [`resolver.preference`](config_smtpd.html.md#confval-resolver.preference)
  - Can configure protocols, ciphers and ciphersuites in `smtpd-app.yaml` (per transport/transportgroups, in [`transportgroups[].session.tls.protocols`](config_smtpd.html.md#confval-transportgroups-.session.tls.protocols) etc) and in `smtpd-delivery.yaml` ([`delivery.conditions[].then.tls.protocols`](config_delivery.html.md#confval-delivery.conditions-.then.tls.protocols) etc)
  - Added support for domain wild-card prefix in grouping fields, e.g. [`queues.grouping.groupings[].recipientdomain[]`](config_smtpd.html.md#confval-queues.grouping.groupings-.recipientdomain)
  - Can set [`servers[].phases.rcptto.maxdomains`](config_smtpd.html.md#confval-servers-.phases.rcptto.maxdomains) to restrict the number of unique recipient domains allowed per incoming message
  - Enforce stricter multipart boundary parsing by default ([`servers[].phases.data.multipart.strict`](config_smtpd.html.md#confval-servers-.phases.data.multipart.strict))
- **Imp** Native (C ABI) plugin improvements
  - Added `Halon_queue_insert_callback` to alter information before queueing.
  - Added `HalonMTA_queue_setinfo` to modify a message’s queued IPs.
  - Added `HalonMTA_inject_connection_set` to set connection information for a injected message.
  - Added ability to set a custom ID for `HalonMTA_queue_suspend_add5` and `HalonMTA_queue_policy_add6`
  - Added ability to set stop flag when updating policies `HalonMTA_queue_policy_update4`
- **Imp** Command line tool improvements
  - Ability to set equal (v4/v6) delivery preference for the `resolver query` command
  - Ability to set custom ratealgorithm per policy
  - Added regex matching for tags when doing suspend listing
  - Added support for different types of dynamic policies (backoff and warmup)
- **Pkg** Packaging
  - Migrated to pcre2 (from pcre1)
    : - If you use the `halon-extras-suppression-list` or `halon-extras-bounce-list` packages these also needs to be updated to `2.0.0` and `2.0.1` respectively at the same time as the main `halon` package is
  - Migrated to OpenSSL 3.5 (from OpenSSL 1.1.x). This will disable TLS 1.0 and 1.1 outbound by default

<a id="v6-6-3"></a>

<a id="id20"></a>

## 6.6.3

Released 2025-06-09

- **Bug**  Forcefully disconnect pending `halonctl queue trace` on shutdown
- **Bug**  Shorten timeout when connecting to clusterd
- **Bug**  Fix issue with configuration validation for HTTPS metrics endpoints
- **Bug**  Present proper errors when trying to reload appconf without permission
- **Bug**  Fixed a rare issue with `cache []` that could case process restarts
- **Bug**  Fixed a rare issue with metrics presenting a bad value for `script.suspended`

<a id="v6-6-2"></a>

<a id="id21"></a>

## 6.6.2

Released 2025-04-28

- **Bug** Fix rare issue with stale DNS queries

<a id="v6-6-1"></a>

<a id="id22"></a>

## 6.6.1

Released 2025-04-04

- **Bug** Fix issue with argument validation to `halonctl queue trace` command
- **Bug** Fix issue when configuring background update rate without specifing thread count
- **Bug** Fixed stability issue when running `halonctl process-stats` during a very short period during startup
- **Bug** Downgraded included c-ares package due to potential stability regression (1.33.1 same as in 6.4.x)

<a id="v6-6"></a>

<a id="id23"></a>

## 6.6

Released 2025-03-26

- **New** MTA features
  - Added support for a [monitoring](api_monitor.html.md) HTTP interface (for OpenMetrics and health checks)
  - Added support for background queue updates (`halonctl queue update --background ...`)
  - Added support for inbound connection prioritization [`servers[].priority.remoteips`](config_smtpd.html.md#confval-servers-.priority.remoteips)
  - Configuration files now accepts time and byte format as text, eg. `10MiB` or `2d` in more places
  - Improved performance for configuration reload, and [metrics](openmetrics.html.md) for its usage
  - Added support for configuring *sourceip* when connecting to PROXY server(s) in configuration file
- **Imp** Script language improvements
  - Added `uuidv5()` function
  - Added `base64url_encode()` and `base64url_decode()` functions
  - `queue_suspend()` and `queue_policy()` now supports user-defined UUIDs
  - Added support for inbound connection prioritization in all hooks
  - Added capability of sending copies of bounces in pre- and post-delivery.
- **Imp** Native (C ABI) plugin improvements
  - Added [`HalonMTA_health_get()`](plugins_native.html.md#c.HalonMTA_health_get) and [`HalonMTA_health_set()`](plugins_native.html.md#c.HalonMTA_health_set) functions, to alter health status
- **Imp** Command line tool improvements
  - Added DNS resolver insights in `halontop` and `halonctl resolver list`
  - Added capability to run queue updates in background (`--background --progress`)
  - Added capability to manually affect the system health (`halonctl health set --unhealthy`)
  - Now support time and byte format as values, eg. `10MiB` or `2d` for a lot more commands.
- **Pkg** Packaging
  - Update curl to 8.12.1
  - Update libevent to 2.1.12
- **Bug** Bug fixes
  - Fixed issues with JSON schema validation
  - Fixed rare issue with `halonctl queue trace` command
  - In HSL change the undefined behavior of doing math with *none* (behaves more like zero)
  - In HSL fixed a rare issue with threading and background functions
  - In HSL fixed a locking issue with `memory_update` function without initial value

<a id="v6-5-5"></a>

<a id="id24"></a>

## 6.5.5

Released 2025-01-19

- **Bug** Downgrade included curl package due to upstream regression with http-bulk/background plugin

<a id="v6-5-4"></a>

<a id="id25"></a>

## 6.5.4

Released 2025-01-17

- **Bug** Issue with *MailMessage.appendPart* keeping *MIME-Version* when root part content is wrapped
- **Bug** Fixed rare issue with *halonctl queue traces* error handling

<a id="v6-5-3"></a>

<a id="id26"></a>

## 6.5.3

Released 2025-01-10

- **Bug** Resolved issue with *dns_query()* that could result in an addition empty result when using `extended_result` option

<a id="v6-5-2"></a>

<a id="id27"></a>

## 6.5.2

Released 2024-12-22

- **Bug** Resolved issue with *smtp_lookup_rcpt()* function

<a id="v6-5-1"></a>

<a id="id28"></a>

## 6.5.1

Released 2024-12-19

- **Bug** Fix rare deadlock when using DANE together with connection pooling

<a id="v6-5"></a>

<a id="id29"></a>

## 6.5

Released 2024-12-16

- **New** MTA features
  - Added clustered queue throttles (concurrency, rates & connect intervals)
  - Added support for connect intervals (time in between connections)
- **Imp** MTA improvements
  - Added support for compression on the HTTP submission API
  - Support `?pretty=true` in HTTP JSON output
  - Show TTL for rate suspends
- **Imp** Script language improvements
  - Added `is_rsa_privatekey()` and `is_ed25519_privatekey()` functions
- **Imp** Native (C ABI) plugin improvements
  - Added `HalonMTA_config_object_key_get` to get object key name by index
  - Added `HalonMTA_queue_policy_divide`
  - Added `HalonMTA_queue_policy_add5` and `HalonMTA_queue_policy_update3` functions, to support properties
- **Imp** Command line tool improvements
  - Added missing filtering options for queue commands in halonctl
  - Restructured halontop output
- **Bug** Bug fixes
  - Allow more than 32 SAN in certificates in server certificates

<a id="v6-4-1"></a>

<a id="id30"></a>

## 6.4.1

Released 2024-08-28

- **Bug** Downgrade included curl package due to upstream regression with http-bulk plugin

<a id="v6-4"></a>

<a id="id31"></a>

## 6.4

Released 2024-08-26

- **Imp** MTA improvements
  - Added capability to spool in from disk using a fixed rate (`spool.rate`)
  - In `smtpd-app.yaml` allow [`transportgroups[].retry.during`](config_smtpd.html.md#confval-transportgroups-.retry.during) and `count` to be configured without intervals
  - Spool in mail in the order of [`spool.paths[].path`](config_startup.html.md#confval-spool.paths-.path) in `smtpd-app.yaml`
  - Added support for remoteip groupings ([`queues.grouping.groupings[].remoteip[]`](config_smtpd.html.md#confval-queues.grouping.groupings-.remoteip))
  - Added capability to configure [`servers[].commands.maxidle`](config_smtpd.html.md#confval-servers-.commands.maxidle) and [`servers[].commands.maxbad`](config_smtpd.html.md#confval-servers-.commands.maxbad)
  - Inherit properties from policies to policy generated suspends
  - Updated c-ares (asynchronous name resolver) to 1.33.1
  - Updated curl (http client library) to 8.9.1
- **Imp** Script language improvements
  - New [str_chunk()](https://docs.halon.io/hsl/archive/6.4-stable/functions.html#str_chunk) function
  - New [array_random()](https://docs.halon.io/hsl/archive/6.4-stable/functions.html#array_random) function
  - Support for AWS SIGv4 authentication in  [http()](https://docs.halon.io/hsl/archive/6.4-stable/functions.html#http) function
  - Added support for comments in CSV files (using `csv_decode` and `import`)
  - Added support to add properties to suspends using [queue_suspend()](https://docs.halon.io/hsl/archive/6.4-stable/functions.html#queue_suspend) function
  - Optimized usage of `continue` in loops
- **Imp** Native (C ABI) plugin improvements
  - Added
    [HalonMTA_queue_suspend_add4()](https://docs.halon.io/manual/archive/6.4-stable/plugins_native.html#c.HalonMTA_queue_suspend_add4),
    [HalonMTA_queue_suspend_update2()](https://docs.halon.io/manual/archive/6.4-stable/plugins_native.html#c.HalonMTA_queue_suspend_update2)
    [HalonMTA_queue_policy_update2()](https://docs.halon.io/manual/archive/6.4-stable/plugins_native.html#c.HalonMTA_queue_policy_update2)
    functions, to support properties
  - Added
    [Halon_privileged_init()](https://docs.halon.io/manual/archive/6.4-stable/plugins_native.html#c.Halon_privileged_init)
    function, supporting privileged initialization
- **Imp** Command line tool improvements
  - Added capability to spool in using a fixed rate with `hqfmove`
  - Added progress indicate to `hqfmove`
- **Bug** Various bug fixes
  - Potential issue on manual message duplication
- **Dep** Important changes
  - Do not increase process-stats counter `queue.pickup.misses` if the queue is empty
  - Move C-ABI callback `Halon_cleanup` callback to be call last during shutdown

<a id="v6-3-1"></a>

<a id="id32"></a>

## 6.3.1

Released 2024-07-10

- **Bug** Couldn’t override [`transportgroups[].retry.during`](config_smtpd.html.md#confval-transportgroups-.retry.during) with a longer expiration using pre-delivery `Try()` function

<a id="v6-3"></a>

<a id="id33"></a>

## 6.3

Released 2024-06-20

- **Imp** MTA improvements
  - Support for the [PROXY protocol v2 TLV](https://github.com/halon-extras/proxytlv) by passing it to the [connect hook](https://docs.halon.io/hsl/archive/6.3-stable/connect.html#arguments)
  - Added tenantid queue policy field for supporting segmenting for example sender domains more easily
  - Make [`servers[].phases.data.maxheadersize`](config_smtpd.html.md#confval-servers-.phases.data.maxheadersize) configurable
  - Expired messages are now removed from the active queue as well
  - Updated c-ares (asynchronous name resolver) to 1.31.0
- **Imp** Script language improvements
  - Support to override encoding when doing [MIMEPart.setBody()](https://docs.halon.io/hsl/archive/6.3-stable/functions.html#MIMEPart.setBody) function
  - New  [strpduration()](https://docs.halon.io/hsl/archive/6.3-stable/functions.html#strpduration) function
  - Updated libcurl (HTTP client library) to 8.8.0
  - Default `cache []` scope is now `config` (in configuration version “6.3”) instead of `global` ([`scripting.cache.scope`](config_startup.html.md#confval-scripting.cache.scope))
- **Imp** Command line tool improvements
  - New [hqfmove](cli_queue.html.md#cli-hqfmove) tool be able to migrate messages between hosts
- **Bug** Various bug fixes
  - Fixed issue in halonctl when sorting a groupby
  - Fixed issue with HalonMTA_message_getinfo() and HALONMTA_MESSAGE_TAGS
  - Fixed memory leak when moving messages manually from the defer queue
- **Dep** Important changes
  - Removed peer_cert in return value of smtp_lookup_rcpt()

<a id="v6-2-4"></a>

<a id="id34"></a>

## 6.2.4

Released 2024-05-14

- **Bug** Downgrade included c-ares package due to upstream regression

<a id="v6-2-3"></a>

<a id="id35"></a>

## 6.2.3

Released 2024-05-08

- **Bug** Fixed issue affecting CentOS7 due to bug in libc

<a id="v6-2-2"></a>

<a id="id36"></a>

## 6.2.2

Released 2024-05-02

- **Bug** Fixed regression in multi-field suspends with localip

<a id="v6-2-1"></a>

<a id="id37"></a>

## 6.2.1

Released 2024-05-02

- **Imp** Improved multicore performance on certain workloads
- **Bug** Fixed rare issue with certain types of dynamic suspends

<a id="v6-2"></a>

<a id="id38"></a>

## 6.2

Released 2024-04-26

- **Imp** MTA improvements
  - Improved suspend and policy evaluation performance
  - Added the ability to specify PROXY protocol servers per localip
  - Added [`queues.threads.rate.priority`](config_startup.html.md#confval-queues.threads.rate.priority) setting
  - Added support for suspend flag in queue list and queue groupby
  - Default rate algorithm for `"6.2"` policy configuration is now fixed-window instead of token-bucket (smtpd-policy.yaml: `rate: algorithm: fixedwindow/tokenbucket`)
  - Added support for systemd notifications in `smtpd` process
  - Ability to trace a specific transaction
  - Added support for RFC8616 - EAI In DKIM and DMARC
  - Added option for disabling announcing `PIPELINING` ([`servers[].extensions.pipelining`](config_smtpd.html.md#confval-servers-.extensions.pipelining))
  - Added check to enforce protocol synchronization (`compatibility.synchronization`)
  - Added `spool.threads.loader.wait` setting
  - Domain DNS cache may include nullmx
  - C-ares upstream (1.28.1)
- **Imp** Script language improvements
  - Improved detection of “Message expired” in Post-delivery script hook
  - DNS resolving functions are now async (`dns_query`, `spf_query`, and `verifyDKIM`)
  - `sleep` function is now async
  - `signDKIM` now signs `List-Unsubscribe` headers by default
  - Optimized `pcre_replace` replacements
- **Imp** Command line tool improvements
  - Added colors to `halontop`
  - Clarified usage of `--reason` argument in `halonctl` queue update commands
  - `halonconfig` will now use stable sort when compiling [running configuration](config_smtpd.html.md) (`smtpd-app.yaml`) includes
- **Bug** Various bug fixes
  - Fix issue with conflicting Ansible roles (When running multiple roles on the same server)
  - Remove leading spaces when unfolding headers with `MailMessage->getHeader()`
  - Fixed issue where `csv_encode` omitted all empty columns at the start of the list
- **Dep** Important changes
  - `MAIL FROM: <> SIZE` parameter is now enforced
  - Removed `getpeercert` on `TLSSocket`
  - Removed `dnsbl` function (use `dns_query` since 5.3)
  - Removed `dns` and `dns(mx|txt|...)` functions (use `dns_query` since 5.1)
  - Removed support for custom servers and timeout for `dns_query`, `spf_query`, and `verifyDKIM`
  - Deprecated `peer_cert` in return value of `smtp_lookup_rcpt` (`peercert` should be used)
  - In protobuf API rename `UNKNOWN` state to `OTHER`
  - The `halonctl.yaml` starting from file version 6.2, does now use `smtpd.yaml` format (and path).

<a id="v6-1-1"></a>

<a id="id39"></a>

## 6.1.1

Released 2023-12-27

- **Imp** Explicitly configure bare LF behavior (`compatibility.barelf`)
  - Default is changed to auto-detection, to keep the previous behavior set it to `true`.

<a id="v6-1"></a>

<a id="id40"></a>

## 6.1

Released 2023-12-14

- **Imp** Plugin API(s)
  - [`HalonMTA_hsl_value_set()`](plugins_native.html.md#c.HalonMTA_hsl_value_set) can now set an OpenSSL `EVP_PKEY*` to a `Privatekey` resource
  - [`HalonMTA_hsl_value_type()`](plugins_native.html.md#c.HalonMTA_hsl_value_type) can now detect `X509Resource` and `Privatekey` resources
  - [`HalonMTA_hsl_value_get()`](plugins_native.html.md#c.HalonMTA_hsl_value_get) can now get OpenSSL `X509*` and OpenSSL `EVP_PKEY*` from `X509Resource` and `Privatekey` resources
  - Added a new import API
    - [`HalonMTA_import_new()`](plugins_native.html.md#c.HalonMTA_import_new)
    - [`HalonMTA_import_abort()`](plugins_native.html.md#c.HalonMTA_import_abort)
    - [`HalonMTA_import_append()`](plugins_native.html.md#c.HalonMTA_import_append)
    - [`HalonMTA_import_commit()`](plugins_native.html.md#c.HalonMTA_import_commit)
- **Imp** MTA improvements
  - It’s now possible to set concurrency and rate as unlimited in queue policy conditions
  - Added option to never try expired messages in queue (`transportgroups[].retry.pickupexpire`)
  - Added support for changing syslog facility ([`environment.syslog.facility`](config_startup.html.md#confval-environment.syslog.facility))
  - Added support for groupings per IP ([`queues.grouping.groupings[].unique`](config_smtpd.html.md#confval-queues.grouping.groupings-.unique))
  - Added support for spool-in only queue folders ([`spool.paths[].write`](config_startup.html.md#confval-spool.paths-.write))
  - Added option to remove the from part of the Received header ([`servers[].phases.data.receivedheader.from`](config_smtpd.html.md#confval-servers-.phases.data.receivedheader.from))
  - Added support for [`servers[].proxy.xforwardedfor`](config_smtpd.html.md#confval-servers-.proxy.xforwardedfor) header in HTTP API
- **Imp** Command line tool improvements
  - Improved `--json-request` option so it includes the full request (including command)
  - Added option to show queue trace with elapsed time
  - Added possibility to update jobid in queue update command
  - Added ability to delete suspends by filter
  - Added ability to list and delete policy conditions by filter
- **Imp** Script language improvements
  - Allow configuration of `sourceip` for `proxyprotocol`
  - Added `localipid` to post-delivery connection logging object
  - Added a nullish coalescing assignment operator to HSL (`??=`)
  - Added more insights into generic delivery errors (such as DNS response code) in post-delivery
  - Throw an exception (`"No such transportid"`) if message is queued on a non-existing transport
  - Added `mx_exclude_bypass` to override any `mx_exclude`
  - Added support for `identity` option to `additional_signatures` option in `signDKIM`
  - Added `Map->merge()` function to merge keys
  - Added “buffered” option to `File()` to disable buffering `file://` files into memory
  - Added `mimeword_decode` and `mimeword_encode` functions
  - Added `header_addresslist_compile` function to properly escape a list of addresses with display names
  - `header_addresslist_extract` can now extract display names for addresses as well
  - `http()`, `TLSSocket()`, `smtp_rcpt_lookup`, `smtp_rcpt_auth()`, `MIME.send()`, `MailMessage.send()`, `Predelivery.Try()` now support tls client certificate option as array of “x509”, “chain” (array) and “privatekey” resources
  - `pkcs7_sign()` now support certificate option as array of “x509”, “chain” (array) and “privatekey” resources
  - Improve overall performance of crypto functions using PKI or keys from the configuration
  - Added `toResource` method on `X509` object
  - Added support for importing certificates as resources in HSL
  - Improved performance of halonconfig when used with large configurations
- **Dep** Important changes
  - Revamped [license system](https://docs.halon.io/manual/install.html#license)
  - The `cache [ per_message ]` option has now been removed as a no-op (deprecated in `6.0`)
  - Private keys in the configuration (`pki[].private`) now needs to be in PEM format. In the case of ed25519 private keys without PEM header, use the following command `(printf \\x30\\x2e\\x02\\x01\\x00\\x30\\x05\\x06\\x03\\x2b\\x65\\x70\\x04\\x22\\x04\\x20 && cat ed25519.key | base64 -d) | openssl pkey -inform DER -outform PEM` to add PEM header.

<a id="v6-0-3"></a>

<a id="id41"></a>

## 6.0.3

Released 2023-11-15

- **Bug** Problem with eviction of connection based on grouping

<a id="v6-0-2"></a>

<a id="id42"></a>

## 6.0.2

Released 2023-10-02

- **Sec** Updated libspf to fix [CVE-2023-42118](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-42118)

<a id="v6-0-1"></a>

<a id="id43"></a>

## 6.0.1

Released 2023-09-01

- **Bug** Fix issue with OpenMetric output in *halonctl*
- **Bug** Suppress warning for unhandled submission.yaml file in *halonconfig*
- **Bug** HTTP2 wasn’t available in *http()* on Ubuntu 22.04

<a id="v6-0"></a>

<a id="id44"></a>

## 6.0

Released 2023-08-16

- **Imp** MTA improvements
  - Overall performance and memory usage improved
  - Ability to configure custom [thread pools](https://docs.halon.io/manual/archive/6.0-stable/config_startup.html#events) for internal SMTP event loops
  - Allow pooling reuse by [grouping](https://docs.halon.io/manual/archive/6.0-stable/config_smtpd.html#confval-queues.pooling.policy) fields
  - New C-ABI functions
    - [HalonMTA_config_to_json()](https://docs.halon.io/manual/archive/6.0-stable/plugins_native.html#c.HalonMTA_config_to_json) to convert configuration to JSON
    - Added two new API hooks [Halon_ready()](https://docs.halon.io/manual/archive/6.0-stable/plugins_native.html#c.Halon_ready) and [Halon_early_cleanup()](https://docs.halon.io/manual/archive/6.0-stable/plugins_native.html#c.Halon_early_cleanup)
    - Added a new [inject API](https://docs.halon.io/manual/archive/6.0-stable/plugins_native.html#inject-plugin)
  - Improvements to `halonctl`
    - Added support for all metadata filter options in `halonctl queue` commands
    - Added `--limit` option to queue update command
    - Added `--probability` option to halonctl queue update, list and unload commands
    - Added types and help to OpenMetric output for `halonctl process-stats` command
  - Include CycloneDX SBOM files for the smtpd package
  - Improvements to metadata queries in queue protobuf API
  - Increase tag limits (16 to 32 characters) for queue pickup policies and suspends
- **Imp** Script language improvements
  - Added `additional_fields` and `additional_recipient_fields` options to [Bounce()](https://docs.halon.io/hsl/archive/6.0-stable/postdelivery.html#Bounce) function
  - Added `remotemta` override to `fields` options for [Bounce()](https://docs.halon.io/hsl/archive/6.0-stable/postdelivery.html#Bounce) function
- **Dep** Important changes
  - Remote SMTP bounce messages no longer include SMTP states
  - Removed special meaning of `lookup-mx` as hostname to `Try()`, `smtp_()` and `MIME|MailMessage.send()` functions
  - Removed special meaning of `MIME("0")` (to get the EOD hooks root MailMessage object)
  - The `cache [ per_message ]` option is now deprecated and will become a no-op in 6.1 (use `$context` variable instead)
  - Removed builtin `LDAP()`, `ScanDLP()` and  `ScanDMARC()` functions (use halon-extras-ldap, -dlp and -dmarc instead)
- **Bug** Various bug fixes
  - HSL function [memory_store()](https://docs.halon.io/hsl/archive/6.0-stable/functions.html#memory_store) callback argument bug

<a id="v5-12-1"></a>

<a id="id45"></a>

## 5.12.1

Released 2023-05-03

- **Bug** In HSL fix an issue with Map/Sets iterators and foreach

<a id="v5-12"></a>

<a id="id46"></a>

## 5.12

Released 2023-04-12

- **Imp** MTA improvements
  - Faster policy evaluations and subdomain matching
  - Added a new
    [grouping](https://docs.halon.io/manual/archive/5.12-stable/config_smtpd.html#confval-queues.grouping)
    field to the queue structure to be used for combined
    recipientdomain/remotemx groupings
  - Added `LOGIN` parameter support to the `XCLIENT` command
  - Added support for network matching in
    [PROXY](https://docs.halon.io/manual/archive/5.12-stable/config_startup.html#confval-servers-.proxyprotocol),
    [XCLIENT](https://docs.halon.io/manual/archive/5.12-stable/config_smtpd.html#confval-servers-.extensions.xclient)
    and [TLS client
    cert](https://docs.halon.io/manual/archive/5.12-stable/config_smtpd.html#confval-servers-.tls.clientcert)
    settings
  - Added connection pooling reuse
    [setting](https://docs.halon.io/manual/archive/5.12-stable/config_smtpd.html#confval-queues.pooling.policy)
    based on remotemx
  - Various improvements to DNS resolving
    - Added a global DNS domain cache
    - Restructured DNS cache to resolve all addresses, with
      deduplication
    - Added global settings for
      [resolver.mx.exclude.ip](https://docs.halon.io/manual/archive/5.12-stable/config_smtpd.html#confval-resolver.mx.exclude.ip)
      and
      [resolver.mx.exclude.mx](https://docs.halon.io/manual/archive/5.12-stable/config_smtpd.html#confval-resolver.mx.exclude.mx)
  - Priority messages now also have priority in resolver and script
    execution queues
  - Allow overriding serverhost (`servers[].hostname`) in connect
    hooks’s `Accept()` function
  - Added ability to read plugin configurations from file paths
  - Improvements to `halonctl`
    - Added `--no-pipelining` options to queue trace command
    - More precise time (usec) resolution in queue trace command
    - Queue update command now supports changing only localpart or
      domain of senders/recipients
  - `halontop` now resizes layout to terminal size
  - Added a new C-API
    ([HalonMTA_deliver_trace](https://docs.halon.io/manual/archive/5.12-stable/plugins_native.html#c.HalonMTA_deliver_trace))
    to do custom trace outputs in delivery plugins
  - Added a new C-API for [queue
    pickup](https://docs.halon.io/manual/archive/5.12-stable/plugins_native.html#c.Halon_queue_pickup_acquire2)
    plugins
- **Imp** Script language improvements
  - Added support for multiline CSV data in
    [csv_encode()](https://docs.halon.io/hsl/archive/5.12-stable/functions.html#csv_encode)
    and
    [csv_decode()](https://docs.halon.io/hsl/archive/5.12-stable/functions.html#csv_decode)
  - Added option to allow non-convertible objects to be converted to
    none in
    [json_encode()](https://docs.halon.io/hsl/archive/5.12-stable/functions.html#json_encode)
- **Dep** Important changes
  - Deprecated `ScanDMARC()` (install `halon-extras-dmarc`)
  - Deprecated builtin `LDAP` class (install `halon-extras-ldap`)
  - Removed `MailMessage.deliver` (deprecated since 5.2, use
    `MailMessage.queue()` instead)
  - Removed `/dev/null` as special transport destination
  - Removed `GetMailQueueMetric()` (deprecated since 5.3)
- **Bug** Various bug fixes
  - Missing dynamic policy id in `$arguments` in post-delivery on
    rate only policy conditions
  - Fixed timeout issue with PIPELINING
  - `queue_policy_delete()` function was missing in AUTH hook
  - Fix issue with `unset` in `foreach` loops
  - Fix issue with `scripting.rootpath` ending with `/`
  - In HSL do not allow index dereference of string with key types
    other than numbers
  - In HSL do not allow slice operator dereference with key types
    other than numbers
  - `jobid` set in pre-delivery `Try()` function was not updated
    in post-delivery hook
  - Fixed rare crash with queue trace command on busy systems

<a id="v5-11-3"></a>

<a id="id47"></a>

## 5.11.3

Released 2023-02-17

- **Bug** Improved error handling with HTTP submissions API
- **Bug** Fix error message with `halonconfig --dist-check` and
  missing schemas
- **Bug** Fix rare issue connection retry

<a id="v5-11-1"></a>

<a id="id48"></a>

## 5.11.1

Released 2023-02-06

- **Bug** Fix a rare issue with configuration reload on Ubuntu

<a id="v5-11"></a>

<a id="id49"></a>

## 5.11

Released 2023-02-03

- **Imp** MTA improvements
  - Added a `halonctl queue trace` command to trace outbound SMTP
    connections
  - Outbound PIPELINING support
  - Ability to change TLSv1.3 cipher suites on server and clients
  - Queue performance optimizations
  - Added
    [setDateLater()](https://docs.halon.io/hsl/functions.html#MIMEPart.setDateLater)
    function to set Date header on delivery
  - Added connection `id` and numbers of `transactions` to
    [post-delivery](https://docs.halon.io/hsl/postdelivery.html)
    attempt connection array
  - Added support for networks in the
    [Try()](https://docs.halon.io/hsl/predelivery.html?highlight=ip_exclude#Try)
    argument `ip_exclude`
  - Allow changing jobid with `Queue()` functions in pre- and
    post-delivery
  - Added remotemx information to outbound connection list
  - Added support for `--size`, `--subject`, `--metadata-and`
    filter conditions to `halonctl`
  - Added the ability to clear the internal DNS cache using domain
    wildcards in `halonctl`
- **Imp** Script language improvements
  - `Map`/`Set` iterator are now thread safe with imports
    (modifications are not)
  - Added support for [data
    types](https://docs.halon.io/hsl/structures.html#data) when
    `import`ing YAML files
  - Added support for private key
    [import](https://docs.halon.io/hsl/structures.html#data)
    (RSA and ED25519 keys)
  - Added
    [rsa_privatekey()](https://docs.halon.io/hsl/functions.html#rsa_privatekey)
    and
    [ed25519_privatekey()](https://docs.halon.io/hsl/functions.html#ed25519_privatekey)
    function to load keys as PrivateKey resources
  - Added
    [array_combine()](https://docs.halon.io/hsl/functions.html#array_combine)
    function
  - Added `exclude_headers` to `signDKIM()` functions
  - Added support for PrivateKey resources to `signDKIM()` functions
  - Added support for
    [tags](https://docs.halon.io/hsl/functions.html#yaml_decode)
    when `parsing`ing YAML files
  - Added `MIMEPart.getByID()` functions to retrieve a MIMEPart by ID
  - Added support for Regex types to `MIMEPart.findByType()` and
    `MIMEPart.findByFileName()` functions
  - `csv_encode()` will not added quotes to string with spaces
- **Bug** Fix issue with slow graceful shutdown of `smtpd`
- **Bug** Fix issue with the `halonctl queue groupby` command if
  jobid was set with `Try()`
- **Bug** Fix issue with including files using symlinks within the
  rootpath in HSL
- **Bug** Fix issue with global functions and module imports in HSL
- **Dep** Important changes
  - Migrating away from Cyren (ctasd and ctipd)
  - The deprecated `DirectDeliver()` function now acts as a queuing
    deliver
  - Removed deprecated `GetTLS()`, `Allow()`, `Block()` and
    `DeliverWithDKIM()` functions
  - On Linux, trying to reload with Halon script compilation errors
    will continue using the previous configuration

<a id="v5-10-1"></a>

<a id="id50"></a>

## 5.10.1

Released 2022-12-06

- **Bug** halonctl resolver command didn’t ignore SIGPIPE
- **Bug** halontop didn’t show patch version properly
- **Bug** On some Linux distros environment.rlimit.nice could not
  be set to a negative value
- **Bug** Improved error handling on JSON payloads in smtpd HTTP
  API
- **Bug** On configuration load filename was missing in error
  message
- **Bug** Fixed a stability issue

<a id="v5-10"></a>

<a id="id51"></a>

## 5.10

Released 2022-10-11

- **Imp** Package and repository improvements
  - Builds for Ubuntu 22.04 LTS
  - Packages for [extras](http://github.com/halon-extras) projects
    written in Halon script
- **Imp** MTA improvements
  - Ability to change IP address family (v4/v6) preference
  - Support for [implicit
    TLS](https://docs.halon.io/manual/config_smtpd.html#confval-transportgroups-.session.tls.implicit)
    for outbound connections
  - New outbound TLS mode
    [dane_fallback_require_verify](https://docs.halon.io/hsl/predelivery.html#Try)
    for DANE/MTA-STS coexistence
  - Added peer certificate error and TLSA to [post-delivery’s
    attempt](https://docs.halon.io/hsl/postdelivery.html#tls)
    information
  - Store last attempt’s `localip`, `remoteip` and `remotemx` in
    the defer queue
- **Imp** Script language improvements
  - Added
    [domain_publicsuffix()](https://docs.halon.io/hsl/functions.html#domain_publicsuffix)
    function
  - Added
    [url_parse()](https://docs.halon.io/hsl/functions.html#url_parse)
    function
  - Added `insert_function` option to `cache []`
  - Added new
    [match](https://docs.halon.io/hsl/structures.html#match)
    expression
  - `Socket.recv` may now use multiple flags as an array
  - Added support for `body_length` in
    [signDKIM()](https://docs.halon.io/hsl/functions.html#MailMessage.signDKIM)
  - Ability to set properties and the stop flag in for dynamic
    [queue_policy()](https://docs.halon.io/hsl/functions.html#queue_policy)
- **Imp** Protobuf API improvements
  - `QueueGroupBy` by `localip` as well
  - `QueueGroupBy` support policy grouping (MX rollup, etc)
  - More `ServerConnectionsList` information; transactions, local IP
    and ports
- **Imp** Command line tool improvements
  - `halonctl groupby` overhaul, adding lots of new functionality
  - `halonctl queue update` now have a dry-run flag to test queries
  - `halonctl process-stats` may now output Prometheus compatible
    formats
- **Bug** Fix issue with dynamic policies in the 35/8 subnet
- **Dep** [Important
  changes](https://docs.halon.io/go/releasenotes510)
  - The Ubuntu packages no longer depends on `halon-extras-rate` and
    `halon-extras-dlp` (need to be explicitly installed)
  - The per-recipient end-of-DATA function `DirectDeliver` is
    deprecated, use `MailMessage.send()` instead
  - The post-delivery function `GetTLS()` is deprecated, use the
    `tls` object in `$arguments` instead

<a id="v5-9-3"></a>

<a id="id52"></a>

## 5.9.3

Released 2022-12-05

- **Bug** Fixed a stability issue

<a id="v5-9-2"></a>

<a id="id53"></a>

## 5.9.2

Released 2022-08-16

- **Bug** `GetTLS()` in post-delivery could fail on non-delivered
  messages
- **Bug** Issue with `Queue()` in post-delivery with no retry
  delay
- **Bug** Fixed an error message in `halonconfig`

<a id="v5-9-1"></a>

<a id="id54"></a>

## 5.9.1

Released 2022-05-31

- **Bug** Fix issue with IPC (Unix domain socket) permission on
  Linux

<a id="v5-9"></a>

<a id="id55"></a>

## 5.9

Released 2022-05-30

- **New** Added
  [priority](https://docs.halon.io/hsl/eodonce.html#EODMailMessage.queue)
  for queued messages
- **New** Added max age of messages in queue (`retry.during`) as
  an alternative to `retry.count`
- **Imp** MTA improvements
  - Added support for thread priority for various thread pools and
    event loops
  - Made `ip_exclude_temporary` also work with `mx_exclude` in
    SMTP clients
  - Added `dane_fallback_require` as TLS mode in SMTP clients
  - Added support for more AUTH mechanisms in SMTP clients (eg.
    XOAUTH2)
  - Randomize the order of equal-preference MX host addresses
  - Added possibility to configure custom script thread pools per hook
  - Delivery settings may now change max retries/during and retry
    intervals
  - Added `queues.maxmessages` to limit number of messages to hold
    in memory
  - Added `data.fixheaders` (false) and `data.mimepart.fixheaders`
    (false) to inject `\r\n` before bad headers
  - Added `queue.loader.active` counter to hold total messages
    currently loaded
  - Postmaster address may be configured separately as localpart and
    domain (inherit from reporting-mta)
  - Added possibility to disable MIME multipart parsing for
    performance
  - Added `maxparts` to configure max MIME parts
  - Added ability to change `transportid` in `Try()`
  - Added `$arguments["expired"]` to post-delivery hook to indicate
    bounces due to age or max retry count
  - Added reason to `Delete()` in the pre-delivery hook
  - Added support for DSN options to `Bounce()` in the pre-delivery
    hook
- **Imp** Script language improvements
  - Added array dereference with
    [spread](https://docs.halon.io/hsl/archive/5.9-stable/operators.html#spread)
    operator inside of arrays
  - Allow upcast of TLSSocket to Socket with
    [TLSocket.toSocket()](https://docs.halon.io/hsl/archive/5.9-stable/functions.html#TLSSocket.toSocket)
  - Added
    [setFileName()](https://docs.halon.io/hsl/archive/5.9-stable/functions.html#MIME.setFileName)
    and
    [setDisposition()](https://docs.halon.io/hsl/archive/5.9-stable/functions.html#MIME.setDisposition)
    functions to `MIME()`
  - Detect MIME parsing errors with
    [MailMessage.getErrors()](https://docs.halon.io/hsl/archive/5.9-stable/functions.html#MIMEPart.getErrors)
  - Added support to create `MailMessages` from `File` objects
    using
    [MailMessage::File()](https://docs.halon.io/hsl/archive/5.9-stable/functions.html#MailMessage.File)
  - Added reason for policy result and detailed error/errno to
    `spf_query()` output
- **Imp** Native (C ABI) plugin improvements
  - Added support to get object properties with
    [HalonMTA_hsl_object_property_get()](https://docs.halon.io/manual/archive/5.9-stable/plugins_native.html#c.HalonMTA_hsl_object_property_get)
  - Create MailMessage and File classes from strings with
    [HalonMTA_hsl_value_set()](https://docs.halon.io/manual/archive/5.9-stable/plugins_native.html#c.HalonMTA_hsl_value_set)
  - Detect MailMessage type with
    [HalonMTA_hsl_value_type()](https://docs.halon.io/manual/archive/5.9-stable/plugins_native.html#c.HalonMTA_hsl_value_type)
- **Imp** HTTP submission API improvements
  - Added `/health` endpoints to be used with load balancers
  - Added `$arguments["headers"]` to end-of-DATA script
  - Added concurrency limit setting per server
  - Certificates are soft reloadable in configuration
- **Imp** Protobuf API improvements
  - Include HTTP connection in ServerConnectionsList replies
  - Support for close reason of HTTP connections with
    ServerConnectionsClose
  - Added option to reset `transactionid`, `ts` and `retrycount`
    upon message import
  - Bounce action may set `status` and `diagnosticcode` on queue
    updates
  - Added regular expression support in StringMatch in API for message
    conditions
  - Added unique count feature to groupby
  - Added maximum values to process stats and present them nicely in
    `halontop`
- **Imp** All halonctl commands accepting time now allows for
  X[dhms] syntax
- **Imp** Added dist-check command to halonconfig to check
  generated configuration
- **Imp** Added option to stop-on-match in smtpd-policy.yaml when
  matching rules
- **Imp** Add configurable rate sync delay to improve UDP
  synchronization reliability
- **Bug** Fix validation bug in JSON schema with HTTP submission
  API
- **Bug** Fix validation bug in post-delivery hook with
  `$arguments["dsn"]["status", "diagnost`…
- **Bug** Allow long lines in message body when receiving messages
  with CHUNKING
- **Bug** Fix rate issue with dynamic policies which could cause
  MTA restarts
- **Bug** HTTP submission API header name “X-API-Key” was not case
  insensitive
- **Bug** Statistics queue.policy.rate.suspends not decreased on
  manual message deletes
- **Bug** Fix bug in C API when invoking function pointers in class
  member functions
- **Bug** Properly detect temperror in ScanDMARC()
- **Bug** Fix escaping of email addresses by escaping additional
  characters
- **Bug** Added detection newer versions of .docx and .xlsx files
  in ScanDLP()
- **Dep** Deprecated use of MIME(“0”) in EOD, use
  $arguments[“mail”] or GetMailMessage() instead
- **Dep** [Important
  changes](https://docs.halon.io/go/releasenotes59)
  - Removed “eodrcpt” from Linux builds
  - Removed ability to control “rated” and “dlpd” from “halonctl” (use
    ratectl or dlpctl instead)
  - Removed deprecated functions from per-message end-of-DATA script:
    Queue(), GetMailMessage(), GetTLS(), GetAddressList(), DKIMSign(),
    DKIMSDID(), DKIMVerify()

<a id="v5-8-4"></a>

<a id="id56"></a>

## 5.8.4

Released 2022-03-16

- **Sec** Updated OpenSSL to fix
  [CVE-2022-0778](https://www.freebsd.org/security/advisories/FreeBSD-SA-22:03.openssl.asc)

<a id="v5-8-3"></a>

<a id="id57"></a>

## 5.8.3

Released 2022-02-10

- **Bug** Auto-detection of DKIM keys in `additional_signatures`
  fixed
- **Bug** Reduce risk of `rated` UDP packet loss for initial
  synchronization
- **Bug** Issue with `ScanDLP()` and custom rules fixed
- **Bug** Updated libcurl to 7.81

<a id="v5-8-2"></a>

<a id="id58"></a>

## 5.8.2

Released 2022-01-25

- **Bug** DKIM validation issue under certain circumstances

<a id="v5-8-1"></a>

<a id="id59"></a>

## 5.8.1

Released 2022-01-10

- **Bug** Privdrop after creating control socket in `rated`
- **Bug** Fix `rated` startup rate hit sync
- **Bug** Fix minor issue parsing bad headers

<a id="v5-8"></a>

<a id="id60"></a>

## 5.8

Released 2021-12-13

- **New** Templates for [Docker and
  Kubernetes](https://github.com/halon/halon-docker)
  - The `dlpd` content filtering connection now uses a HTTP based
    API
  - The `rated` rate control connection supports DNS with dynamic
    re-resolve
- **New** APT/deb and RPM
  [repositories](https://docs.halon.io/manual/archive/5.8-stable/comp_install.html)
  - Components are now in separate packages (MTA, rate control,
    content inspection, etc.)
  - Added separate `dlpctl` an `ratectl` tools for the respective
    new packages
- **New** MTA features
  - [HTTP
    submission](https://docs.halon.io/manual/archive/5.8-stable/http_submission.html)
    API for pre-formatted RFC822 messages
  - [halontop](https://docs.halon.io/manual/archive/5.8-stable/cli.html#halontop)
    program showing realtime process metrics
  - Faster DKIM dual-signing with `additional_signatures` to
    [signDKIM()](https://docs.halon.io/hsl/archive/5.8-stable/functions.html#MIME.signDKIM)
  - Ability to use multiple [spool
    paths](https://docs.halon.io/manual/archive/5.8-stable/config_startup.html#confval-spool.paths-.path)
  - Added support
    [reserved](https://docs.halon.io/manual/archive/5.8-stable/config_smtpd.html#confval-servers-.concurrency.reserved.total)
    connection slots
  - Export message using with `QueueExportRequest`
    [API](https://docs.halon.io/manual/archive/5.8-stable/api_reference.html#command-list)
- **New** Native (C ABI) plugin features
  - Added
    [Halon_command_execute()](https://docs.halon.io/manual/archive/5.8-stable/plugins_native.html#c.Halon_command_execute)
    function, supporting `argv` style of arguments
  - Added
    [Halon_early_init()](https://docs.halon.io/manual/archive/5.8-stable/plugins_native.html#c.Halon_early_init)
    function, supporting early initialization
  - Added
    [HalonMTA_hsl_value_to_json()](https://docs.halon.io/manual/archive/5.8-stable/plugins_native.html#c.HalonMTA_hsl_value_to_json)
    and
    [HalonMTA_hsl_value_from_json()](https://docs.halon.io/manual/archive/5.8-stable/plugins_native.html#c.HalonMTA_hsl_value_from_json)
    functions
  - Added
    [HalonMTA_hsl_value_array_length](https://docs.halon.io/manual/archive/5.8-stable/plugins_native.html#c.HalonMTA_hsl_value_array_length)
    function
  - [Autoloading](https://docs.halon.io/manual/archive/5.8-stable/plugins_native.html)
    plugins without configuration
  - Support for
    [objects](https://docs.halon.io/manual/archive/5.8-stable/plugins_native.html#objects)
  - Support for
    [exceptions](https://docs.halon.io/manual/archive/5.8-stable/plugins_native.html#c.HalonMTA_hsl_throw)
  - Support for
    [static](https://docs.halon.io/manual/archive/5.8-stable/plugins_native.html#c.HalonMTA_hsl_register_static_function)
    functions
  - Support for running [Halon script
    functions](https://docs.halon.io/manual/archive/5.8-stable/plugins_native.html#callable)
    in C
  - Support for working with
    [lists](https://docs.halon.io/manual/archive/5.8-stable/plugins_native.html#lists-plugin)
    function in C
  - Support for more types in C API such as `X509`, `File` objects
- **Imp** Script language improvements
  - Added
    [zlib_compress()](https://docs.halon.io/hsl/archive/5.8-stable/functions.html#zlib_compress)
    and uncompress functions
  - Added
    [MIME.toFile()](https://docs.halon.io/hsl/archive/5.8-stable/functions.html#MIME.toFile)
    function
  - Added
    [MIME.setDate()](https://docs.halon.io/hsl/archive/5.8-stable/functions.html#MIME.setDate)
    function
  - Added
    [X509.extensions()](https://docs.halon.io/hsl/archive/5.8-stable/functions.html#X509.extensions)
    function
  - Added
    [X509.verify()](https://docs.halon.io/hsl/archive/5.8-stable/functions.html#X509.verify)
    function
  - Added
    [X509::String()](https://docs.halon.io/hsl/archive/5.8-stable/functions.html#X509.String)
    function
  - Added
    [queue_policy_delete](https://docs.halon.io/hsl/archive/5.8-stable/functions.html#queue_policy_delete)
    function
  - Added
    [import](https://docs.halon.io/hsl/archive/5.8-stable/structures.html#data)
    support for multiple X509 certificates (.crt)
  - Added
    [import](https://docs.halon.io/hsl/archive/5.8-stable/structures.html#data)
    support for rfc822 message files (.eml)
  - Added
    [glob import](https://docs.halon.io/hsl/archive/5.8-stable/structures.html#wildcard-file-imports)
    support
  - Added support for `srv` records in
    [dns_query()](https://docs.halon.io/hsl/archive/5.8-stable/functions.html#dns_query)
    function
- **Imp** MTA improvements
  - Improved DSN generation by supporting to include full original
    messages and DSN field customization
  - Include DSN arguments in post-delivery `$arguments["dsn"]` array
  - Include queue policy insights in post-delivery
    `$arguments["policy"]` array
  - Added support for customization of the Received header (`tls`
    and `for`)
  - Order queue list by retrycount
  - Support message retry with a jitter (distribution) in queue
    actions
  - Added support for queue message grouping of remoteip and remotemx
  - Added lists, grouping of conditions, and custom properties to
    active queue policy and delivery settings
  - Allow configuration of multiple
    [pickup](https://docs.halon.io/manual/archive/5.8-stable/config_startup.html#confval-queues.threads.pickup)
    threads
  - Added [delivery
    counters](https://docs.halon.io/manual/archive/5.8-stable/cli.html#halonctl)
    to process stats
  - Added support for `.halonignore` files when packaging
    configuration using `halonconfig`
- **Bug** Fix bug with localip in smtpd-delivery.yaml
- **Dep** [Important
  changes](https://docs.halon.io/go/releasenotes58)
  - Removed the deprecated `GetMailFile()` function
  - It’s no longer valid to send message to plain IP addresses
    `user@ip`
  - Standard ciphers names are now used in logs (instead of OpenSSL
    convention)
  - Graceful shutdown for inbound connections
  - Renamed process threads (visible in `top`)

<a id="v5-7-4"></a>

<a id="id61"></a>

## 5.7.4

Released 2021-11-09

- **Bug** MIME formatting issue with append/prependPart() on
  non-MIME messages
- **Bug** Issue with DKIM signature in bounces
- **Bug** `MIME()` not storing decoded headers when queuing

<a id="v5-7-3"></a>

<a id="id62"></a>

## 5.7.3

Released 2021-09-19

- **Bug** Direct deliver in EOD rcpt hook

<a id="v5-7-2"></a>

<a id="id63"></a>

## 5.7.2

Released 2021-08-24

- **Bug** File type detection in DLP engine

<a id="v5-7-1"></a>

<a id="id64"></a>

## 5.7.1

Released 2021-08-06

- **Bug** Make linter recognize `$connection["tls"]["sni"]`
- **Bug** Startup bulk synchronization in `rated`
- **Bug** PROXY protocol heartbeat connections

<a id="v5-7"></a>

<a id="id65"></a>

## 5.7

Released 2021-07-21

- **New** Introducing [exception
  handling](https://docs.halon.io/hsl/archive/5.7-stable/functions.html?#_CPPv29Exception)
  with accompanying `try`, `catch` and `throw` control structures
- **New** [Visual Studio Code
  plugin](https://docs.halon.io/manual/vscode.html) support for
  debugging script in the `smtpd` MTA process
- **New**  `ServerConnectionsListRequest` API
- **New** Ability to close inbound connections with
  `ServerConnectionsCloseRequest` API
- **New** Added
  [array_unique()](https://docs.halon.io/hsl/archive/5.7-stable/functions.html?#array_unique)
  and `array_shuffle()` functions
- **New** Added
  [pcre_compile()](https://docs.halon.io/hsl/archive/5.7-stable/functions.html?#pcre_compile)
  function to pre-compile regular expressions from user input
- **New** Added
  [#/myregexpattern/](https://docs.halon.io/hsl/archive/5.7-stable/literals.html#regex)
  syntax for creating pre-compiled regular expressions
- **New** Added
  [X509::String()](https://docs.halon.io/hsl/archive/5.7-stable/functions.html#X509.String)
  method for creating an X.509 resource from PEM or DER
- **New** Added
  [MIME.send()](https://docs.halon.io/hsl/archive/5.7-stable/functions.html#MIME.send)
  method for inline delivery directly from MIME object
- **Imp** New HQF2 queue file format which combines .eml and .hqf
- **Imp** Added `--unpack` option to `halonconfig` to reverse
  packing
- **Imp** The `halonconfig` command now validates plugin
  configuration schemas
- **Imp** Added `additional_headers` option to pre-delivery
  `Try()` function for passing data
- **Imp** Added `modified_original` DSN option to post-delivery
  `Bounce()` for altering original headers
- **Imp** Added connection `id` and `remoteuid` to SMTP server
  `$connection` array
- **Imp** Added `remove_if_zero` argument to `memory_dec()` for
  automatic cleanup
- **Imp** Added `json` and `regex` formatters to `import` and
  `csv_decode()`
- **Imp** Ability to `import` text file lines as `Set` object
  items for fast lookups
- **Imp** Allow `foreach` on `$this` in classes to iterate all
  instance properties
- **Imp** Added `depth` option to `domain_includes()` function
- **Imp** Ability to use `response_headers` with
  `extended_result` in `http()`
- **Imp** Support for loading `File` from standard input when
  running in `hsh`
- **Dep** The `=~` and `!~` operators now throws on invalid
  regular expressions
- **Dep** Messages with empty `remotemx` or `jobid` are not
  matched against queue policies with those
- **Dep** Modules loaded with `import` can no longer access
  global user-defined functions
- **Dep** Removed `mail()` option `rawbody` and URI fallback
  for `ldap_bind()` (deprecated since 4.8)

<a id="v5-6-4"></a>

<a id="id66"></a>

## 5.6.4

Released 2021-07-19

- **Bug** No longer passes function pointers from in `$context`
  (only data is supported)
- **Bug** Fixed long loading times of `hsl-lint` and
  `halonconfig` with large YAML files
- **Bug** Resolved issue with `queue_suspend()` and
  `queue_policy()` argument order
- **Bug** Connection pooling didn’t work with outbound PROXY
  protocol
- **Bug** In post-delivery attempt array, localip was not set
  correctly with outbound PROXY protocol
- **Bug** Issue with `cache []` size if is set to `2**32`
- **Bug** The transport retry intervals didn’t override the
  transport group’s intervals

<a id="v5-6-3"></a>

<a id="id67"></a>

## 5.6.3

Released 2021-06-29

- **Bug** Issue with the `cache []` when exception was thrown
  from cached function
- **Bug** Context switching with plugins wasn’t supported in the
  PROXY script
- **Bug** The `$context` variable wasn’t updated after the EOD
  script hook
- **Bug** Only one DKIM signature was supported on the `MIME()`
  object
- **Bug** Imported function could not resolve nested function in
  some special cases
- **Bug** Imported object between multiple hooks could not resolve
  imported functions in some special cases

<a id="v5-6-2"></a>

<a id="id68"></a>

## 5.6.2

Released 2021-05-28

- **Bug** Fixed issue with updated variables and logging in
  per-recipient end-of-DATA script
- **Bug** Fixed auto generation of transaction ID on API
  `QueueImport`
- **Bug** Fixed encoding issue in `xtext_encode()`

<a id="v5-6-1"></a>

<a id="id69"></a>

## 5.6.1

Released 2021-04-08

- **Bug** Fixes a race condition in the queue script

<a id="v5-6"></a>

<a id="id70"></a>

## 5.6

Released 2021-03-22, see the [release
notes](https://docs.halon.io/go/releasenotes56) for notable changes

- **New** Added native
  [plugin](https://docs.halon.io/manual/archive/5.6-stable/plugins_native.html)
  support by loading C ABI compatible libraries
- **New** Added CSV schema validation support in
  [import](https://docs.halon.io/hsl/archive/5.6-stable/structures.html#data)
  so that imported files gets validated
- **Imp** Ability to start the server without any listeners in
  order to drain queue
- **Imp** Allow server control socket to listen on IP in addition
  to socket file
- **Imp** Ability to group queue distribution view by sending
  domain
- **Imp** Added variables for [disconnect
  reason](https://docs.halon.io/hsl/archive/5.6-stable/disconnect.html#arguments)
  to disconnect script hook
- **Imp**
  [http()](https://docs.halon.io/hsl/archive/5.6-stable/functions.html#http)
  function now supports explicit `http_version` and `post_size`
- **Imp** Ability to modify (rather than just add and delete) queue
  suspend and policy items
- **Imp** Added total count in API response for queue `list` and
  `groupby` CLI/API commands
- **Imp** Possibility to disable the Received header (instead of
  having to delete it from script)
- **Imp** Added In-Reply-To to DSN messages (to support
  [threaded](https://docs.halon.io/hsl/archive/5.6-stable/predelivery.html#Try)
  bounces)
- **Imp** Added decode option to
  [MIMEPart.getHeader](https://docs.halon.io/hsl/archive/5.6-stable/functions.html#MIMEPart.getHeader)
  functions
- **Imp** Added binary option to all hashing functions (eg.
  [sha2](https://docs.halon.io/hsl/archive/5.6-stable/functions.html#sha2)
  function)
- **Imp** Improved concurrent cache miss behavior in the HSL
  [cache](https://docs.halon.io/hsl/archive/5.6-stable/structures.html#cache)
- **Imp** Added possibility to disable
  [hook](https://docs.halon.io/manual/archive/5.6-stable/config_smtpd.html#confval-servers%5B%5D.logging.hook)
  logs
- **Imp**
  [Default()](https://docs.halon.io/hsl/archive/5.6-stable/postdelivery.html#Default)
  function now allows configuration of bounce settings
- **Imp**
  [Try()](https://docs.halon.io/hsl/archive/5.6-stable/predelivery.html#Try)
  function IP include and excludes (similar to `mx_include` and
  `mx_exclude`)
- **Bug** Resolved an issue with the queue updates
- **Bug** Resolved an issue with the import statements and reloads
- **Bug** Fix bug with paging of Halon script rates
- **Bug** Fix a memory leak in the backend authentication script
  (with modules)
- **Bug** Missing error counters on connect and disconnect
- **Bug** Halon script Socket classes’ close() method could cause
  unexpected disconnect behaviors
- **Bug** Fix support for BDAT and the proxy script hook
- **Bug** Fix an issue with SNMP and the firewall script
- **Dep**
  [queue_suspend()](https://docs.halon.io/hsl/archive/5.6-stable/functions.html#queue_suspend)
  and
  [queue_policy()](https://docs.halon.io/hsl/archive/5.6-stable/functions.html#queue_policy)
  has changed its return value
- **Dep** Text log formats has been slightly changed
- **Dep**
  [File.toFFIValue()](https://docs.halon.io/hsl/archive/5.6-stable/functions.html#File.toFFIValue)
  function now returns C-compatible FILE pointer.
- **Dep** Remove functions a per the
  [deprecation](https://docs.halon.io/go/releasenotes56) note
- **Dep** Queue suspend and policy API calls return UUIDs instead
  of `uint64`
- **Dep** Minimum
  [supported](https://docs.halon.io/manual/archive/5.6-stable/api_reference.html#version-compatibility)
  API version is (5.6)

<a id="v5-5"></a>

<a id="id71"></a>

## 5.5

Released 2020-11-16, see the [release
notes](https://docs.halon.io/go/releasenotes55) for notable changes

- **New** [DSN
  extension](https://support.halon.io/hc/en-us/articles/360017337479)
  support
- **New** [Outbound PROXY
  protocol](https://support.halon.io/hc/en-us/articles/360017394679)
  support
- **New** [Function
  generators](https://docs.halon.io/hsl/archive/5.5-stable/structures.html#id11)
  and `yield`
- **New**
  [Map()](https://docs.halon.io/hsl/archive/5.5-stable/functions.html#Map)
  and `Set()` data container classes
- **New** Ability to disable
  [sourceip_random](https://docs.halon.io/hsl/archive/5.5-stable/predelivery.html#Try),
  useful during for example IP warmup
- **New** Added
  [halonctl hsl memory list](https://docs.halon.io/manual/archive/5.5-stable/cli.html#shared-memory-functions)
  and corresponding `HSLMemoryListRequest` API
- **New** Added
  [base32_encode](https://docs.halon.io/hsl/archive/5.5-stable/functions.html#base32_encode)
  and decode functions
- **New** Added
  [url_encode](https://docs.halon.io/hsl/archive/5.5-stable/functions.html#url_encode)
  and decode functions
- **New** Test command for the asynchronous DNS resolver
  [halonctl resolver query](https://docs.halon.io/manual/archive/5.5-stable/cli.html#dns-resolver)
- **New** Queue suspend filters with
  `halonctl queue suspend list` and `SuspendRequest` API
- **New** Settings for [max
  messages](https://docs.halon.io/manual/archive/5.5-stable/config_smtpd.html#confval-servers%5B%5D.phases.mailfrom.maxmessages),
  recipients and hops
- **New** Added `unix_socket_path` option to
  [http()](https://docs.halon.io/hsl/archive/5.5-stable/functions.html#http)
  function
- **New** Added
  [spool.corrupt](https://docs.halon.io/manual/archive/5.5-stable/config_startup.html#confval-spool.corrupt)
  setting for controlling handling of bad queue files
- **New** High-resolution process runtime counter
  `process.elapsed`
- **New** Active queue performance counters `queue.pickup.X`
- **New** Script error counters `servers.X.scripts.Y.errors`
- **Imp** Fraction of second in
  [sleep()](https://docs.halon.io/hsl/archive/5.5-stable/functions.html#sleep)
- **Imp** Improved performance for large active queue policy rate
  buckets and exclude lists
- **Imp** Ability to specify an ID for dynamic active queue
  suspensions and policy conditions
- **Imp** Ability to filter `halonctl hsl rate list` based on
  conditions
- **Imp** More relaxed rules for naming of ID and file path in YAML
  schemas
- **Imp** Improved `smtpd` process shutdown
- **Imp** Improved SMTP command diagnostics (“in reply to”) in
  bounces
- **Imp** Added Original-Envelope-ID and Original-Recipient headers
  to bounces
- **Imp** Consider all 2xx-codes successful in SMTP client
- **Imp** File descriptor exhaustion error logging and handling
  improved

<a id="v5-4-3"></a>

<a id="id72"></a>

## 5.4.3

Released 2020-11-09

- **Bug** Support binary POST data in background `http()` calls
- **Bug** Fixed MIME’s `verifyDKIM()` after doing message
  modification
- **Bug** Fixed error flag issue with consecutive calls to
  `ScanKAV()` (on same message)
- **Bug** Prevent announcing extensions from HELO/EHLO script hook
  on `HELO`
- **Bug** Fixed `halonctl` missing fields `senderhelo`,
  `saslusername` and `duration`
- **Bug** Fixed issue with queue list duration sort order

<a id="v5-4-2"></a>

<a id="id73"></a>

## 5.4.2

Released 2020-10-01

- **Bug** Fixed issue with PROXY protocol and implicit TLS
- **Bug** Fixed proxy script and lint issue with `halonconfig`
- **Bug** Fixed counting issue with the
  `scripts.proxy.running`/`finished` process stats
- **Bug** Restored the `id` and `ts` fields in `ScanDMARC()`
  output
- **Bug** Enable queuing of messages from `hsh`

<a id="v5-4-1"></a>

<a id="id74"></a>

## 5.4.1

Released 2020-08-14

- **Imp** [UUID
  version](https://docs.halon.io/manual/config_startup.html#confval-environment.uuid.version)
  selector (time/v1 or random/v4)
- **Bug** Fix default enhanced status code in bounces for certain
  errors
- **Bug** Added validation of certain
  [CLI](https://docs.halon.io/go/clitool) arguments to improve error
  reporting

<a id="v5-4"></a>

<a id="id75"></a>

## 5.4

Released 2020-07-22, see the [release
notes](https://docs.halon.io/go/releasenotes54) for notable changes

- **New** CHUNKING/BDAT and the SIZE service extension
- **New** [Disconnect
  script](https://docs.halon.io/hsl/archive/5.4-stable/disconnect.html)
  hook
- **New**
  [yaml_decode()](https://docs.halon.io/hsl/archive/5.4-stable/functions.html#yaml_decode)
  function and [import
  loader](https://docs.halon.io/hsl/archive/5.4-stable/structures.html#data)
  (similar to JSON)
- **New** Ability to export an File classes as a [C++
  std::istream](https://docs.halon.io/hsl/archive/5.4-stable/functions.html#File.toFFIValue)
- **New** Ability to export an X.509 resources as a [OpenSSL
  pointer](https://docs.halon.io/hsl/archive/5.4-stable/functions.html#X509.toFFIValue)
- **New** [FFI
  callback](https://docs.halon.io/hsl/archive/5.4-stable/functions.html#FFI.callback)
  function
- **New** [DSN
  options](https://docs.halon.io/hsl/archive/5.4-stable/postdelivery.html#Bounce)
  to `Bounce()` and `Queue()` that allows overriding content,
  headers, delay, etc
- **New** Pre-defined variable of the [DSN that is to be
  generated](https://docs.halon.io/hsl/archive/5.4-stable/postdelivery.html#d1)
- **New** `Default()` function in post-delivery to [terminate
  script](https://docs.halon.io/hsl/archive/5.4-stable/postdelivery.html#Default)
  based on delivery result and settings
- **New** Settings for minimum amount of free
  [inodes](https://docs.halon.io/manual/archive/5.4-stable/config_startup.html#confval-spool.minfree.inodes)
  and bytes for receiving email
- **New** Setting for
  [fsync](https://docs.halon.io/manual/archive/5.4-stable/config_startup.html#confval-spool.fsync)
  before 250 on DATA
- **New** Settings for number of [max
  hops](https://docs.halon.io/manual/archive/5.4-stable/config_smtpd.html#confval-servers%5B%5D.phases.data.maxhops)
  (loop protection)
  of 30 seconds
- **New** Pre-defined [variable for
  username](https://docs.halon.io/hsl/archive/5.4-stable/connect.html#v-a1)
  when accepting email on local Unix socket
- **New** `http()` [callback
  function](https://docs.halon.io/hsl/archive/5.4-stable/functions.html#http)
  for POST data
- **New** MailMessage
  [queue()](https://docs.halon.io/hsl/archive/5.4-stable/functions.html#MailMessage.queue)
  function
- **New**
  [MailMessage](https://docs.halon.io/hsl/archive/5.4-stable/functions.html#_CPPv211MailMessage)
  `get/setPreamble()` and `get/setEpilogue()` functions
- **New** MailMessage `modifyContent()` function advanced,
  [direct
  modification](https://docs.halon.io/hsl/archive/5.4-stable/functions.html#MailMessage.modifyContent)
  of email data
- **New** Static `File::read()` function that [returns all
  data](https://docs.halon.io/hsl/archive/5.4-stable/functions.html#File)
  from a file path
- **New** LDAP class
  [getoption()](https://docs.halon.io/hsl/archive/5.4-stable/functions.html#LDAP.getoption)
  function
- **New** Numeric
  [separator](https://docs.halon.io/hsl/archive/5.4-stable/literals.html#number)
- **New** [Zero-fill right
  shift](https://docs.halon.io/hsl/archive/5.4-stable/operators.html#bitwise)
  bitwise operator
- **Imp** Ability to change `import` loader type
- **Imp** Includes SIZE= in MAIL FROM if server announces SIZE
  service extension
- **Imp** SMTP client always send EHLO first (and then try HELO)
- **Imp** Do not include detail in local-part in license count
  ([user+detail@domain](mailto:user+detail@domain))
- **Imp** MIME `queue()` [options for delay and
  hold](https://docs.halon.io/hsl/archive/5.4-stable/functions.html#MIME.queue)
- **Imp** Ability to override recipient domain for MX lookup in
  [pre-delivery](https://docs.halon.io/hsl/archive/5.4-stable/predelivery.html#Try)
  and all other places
- **Imp** Access to the queued [email data in
  pre/post-delivery](https://docs.halon.io/hsl/archive/5.4-stable/predelivery.html#f1)
  as a `File` resource
- **Imp** `dns_query()` option for extended results including
  [TTL and type-specific
  fields](https://docs.halon.io/hsl/archive/5.4-stable/functions.html#dns_query)
- **Imp** Added [reply code
  option](https://docs.halon.io/hsl/archive/5.4-stable/connect.html#Accept)
  to all `Accept()` functions
- **Imp** `Auto-Submitted` header to bounces (rfc3834)
- **Imp** Saving custom views on queue pages
- **Imp** Custom metadata groupings and columns on queue pages
- **Imp** Number compare for metadata filters on queue pages
- **Imp** Partial and case sensitive matching of local parts on
  queue pages
- **Imp** Real-time rates for counters on process statistics page
- **Imp** Added process stat counter for finished script hooks
- **Imp** Added multiple *recipientdomain* and *remotemx* option to
  *if* statements in delivery configuration
- **Imp** Network matching in queue conditions for *sender-*,
  *local-* and \*remoteip&
- **Imp** The API output is always normalized as UTF-8
- **Imp** The API supports comparing queue metadata as numbers
- **Imp** The `MIMEPart.setBody()` and `MailMessage.toString()`
  limitation of 1 MiB is now removed
- **Imp** Extended error reporting from Sophos AV
- **Imp** Added  *-R* to `hsh` to override *scripting.rootpath*
- **Imp** Added  *–ffi* to `hsh` to override *scripting.ffi*
- **Imp** Added  *–binary* flag to `hsh`
- **Imp** Added support for FFI in `hsl-lint`
- **Imp** Protobuf schemas are now part of the Linux package
- **Imp** Removed `httprd` from the Linux package
- **Imp** Added *queue load* command to `halonctl` to import
  messages
- **Bug** Resolved issue with SMTPUTF8 and connection pooling
- **Bug** Wait for support processes like `rated` and `dlpd`
- **Bug** Log thread creation errors in *updateQueue*
- **Bug** Make the `domain_includes()` function
  non-case-sensitive
- **Bug** Depend on `uuidd` runtime on Linux
- **Dep** The `Queue()` function (overrides the built-in logic)
  may now exceed the transport’s max retry count
- **Dep** The `SetDSN()` function has been deprecated in favour
  of the “dsn” option to Bounce() and Queue()
- **Dep** The `inet_includes()` function now return none on
  errors
- **Dep** The `LDAPResult.next()` and `File.readline()` now
  return false on end-of-data instead of none
- **Dep** The `MIMEPart.setBody()` limitation of 1 MiB is now
  removed
- **Dep** The dns_query() function’s *ttl* result property has been
  removed in favour of the *extended_result* option
- **Dep** All messages in the active queue now have at least one
  *localip* (instead of showing an empty address)

<a id="v5-3-5"></a>

<a id="id76"></a>

## 5.3.5

Released 2020-06-10

- **Bug** Fixed a stability issue with the connection pool

<a id="v5-3-4"></a>

<a id="id77"></a>

## 5.3.4

Released 2020-05-26

- **Bug** Fixed issue with server connection concurrency limit
- **Bug** Fixed tags (comments) for some types of manual active
  queue suspends
- **Bug** Fixed issue with the proxy script hook

<a id="v5-3-2"></a>

<a id="id78"></a>

## 5.3.2

Released 2020-03-10

- **Imp** Support more charsets by inclusion of latest GNU iconv
- **Imp** Changed log level of ldap_auth() function failures
- **Bug** Fixed issue with active queue policy with certain
  groupings
- **Bug** Fixed issue with decoding of RFC2231 parameters values
- **Bug** Fixed regression with decoding of certain charsets
- **Bug** Fixed regression with Mellanox (mlx5en) network adapters

<a id="v5-3-1"></a>

<a id="id79"></a>

## 5.3.1

Released 2020-02-24

- **Imp** Added SMTP state information to delivery error logs
- **Imp** Added `port` option to
  [dns_query()](https://docs.halon.io/hsl/archive/5.3-stable/functions.html#dns_query)
  function
- **Bug** Fixed issue with duplicate messages API call
- **Bug** Fixed “neq” condition (not equal) with “size” and
  “retry_count” fields
- **Bug** Fixed issue with message size variable and per-recipient
  end-of-DATA script

<a id="v5-3"></a>

<a id="id80"></a>

## 5.3

Released 2020-02-11

- **New** Queue features and API
  - Connection
    [pooling](https://docs.halon.io/manual/archive/5.3-stable/queue.html#delivery-settings)
    (reuse)
  - Fine-grained queue query
    [API](https://docs.halon.io/manual/archive/5.3-stable/api.html)
    (for
    [list](https://docs.halon.io/manual/archive/5.3-stable/cli.html#queue-management),
    update and distribution)
  - Improved [queue
    quota](https://docs.halon.io/hsl/archive/5.3-stable/functions.html#queue_quota)
    functionality
  - Added delivery settings for [active queue
    fields](https://docs.halon.io/manual/archive/5.3-stable/queue.html#delivery-settings)
  - Added active [queue suspend and
    policy](https://docs.halon.io/hsl/archive/5.3-stable/functions.html#queue_suspend)
    functions to more script hooks
  - Added message size including modifications to
    [pre-](https://docs.halon.io/hsl/archive/5.3-stable/postdelivery.html#message)
    and post-delivery script
  - New [on-disk queue
    format](https://docs.halon.io/manual/archive/5.3-stable/queue.html#on-disk-format)
- **New** Command-line interface tool
  [halonctl](https://docs.halon.io/manual/archive/5.3-stable/cli.html)
- **New** SMTP server scripting features
  - Added timestamp, expiration and identity options to the
    [signDKIM](https://docs.halon.io/hsl/archive/5.3-stable/functions.html#MailMessage.signDKIM)
    functions
- **Imp** Script language improvements
  - New
    [Iconv()](https://docs.halon.io/hsl/archive/5.3-stable/functions.html#Iconv)
    class for internationalization conversion
  - Added
    [array_every](https://docs.halon.io/hsl/archive/5.3-stable/functions.html#array_every)
    function to test all element against callback
  - Re-implemented
    [barrier](https://docs.halon.io/hsl/archive/5.3-stable/structures.html#barrier)
    using shared
    [memory](https://docs.halon.io/hsl/archive/5.3-stable/functions.html#shared-memory)
    functions
  - Added Base64 encoding option to the MIME
    set/[addHeader](https://docs.halon.io/hsl/archive/5.3-stable/functions.html#MIME.addHeader)
    functions
- **Imp** Certificate can be in [reloadable
  configuration](https://docs.halon.io/manual/archive/5.3-stable/config_smtpd.html#confval-pki.private%5B%5D)
  even if private key is in
  [startup](https://docs.halon.io/manual/archive/5.3-stable/config_startup.html#confval-pki.private%5B%5D)
- **Imp** Added graceful draining to the background
  [http()](https://docs.halon.io/hsl/archive/5.3-stable/functions.html#http)
  process *httprd*
- **Imp** Added idle timeout to [virtual
  servers](https://docs.halon.io/manual/archive/5.3-stable/config_smtpd.html#confval-servers%5B%5D.timeout.idle)
- **Dep** [Important
  changes](https://docs.halon.io/go/releasenotes53)
  - Removed GetMailQueueMetrics() in favour for new
    [queue_quota()](https://docs.halon.io/hsl/archive/5.3-stable/functions.html#queue_quota)
    function
  - Merged *smtpd* and *queued* processes which affects logging
