This is the eighth in a series of “Nifty and Minimally Invasive qmail Tricks”, following

  1. qmail + SMTP AUTH + SSL + TLS - patches
  2. qmail + badrcptto - patches
  3. qmail + NetBSD nightly maintenance
  4. qmail + IMAP-before-SMTP
  5. qmail + spam filtering
  6. qmail + SMTP AUTH + TLS redux
  7. qmail + outbound DKIM

The mess822-QMAILQUEUE patch

This is not the QMAILQUEUE patch by Bruce Guenter that’s included in netqmail. When you want qmail-smtpd(8), for instance, to be able to modify or reject incoming messages by inserting a wrapper around qmail-queue(8), the QMAILQUEUE patch makes that easier.

The mess822-QMAILQUEUE patch is the exact same idea (and code), but for mess822.

If QMAILQUEUE is set in the environment, ofmipd(8) (and new-inject(1)) run that program in place of qmail-queue, allowing you to modify submitted messages in arbitrary ways, above and beyond mess822’s own rewriting features.

Your wrapper needs to adhere to the qmail-queue(8) interface, and should probably conclude its work by running the real qmail-queue binary, which — since you’re applying this patch — can stay right where it is.

With the QMAILQUEUE patch, rather than write your own wrapper, I’d suggest using Bruce Guenter’s qmail-qfilter and writing your own filters. With this mess822-QMAILQUEUE patch, I suggest the same.

(I hope to take advantage of this patch to tag my occasional messages to DJB’s mailing lists with Charles Cazabon’s pymsgauth, so they get posted without my manually interacting with qsecretary.)

To set QMAILQUEUE in ofmipd’s environment:

  1. Find your ofmipd(8) invocation.
  2. If it doesn’t already call env(1) to clear the environment, add that.
  3. Look for where env is called, and pass QMAILQUEUE=/path/to/your-wrapper-program-here to it.
  4. Restart your ofmipd service.

If you’re using qmail-run from pkgsrc, that’s as easy as:

  1. echo "qmailofmipd_postenv='QMAILQUEUE=/path/to/your-wrapper-program-here'" >> /etc/rc.conf
  2. /etc/rc.d/qmailofmipd restart

Here again is the mess822-QMAILQUEUE patch.

Posted Sat May 27 12:37:16 2017 Tags:

Then and now

A few years ago, after a long stretch of not feeling heard in my job, I resolved to change that, starting with getting a different kind of job. Then I started attending conferences, making Agile in 3 Minutes, and appearing on Agile for Humans and other podcasts. Finally, I found myself at many of the same conferences as a speaker, sometimes even by invitation.

This took a nonzero amount of luck and a lot of effort. I put in the effort because, as a human being, I needed to feel heard at work. If you’re reading this, odds are you’re a human being with the same need.

Today I expect that I can mostly get myself listened to, and am surprised (and indirectly, gratified) on the rare occasions when I can’t. Compared to myself a few years ago, I feel relieved, empowered, and a little scared. Scared? Yeah, sometimes. When folks are apparently much more inclined to try as I suggest, it becomes much more important that I suggest wisely.

Them and me

My path here was, and is, smoother than others’. One way I’ve come to understand this: when I go to conferences, the worst I ever feel (or expect to feel) is introvert-overwhelmed. It happens. I have to strategize what to do when I notice my tank is running low, or when I’ve failed to notice for too long. Either way, it can usually be as simple as going back to my hotel room.

Another way I’ve come to understand this: when I go back to my room, I’ve never been followed there, or been creeped on or harassed in any number of other ways. So I’ve neither had to deal with those things as they’re happening, nor had to decide whether I’m going to sign myself up to strategize how I’ll deal with those things happening again.

Finally, and most clearly, I’ve come to understand this by hearing from people who are no longer willing to attend a conference unless it has a Code of Conduct. I haven’t experienced what they have, so I’m still willing to go, I think (it’s been a while since I had to choose). The thought that I’m able to feel comfortable in a place where others might not be makes me wonder: when I’m there, what I can do about it?

I’ve started doing a small thing.

Me and you

If you’re in a position like mine — where you’re listened to and heard — you have currency. I’d like to suggest a small investment you can make with it.

When you’re presenting at a conference, spend three of your minutes giving a quick overview of the Code of Conduct that’s in effect:

  • Where to find it
  • What it can and can’t do
  • Key examples of language to look for
  • Some ramifications for the audience and the conference as a whole

