letterbox - SMTP to Maildir delivery agent

Letterbox is a simple Go program that accepts SMTP connections and delivers mail to a per-user maildir directory. I use it to gather reports from various services on my LAN without needing to setup postfix or some other more complex MTA.

Usage of letterbox:
  -config string
        Path to configutation file (default "letterbox.toml")
  -host string
        Host IP or name to bind to
  -maildirs string
        Path to the top level of the user Maildirs (default "/var/spool/maildirs")
  -port int
        Port to bind to (default 25)

The configuration file is written using TOML. You must specify at least one host/network and one email otherwise delivery will fail. For example:

hosts = ["", "", "logger.mydomain.com"]
emails = ["root@mydomain.com", "user@another.com"]

If the connection is not from an allowed host the connection will be refused. Destination emails must be listed in the emails list. The user portion of the email will be used to create a new maildir under the -maildirs path. For example, sending an email to user@another.com will create a new maildir at /var/spool/maildirs/user.

You will likely want to create your maildirs someplace else. On my system the /var/spool/maildirs directory is owned by the user that is running letterbox.

Redirect port 25

Never run this as root.

Use a higher port, like 2525, and configure your system’s firewall to redirect port 25 to it. For example, using nft, you can do this by adding:

# redirect 25 to 2525
table nat {
  chain prerouting {
    type nat hook prerouting priority 0;
    tcp dport 25 dnat :2525
  chain postrouting {
    type nat hook postrouting priority 0;

Or with iptables:

 -A PREROUTING -p tcp -d SERVERIP --dport 25 -j REDIRECT --to-ports 2525

Replace the SERVERIP with the IP of the server letterbox is running on.


This code is not meant to be run on the open network. Make sure it is protected behind a firewall, and is running as an un-privileged user. Never run it as root.