WARNING: Before upgrading Mailmunge, please search this file for
*** NOTE INCOMPATIBILITY ** to see if anything has changed that might
affect your filter.

2025-07-14 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.20

	* PACKAGING: Don't make DEBs and RPMs depend on Sendmail or Postfix.
	  You can feasibly run Mailmunge on a system without an MTA.

	* DOCUMENTATION: Clarify that any file descriptors created in
	  prefork_initialize() will be closed before the filter runs.

	* DOCUMENTATION: Document what happens if you run Mailmunge
	  on a system that lacks an MTA

	* NEW TESTS: Add Debian 13 (Trixie) and Rocky 10 Docker tests.

2025-02-21 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.19

	* BUG FIX: The multiplexor "-Z" option could cause an unrelated
	  file descriptor to be closed, leading to all kinds of errors.
	  Thanks to Andrey Tatarnikov for reporting this bug

	* NEW TESTS: Add Ubuntu 24.04 (Noble Numbat) Docker tests

2025-02-18 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.18

	* DOCUMENTATION: Document Postfix's smtpd_delay_open_until_valid_rcpt
	  setting.

	* IMPROVEMENT: Log a warning if we add a DKIM signature outside
	  of filter_wrapup.

	* IMPROVEMENT: Log warnings if functions that should not be called
	  in filter_wrapup actually are.

	* IMPROVEMENT: Update unit test infrastructure so we can introspect
	  messages that the filter logs.

2024-07-30 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.17

	* BUG FIX: mailmunge-multiplexor: Remove newlines from messages that
	  are syslogged when activating a worker.

	* BUG FIX: mailmunge-multiplexor.c: Zero-terminate a string that
	  previously might not have been.

	* IMPROVEMENT: Add Docker tests for Rocky 9 and rename the old
	  Rocky 8 tests from "rocky" to "rocky8".

	* IMPROVEMENT: Fix a bunch of "cppcheck" warnings in the C code
	  and "perlcritic / use strict / use warnings" complaints in the Perl.

	* IMPROVEMENT: mailmunge: Exit with an error if multiple options are
	  given for options where it only makes sense to have at most one.

	* DOCUMENTATION IMPROVEMENT: Add examples of using $ctx->log() to
	  the sample filter.

	* BUG FIX: When returning a Mailmunge::Response object from a
	  message-context callback, preserve the code and dsn parameters,
	  if any are supplied.

2024-02-06 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.16

	* MINOR NEW FEATURE: mailmunge: Add the "-Q n" option to set the
	  libmilter debugging level (with smfi_setdbg).

	* MINOR CHANGE: Rename a few MD_* variables to MM_* in the C code

	* MINOR IMPROVEMENT: Escape non-ASCII characters when logging header
	  changes.

2024-02-04 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.15

	* BUG FIX: Do not allow action_add_header or action_change_header
	  to create headers with embedded carriage-returns.  This was
	  causing problems with DKIM signatures for very picky MTAs.

	* BUG FIX: Remove a leftover debugging line from
	  Mailmunge::Action::DKIMSigner

	* POD FIXES: Minor documentation fixes and updates.

2024-01-31 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.14

	* MAJOR FIX: Mailmunge::Action::DKIMSigner can correctly sign a
	  message whose headers have been modified, as long as you follow
	  the constraints mentioned in that module's POD.

	* DOCUMENTATION: Minor POD fixes.

	* mm-mx-ctrl: Add the "mta" command to query what Mailmunge thinks
	  the MTA is.

	* mm-mx-ctrl: Add the "filterversion" command and the analogous
	  filter_version filter method.

	* mm-mx-ctrl: Fix handling of the "-b" flag

	* watch-multiple-mailmunges.tcl: Show the MTA and Mailmunge version
	  on each remote machine.

2024-01-25 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.13

	* Add Mailmunge::Context->ambiguous_content() method.
	  This requires MIME::tools 5.513 or newer and indicates
	  an ambiguity in the input MIME message that could be a
	  security risk.  See the MIME::Parser documentation for
	  details.

	* Minor POD fix.

2023-07-02 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.12

	* Mailmunge::Context: Add canonical_first_recipient() function.

	* mailmunge-multiplexor: Drain stderr when a worker goes from
	  busy to idle, before clearing out qid.

	* mailmunge-multiplexor: Eliminate compiler warnings issued by
	  GCC 12.2.0

	* Docker: Add support for running regression tests in Debian 12
	  (Bookworm) Docker containers

	* Mailmunge::Filter: Make canonical_email(undef) return undef.