If the conference doesn’t have a Code of Conduct, say that out loud, along with this one weird ramification: some of the people we could have learned the most from aren’t here.

If the conferences where you’re speaking are technical and/or Agile, you can relate all of this to TDD and/or BDD, and encourage folks to pair afterward on example scenarios for shared understanding.

Invest wisely

Why do I suggest this? Because in my limited experience of not being listened to, followed by being frighteningly well listened to, I can begin to guess what it’s like to be frightened of worse things and then of not being listened to about them. And I can begin to guess, when humans want to add to our communities and we don’t take small chances to try to include them, how much the rest of us lose.

If you have currency, consider making a small investment. The returns may surprise us all.

Steal freely

Here’s the text of the slides I’ve been using for my last several presentations (example). The content is licensed CC-BY-4.0 or in the public domain, whichever you prefer.

Copy, modify, and present as you wish. Please share what you learn!

Posted Wed May 24 16:32:06 2017 Tags:


This is the seventh in a series of “Nifty and Minimally Invasive qmail Tricks”, following

  1. qmail + SMTP AUTH + SSL + TLS - patches
  2. qmail + badrcptto - patches
  3. qmail + NetBSD nightly maintenance
  4. qmail + IMAP-before-SMTP
  5. qmail + spam filtering
  6. qmail + SMTP AUTH + TLS redux


When you want to wrap qmail-remote(8) with another program — for instance, to DKIM-sign outgoing mail — the QMAILREMOTE patch lets you do so by setting an environment variable.

If QMAILREMOTE is set in the environment, qmail-rspawn(8) runs that program in place of qmail-remote. Kinda like the QMAILQUEUE patch.

Your wrapper needs to adhere to the qmail-remote(8) interface, and should probably conclude its work by running the real qmail-remote binary, which — since you’re applying this patch — can stay right where it is.

To set QMAILREMOTE in the environment:

  1. Find your qmail-start(8) invocation (LWQ recommends /var/qmail/rc).
  2. Look for where PATH gets passed to env(1).
  3. Also pass QMAILREMOTE="your-wrapper-program-here".
  4. Restart qmail.

Here again is the QMAILREMOTE patch.

Posted Mon May 22 12:48:58 2017 Tags:

Two days ago:

  1. Free time
  2. Trainer
  3. Hot sun
  4. Hills
  5. Water
  6. Dog
  7. Porch
  8. This status update
  9. Nothing whatsoever
  10. …?
  11. Profit!

Generally, recalibrating…

  • Metabolism: eating fatty meat (and not much else)
  • Strength: training 3x/week
  • Irritation: allergy shots 2x/week
  • Everything: walking every day

I’m done with working and conferencing. I’m getting as ready as I can for life to change, partly by seeking advice everywhere I can get it.

Oh hey there, reader. Do you have kids? What do you wish you’d known (or paid more attention to) before your first arrived?

Posted Fri May 19 13:11:52 2017 Tags:
Photo by Jason Dinkelmann
Jeff and I describe the A&B Code of Conduct

At Agile and Beyond in Ann Arbor, Jeff Hoover and I facilitated a workshop on effective collaborative software development for distributed teams (including remote pairing and mobbing).

I also appeared on a Blame, Shame, and Punishment panel with April Jefferson and Tim Ottinger, moderated by John Le Drew.

The night before the conference, some of us got together for drinks, and nearly everyone who walked in the door was someone for me to hug. It was wonderful to make a return visit to be among so many friends in southeast Michigan, to design and run another workshop with Jeff, and to feel satisfied about not going to any more conferences for a while. My heart is full. And my mind is full of heartily solicited advice for how to manage when my heart will soon be overflowing.

Oh yeah, the workshop:

Here’s the abstract:

The Best Team Anywhere: Distributed Agile Tradeoffs and Techniques

Colocated Agile is the easiest way to do a hard thing. Distributed Agile is harder. But it’s 2017! It’s strategically valuable to be able to work effectively with people no matter where they are. Bring your laptops and prepare to experience the basic mechanics, pitfalls, and techniques of distributed teamwork, including “remote” pairing.

Photo by Kristen Belcher
L to R: John, April, me, Tim
Posted Fri May 5 00:00:00 2017 Tags: