Setting up a local dev mail server August 5, 2018 on Drew DeVault's blog

As part of my work on lists.sr.ht, it was necessary for me to configure a self-contained mail system on localhost that I could test with. I hope that others will go through a similar process in the future when they set up the code for hacking on locally or when working on other email related software, so here’s a guide on how you can set it up.

There are lots of things you can set up on a mail server, like virtual mail accounts backed by a relational database, IMAP access, spam filtering, and so on. We’re not going to do any of that in this article - we’re just interested in something we can test our email code with. To start, install your distribution of postfix and pop open that /etc/postfix/main.cf file.

Let’s quickly touch on the less interesting config keys to change. If you want the details about how these work, consult the postfix manual.

Also ensure your hostname is set up right in /etc/hosts, something like this:

127.0.0.1 homura.localdomain homura

Okay, those are the easy ones. That just makes it so that your mail server oversees mail delivery for the 127.0.0.0/8 network (localhost) and delivers mail to local Unix user mailboxes. It will store incoming email in each user’s home directory at ~/Maildir, and will deliver email to other Unix users. Let’s set up an email client for reading these emails with. Here’s my development mutt config:

set edit_headers=yes
set realname="Drew DeVault"
set from="sircmpwn@homura"
set editor=vim
set spoolfile="~/Maildir/"
set folder="~/Maildir/"
set timeout=5
color index blue default ~P

Make any necessary edits. If you use mutt to read your normal mail, I suggest also setting up an alias which runs mutt -C path/to/dev/config. Now, you should be able to send an email to yourself or other Unix accounts with mutt1. Hooray!

To accept email over SMTP, mozy on over to /etc/postfix/master.cf and uncomment the submission service. You’re looking for something like this:

127.0.0.1:submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_tls_auth_only=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit
#  -o milter_macro_daemon_name=ORIGINATING

This will permit delivery via localhost on the submission port (587) to anyone whose hostname is in $mydestination. A good old postfix reload later and you should be able to send yourself an email with SMTP:

$ telnet 127.0.0.1 587
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 homura ESMTP Postfix
EHLO example.org
250-homura
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
MAIL FROM:<sircmpwn@homura>
250 2.1.0 Ok
RCPT TO:<sircmpwn@homura> 
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
From: Drew DeVault <sircmpwn@homura>
To: Drew DeVault <sircmpwn@homura>
Subject: Hello world

Hey there 
.
250 2.0.0 Ok: queued as 8267416366B
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

Pull up mutt again to read this. Any software which will be sending out mail and speaks SMTP (for example, sr.ht) can be configured now. Last step is to set up LTMP delivery to lists.sr.ht or any other software you want to process incoming emails. I want most mail to deliver normally - I only want LTMP configured for my lists.sr.ht test domain. I’ll set up some transport maps for this purpose. In main.cf:

local_transport = local:$myhostname
transport_maps = hash:/etc/postfix/transport

Then I’ll edit /etc/postfix/transport and add these lines:

lists.homura.localdomain lmtp:unix:/tmp/lists.sr.ht-lmtp.sock
homura.localdomain local:homura

This will deliver mail normally to $user@homura (my hostname), but will forward mail sent to $user@lists.homura to the Unix socket where the lists.sr.ht LMTP server lives.

Add the subdomain to /etc/hosts:

127.0.0.1 lists.homura.localdomain lists.homura

Run postmap /etc/postfix/transport and postfix reload and you’re good to go. If you have the lists.sr.ht daemon working, send some emails to ~someone/example-list@lists.$hostname and you should see them get picked up.


  1. Mutt crash course: run mutt, press m to compose a new email, enter the recipient ($USER@$HOSTNAME to send to yourself) and the subject, then compose your email, exit the editor, and press y to send. A few moments later the email should arrive. ↩︎

Have a comment on one of my posts? Start a discussion in my public inbox by sending an email to ~sircmpwn/public-inbox@lists.sr.ht [mailing list etiquette]

Articles from blogs I read Generated by openring

Status update, August 2020

Hi! Regardless of the intense heat I’ve been exposed to this last month, I’ve still been able to get some stuff done (although having to move out to another room which isn’t right under the roof). I’ve worked a lot on IRC-related projects. I’ve added a znc-i…

via emersion 2020-08-19 00:00:00 +0200 +0200

What's cooking on Sourcehut? August 2020

Another month passes and we find ourselves writing (or reading) this status update on a quiet, rainy Sunday morning. Today our userbase numbers 16,683 members strong, up 580 from last month. Please extend a kind welcome to our new colleagues! Thanks for read…

via Blogs on Sourcehut 2020-08-16 00:00:00 +0000 +0000

Go 1.15 is released

Today the Go team is very happy to announce the release of Go 1.15. You can get it from the download page. Some of the highlights include: Substantial improvements to the Go linker Improved allocation for small objects at high core coun…

via The Go Programming Language Blog 2020-08-11 11:00:00 +0000 +0000

North Pacific Logbook

The passage from Japan (Shimoda) to Canada (Victoria) took 51 days, and it was the hardest thing we've ever done. We decided to keep a logbook, to better remember it and so it can help others who wish to make this trip.Continue Reading

via Hundred Rabbits 2020-07-31 00:00:00 +0000 GMT