Email Configuration for plan9 Acme on OpenBSD

Following are steps for configuring email for plan9 Acme.

It was not hard to setup, but it took too long. I never found one page that covered everything from reading, to sending, to saving copies of outgoing mail. I had to read a lot of man pages, online posts, and source code to get everything working.

My hope is this post serves as one page that covers all the steps for configuring email for Acme.

Let me know if I've missed anything.


This post is focused on how to make it work, not why it works. Perhaps a future post will discuss what's going on under the hood.

The key things to understand are:

  • factotum(4) handles authentication
  • mailfs handles connectivity
  • plumber(4) handles features like notification (which is not discussed here)
  • Mail is a command and an executable acme uses to interact with mailfs
  • acme(1) handles reading and writing email

The steps are slightly OpenBSD centric (6.3-current as of the writing), but easily adapted to other platforms that run plan9port.

The steps are also specific to reading email hosted by an IMAP server. POP3 should be similar. See the man pages for factotum(4) and upasfs(4).

I don't use the plan9 mailer. I replace it with msmtp(1), which is a handy SMTP client that behaves a lot like sendmail(8).

For more details about Mail, see $PLAN9/src/cmd/acme/mail/readme, and $PLAN9/src/cmd/acme/mail/*.c. I've also included a Resources section at the end.


  $ cd $PLAN9/src/cmd/upas/
  $ doas mk install
  $ cd nfs
  $ doas mk install

Read Email

  1. Start plumber(4) and factotum(4):

      $ 9 plumber
      $ 9 factotum
  2. Add credentials:

      # !password? tells factotum to prompt for password
      $ 9 factotum -g 'proto=pass service=imap \ !password?'
  3. Start mailfs:

      # stunnel is required by mailfs for tls connections
      $ doas pkg_add -i stunnel
      # -t = use tls
      $ 9 mailfs -t
  4. Middle-click Mail in Acme to read email

Send Email

  1. Install msmtp from ports for sending,

  2. Configure $HOME/.msmtprc:

      $ cat $HOME/.msmtprc
      # Set default values for all following accounts.
      logfile ~/no_bak/.cache/msmtp.log
              auth on
              port 465
              tls on
      # store password in ~/.netrc
      # or use password directive here
      # for more secure options, review passwordeval in man page
      account example
              # password supersekret
  3. Create $HOME/mail/pipefrom:

      $ cat $HOME/mail/pipefrom
      cat /dev/stdin | msmtp -f $@
  4. Create $HOME/mail/headers:

      # Necessary because otherwise marshal(1) will use your $USER@hostname
      # an environment variable called upasname overrides the From: value in
      # in $HOME/mail/headers
      $ cat $HOME/mail/headers
      From: My Real Name <>
  5. Middle-click Mail in the tag bar for the mail browser, Reply or middle-sweep Reply All to send email.

    You have to add your own Subject and To lines:

      Subject: Test Email
      Include: <path_to_file>
      Attach: <path_to_file>
      This is a test.
      Notice I didn't put a "From:" line above. My $HOME/mail/headers
      file will take care of that.
      Include: file places a copy of file in the message as an
              inline MIME attachment.
      Attach: file places a copy of file in the message as a regular
              MIME attachment.
  6. Middle-click Post to send.

About Outgoing Email

Mail always writes outgoing email in $HOME/mail/outgoing (if it exists), regardless of whether you're using IMAP.

I'm working on a patch to write the mail to an IMAP folder. I'll post something on the blog when it's ready.

For now, make sure you touch(1) $HOME/mail/outgoing, otherwise your outbound email will not be saved.

Another option would be to add a "Bcc:" header to yourself in $HOME/mail/headers.


msmtp(1) can be configured with multiple SMTP servers, selecting the correct server based on the sender, or a command line value, but there's no way to set the "From:" header while writing an email. Mail seems to strip it.

Perhaps I'll write a patch for that as well.