Process improvements


  • Discuss: historically remove many/most/all DJB-era .md docs from the source tree and preserve them on the website
    • Possibly false assumption: we were never going to update them
    • Possibly false assumption: they're not needed to grok/navigate the code
  • Start a next-release page (excluding it from the releases feed)


  • Redo patch branches (where needed) like so:
    1. Commit (if needed) to restore context we've changed
    2. Commit-with-attribution: upstream patch, as verbatim as possible
    3. Commit (if needed) to fix compilation, style, etc.

Smoother PRs

  • Focus for a while on automating sources of confidence:
    • Integrate #225 (the patch checker) into GitHub Actions
    • Make sure automatically that Makefile rules listing dependencies on local include files are accurate
      • Also that "foo.h" includes come before <foo.h>
    • #189 Turn up warnings in local builds, fix everything that doesn't break patches, ratchet CI conf-cc -Wthis -Wthat to match
    • #48 Make regular use of code analysis tools
    • Reconsider alternatives to check, now that warnings are no longer rampant
    • Write more tests
      • Integrated tests, too (such as swaks)
  • Discuss whether to keep maintaining an in-tree CHANGES.md
    • If yes, make PRs fail checks when we forget
    • Eike: let's keep CHANGES.md for changes that are user-facing, e.g.
      • autobuild workflow changes
      • information about how we made it that isn't information about what's in there

Smoother releases

  • Make a small change, then cut another release, for the sole purpose of smoothing out the release process



  • #7 Stop redeclaring system functions
  • Remove everything from 1.09 "What's going away?" that we're sure now is the time

Patches to merge

Ideas to merge

  • #94 Sprinkle fsync() to make syncdir unnecessary
  • Tiny changes to qmail-smtpd to support running under a qmail-popup-alike SMTP AUTH parent program

Programs to merge

  • #227 Import qmail-qfilter
    • #232 Test qmail-inject recipient address qualification
  • #233 Import qmail-rcptcheck, qmail-rcptcheck-realrcptto, and qmail-rcptcheck-badrcptto
    • Enable realrcptto by default?
  • Import qmail-spp-spf


  • #35 FHS (#2)
    • split conf-qmail in to conf-qmail-bin, conf-qmail-queue, conf-qmail-man, etc.
    • /var/qmail/DIR unless /var/qmail not in conf-qmail
    • Configuration sugar: ./configure && make && make install (#9)
  • Debian (deb), RedHat (rpm), and /package packaging
    • #76 binary builds on openSUSE build service and locally
      • deb and rpm builds. (was #59)
    • FHS-aware (default on): /var/qmail contains symlinks to FHS-compatible paths
    • FHS-strict (default off): /var/qmail does not exist
    • #91

1.11 and onward

  • Incrementally integrate inbound STARTTLS and AUTH
  • Incrementally redesign qmail-remote for outbound TLS, AUTH, SIZE, PIPELINING, SMTPUTF8, IPv6
  • #50 Add spawn-filter for filtering messages from qmail-remote and qmail-local
  • Add SRS and DKIM filters
  • (see Designs)


Publish some "extensions", if that still makes sense

  • qmail-popup
  • qmail-pop3d
  • qmail-qmtpd
  • qmail-qmtpc


Breaking changes to the queue

  • new build time defaults for on-disk queue
  • add queue repair tool
    • #67 remove qmail-upq
    • including the ability to upgrade a 1.x queue to 2.x in-place
  • merge big-todo (changes queue layout)
  • increase default conf-split to 31 (changes queue layout)
  • merge ext-todo
    • add a qmail-todo manpage, #23
  • merge netqmail-big-concurrency

Other breaking changes

  • Merge changes for high-volume installations that are harmless defaults in 2020 (taking care to migrate smoothly)
  • qmail-ldap, or enough interfaces to let extensions provide LDAP integration
  • make sure everything works with vmailmgr, vpopmail, other approaches to "virtual users"
  • remove deprecated code
    • #71 remove install script

Breaking changes to (some) patches

  • #43 cleanup: remove readwrite.h, use unistd.h instead
  • #44 cleanup: remove exit.h, use unistd.h instead
  • cleanup: remove fork.h, use unistd.h instead

Port to the latest DJB libraries. Remove local copies. Depend on external libowfat or skalibs.

  • Replace stralloc with array
  • Replace substdio with buffer
  • Replace time-handling code with libtai
  • Replace DNS resolver code with djbdns's
  • #88 Use mess822
  • Replace poll/select with iopause
    • Possibly add kqueue and/or epoll support to iopause
  • Replace exec (and related env_puts) with pathexec
  • Update to latest cdb
  • Use socket for any remaining networking code that's still necessary


Port unmerged, blessed netqmail patches to the extension interface


Extensions for postmaster interfaces

  • Help developers adapt some code of theirs and get it merged


Extensions for email clients

  • Help developers convert more of their existing code to extensions