2023-02-17 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.11

	* Mailmunge::Filter: the push_tag and pop_tag methods alter
	  the process title to something useful that we can see with "ps".
	  (This is in addition to reporting the tags back to
  	  mailmunge-multiplexor.)

	* mm-mx-ctrl: Eliminate compiler warning.

	* configure.ac: Enable link-time optimization if possible.

	* Mailmunge::Test::SMTPForward: Add log_smtp callback.

	* Many places: Add SPDX-License-Identifier tags to source files.

	* Documentation: Many improvements, typo-fixes and clarifications.

	* Documentation: Add "THINGS YOU SHOULD NEVER DO IN YOUR FILTER CODE"
	  section to Mailmunge::Filter and Mailmunge::Filter::Compat.

	* mm-mx-ctrl:  Make "mm-mx-ctrl reload" a synonym for
	  "mm-mx-ctrl reread"

	* mailmunge-multiplexor: Clear out qid when a worker exits the busy
	  state.  Not doing so could cause confusing logs with old queue-IDs.

	* mailmunge-multiplexor: Log reload/reread requests.

	* Perl code: Eliminate Perl::Critic complaints (on "gentle" setting.)

	* Debian packaging: Set DH_COMPAT to 10 instead of 9.

	* Regression tests: Add Docker tests for Sendmail and Postfix on
	  Ubuntu 22.04.

2022-10-21 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.10

	* Minor documentation improvements

	* rm_r.c: Remove dead code

	* mailmunge: Print embedded Perl version if invoked with `prcap`

	* mailmunge.spec: Point source URL to mailmunge.org instead of
	  github.com

	* mailmunge, mailmunge-multiplexor, mm-mx-ctrl: Wrap the read()
	  system call so we automatically restart in the face of EINTR.
	  Older versions of mailmunge may not have properly drained
	  stderr when a worker process exits.

2022-07-04 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.09

	* New feature: Add Mailmunge::Action::DKIMSigner for DKIM-signing
	messages.

	* mailmunge: In addition to the HEADERS file that contains unwrapped
	headers, create a PRISTINE_HEADERS file with the original unmodified
	headers.  This is required for reliable DKIM signing if we modify
	the message body.

	* Minor documentation fixes

2022-06-15 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.08

	* spec/mailmunge.spec.in: Add a spec file that lets you build
	Mailmunge RPMs.  rpm -tb mailmunge-$VERSION.tar.gz should work

	* .github/workflows/gitub-action.yml: Run unit and regression tests
	when pushing to GitHub

	* c/Makefile.in: Remove obsolete "chown" command in install target

	* c/config.h.in: Add test for setproctitle_init to make Mailmunge
	compile properly on FreeBSD

	* mailmunge-multiplexor: Log MTA type in the "multiplexor alive"
	log line rather than a separate log line

	* mailmunge: Add option to debug Milter memory allocation/deallocation

	* Many places: Fix typos in comments

	* Mailmunge::Filter: Move many action_* methods into
	Mailmunge::Context instead.  However, the Mailmunge::Filter versions
	will be maintained indefinitely for backward-compatibility; they
	just call into the context object.  Functions affected are:

	    action_from_response, action_bounce, action_discard,
	    action_tempfail, action_change_header, action_delete_header,
	    action_delete_all_headers, change_sender, add_recipient,
	    delete_recipient, action_add_header, action_insert_header,
	    action_sm_quarantine, and action_quarantine_entire_message

	For any METHOD in the above list, you can replace:

	    $self->METHOD($ctx, @args);

	with:

	    $ctx->METHOD(@args);

	* Mailmunge::Filter: The filter_message and filter_wrapup
	functions can return a Mailmunge::Response object, which (if it's
	TEMPFAIL, REJECT or DISCARD) will be respected

	* Mailmunge::Filter::Compat: The filter_begin, filter, and
	filter_multipart functions can return a Mailmunge::Response
	object, which (if it's TEMPFAIL, REJECT or DISCARD) will be
	respected

	* Mailmunge::Response: The is_discard accessor has been added

	* Mailmunge::Context: Added canonical_sender and canonical_recipients
	methods

	* Documentation: Remove obsolete references to "server mode"

	* Documentation: Document pitfalls of the "-y" mailmunge option
	and turn it off by default in the systemd unit and sysvinit
	startup script

2022-02-13 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.07 RELEASED

	* Mailmunge::Filter: Add input_fh convenience method

	* Mailmunge::Test::Rspamd: Log exact reason ($@) if calling rspamd
	fails.

	* Regression tests: Add support for Debian bullseye docker images

	* Test::Mailmunge::Utils: Fix POD for parse_and_copy_msg

	* configure: Add dependency on FindBin as per bug report from
	Robert Scheck.

	* configure: Add --disable-perl-build-artifacts option to avoid
	generation of perllocal.pod and .packlist files.  Problem pointed
	out by Robert Scheck.

	* Unit test: Skip tests that require working DNS if they are run on
	a machine without DNS.  Problem pointed out by Robert Scheck.

2022-01-03 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.06 RELEASED

	* documentation: Clarify that the -p argument to mailmunge(8) wants
	  a socket specification following the libmilter spec and not the
	  Mailmunge spec.

	  In particular, if you want to bind o -p TCP socket to localhost
	  only, you **MUST** use the form:  -p inet:port@127.0.0.1
	  The form -p inet:port listens on all interfaces!

	* documentation: Fix typos

	* Mailmunge::Filter: Stricter checking of command-line arguments

	* Mailmunge::Filter: Consistent capitalization of error messages

	* Mailmunge::Filter: Add decode_mime_string utility function.  This
	  tries very hard to sensibly decode a MIME-header-encoded string
	  to a native Perl string.

2021-09-30 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.05 RELEASED

	* documentation: Fix many typos and add some clarifications.

	* tests: Change syslog identifier so that tests use a different
	  syslog identifier than production Mailmunge filters.

	* compilation: Use -Wno-unused-result flag if the compiler supports it.

	* Mailmunge::Action::Boilerplate: Log error messages if adding
	  boilerplate fails.

	* mailmunge: Rather than determining the host's IP address by
	  resolving its hostname, create a connected UDP socket to 8.8.8.8
	  and use getsockname() to get the local IP address chosen by the
	  kernel.

	* mailmunge-multiplexor: Fix potential code path that could call
	  non-signal-safe snprintf function from a signal handler.

	* tests: Remove unused file

	* mailmunge: Remove support for systems that lack inet_ntop.
	  inet_ntop was standardized over 15 years ago, so any systems that
	  lack it are not worth supporting.

	* mailmunge-multiplexor.c: Log the "MTA appears to be: XXX" message
	  from the C code instead of the Perl code.  This causes it to be
	  logged only once per multiplexor startup instead of once per scanning
	  worker startup.

2021-08-17 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.04 RELEASED

	* Mailmunge::Filter: Read the COMMANDS files prior to filter_sender
	  and filter_recipient callbacks.  This populates sendmail_macros.

	* mailmunge-multiplexor: Fix error in embedded Perl code.
	  PERL_SYS_TERM was being called each time an embedded interpreter
	  was destroyed; this is incorrect.  While this code happened to
	  work on older Perls, it *will fail* on newer perls such as that
	  shipped with Debian Bullseye.

	* mailmunge: Provide more helpful error messages if filter file
	  is not readable or has a syntax error or fails for some reason.

	* mailmunge-multiplexor: Set default for "-w" option to 1 second
	  instead of 3.

	* configure: add --with-perlinstalldirs={site,perl,vendor} flag

	* gen_id.c: Generate 8-character IDs instead of 7-character ones.
	  This allows for up to 216,000 IDs per second.

	* Mailmunge::Filter: diagnose incorrect return values from various
	  filter callbacks and log helpful error messages.

	* Makefile: Don't install the *.in files when running "make install"

	* Many typo fixes and documentation improvements.

2021-08-01 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.03 RELEASED

2021-07-30 Dianne Skoll <dianne@skollsoft.com>

	* Add Mailmunge::Filter::action_from_response helper function.
	  If appropriate, it calls an action_* function based on a
	  Mailmunge::Response object.  See docs for details.

	* Add support for running regression tests against Rocky Linux 8
	  as well as Debian 10.  Both Sendmail and Postfix are tested.

	* Add support for Rspamd (https://rspamd.com/).  We do not use
	  the rspamc client; instead, we talk directly to the daemon using
	  its native HTTP protocol.

	* Update included copy of GPLv2 to the latest version

	* Put GPLv2 license markers in all files

	* Use -fPIE rather than -fPIC when building executables

	* Get rid of --enable-cleanup-with-rm

	* Clean out a LOT of cruft from configure.ac

	* Include a sample /etc/default/mailmunge file

	* Better diagnosis of syntax errors in filter file; terminate
	  multiplexor if it looks like the filter is completely broken.

	* Many minor fixes and documentation fixes.

2021-07-18 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.02 RELEASED

	* Adds Mailmunge::Test::Greylist - an implementation of greylisting

2021-06-01 Dianne Skoll <dianne@skollsoft.com>

	* Mailmunge 3.01 RELEASED

	* Many fixes to documentation

	* Added continuous integration using Github Actions

	* BUGFIX: Mailmunge::Test::GetMX: Fix incorrect test for
	  class E networks

	* Use getaddrinfo to resolve IP->hostnames so it works with both
	  IPv4 and IPv6

	* Add Mailmunge::Filter->ip_to_hostname() function

	* Check both 127.0.0.1 and ::1 when checking for loopback address

	* Proper generation of man pages from POD (include man page name;
	  put pages in proper section.)

2021-05-18 Dianne Skoll <dianne@skollsoft.com>

	* Initial fork from the MIMEDefang project
