1
0
Fork 0
modern full-featured open source secure mail server for low-maintenance self-hosted email
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
Go to file
Mechiel Lukkien 0187fa0394
tweak time format for added date headers
seconds are useful, leading zeros for "day" not so much
5 days ago
.github/workflows add github workflow to build & test, exporting a coverage file 3 weeks ago
.go mox! 4 months ago
autotls also configure acme validation with http-01, and fix a bug that caused tls cert refresh at startup to not always run 3 months ago
config open tls keys/certificate as root, pass fd's to the unprivileged child process 1 week ago
dkim add pedantic mode (used by localserve) that refuses some behaviour that is invalid according to specifications and that we normally accept for compatibility 3 months ago
dmarc fix typo's 4 months ago
dmarcdb add a "backup" subcommand to make consistent backups, and a "verifydata" subcommand to verify a backup before restoring, and add tests for future upgrades 2 weeks ago
dmarcrpt mox! 4 months ago
dns fix sending to address where the domain does not have an mx record (but where we should connect directly to the host, or follow cname records) 2 months ago
dnsbl mox! 4 months ago
dsn add pedantic mode (used by localserve) that refuses some behaviour that is invalid according to specifications and that we normally accept for compatibility 3 months ago
http add missing check for err variable in test 1 week ago
imapclient typo's 3 months ago
imapserver fix delivery from/to smtp addresses with double quotes 6 days ago
iprev mox! 4 months ago
junk add a "backup" subcommand to make consistent backups, and a "verifydata" subcommand to verify a backup before restoring, and add tests for future upgrades 2 weeks ago
message tweak time format for added date headers 5 days ago
metrics make account web page configurable separately from admin, add http auth rate limiting 4 months ago
mlog add a "backup" subcommand to make consistent backups, and a "verifydata" subcommand to verify a backup before restoring, and add tests for future upgrades 2 weeks ago
mox- open tls keys/certificate as root, pass fd's to the unprivileged child process 1 week ago
moxio change mox to start as root, bind to network sockets, then drop to regular unprivileged mox user 3 months ago
moxvar add pedantic mode (used by localserve) that refuses some behaviour that is invalid according to specifications and that we normally accept for compatibility 3 months ago
mtasts more helpful error message when the queue tries to deliver a message but the remote host is not listed in the mta-sts policy 1 week ago
mtastsdb more logging around smtp and mtasts tls connections 5 days ago
publicsuffix mox! 4 months ago
queue more helpful error message when the queue tries to deliver a message but the remote host is not listed in the mta-sts policy 1 week ago
ratelimit fix language in comments 3 weeks ago
rfc add reverse proxying websocket connections 1 week ago
scram add support for SCRAM-SHA-1 4 months ago
smtp add pedantic mode (used by localserve) that refuses some behaviour that is invalid according to specifications and that we normally accept for compatibility 3 months ago
smtpclient more logging around smtp and mtasts tls connections 5 days ago
smtpserver fix bug with dkim signing messages without Date or Message-Id header 5 days ago
spf fix problem with spf where we would generate errors about too many void lookups 3 months ago
store we now have an index on dkimdomains, remove the todo 2 weeks ago
subjectpass mox! 4 months ago
testdata regenerate keys/certs for integration tests with expiration far in the future 5 days ago
tlsrpt work around missing timezone in timestamps in tls reports from microsoft 4 months ago
tlsrptdb add a "backup" subcommand to make consistent backups, and a "verifydata" subcommand to verify a backup before restoring, and add tests for future upgrades 2 weeks ago
updates on admin page, show warning when user hasn't enabled "check updates" 3 months ago
vendor add reverse proxying websocket connections 1 week ago
.dockerignore mox! 4 months ago
.gitignore add automated test for quickstart 5 days ago
.jshintrc improve webserver, add domain redirects (aliases), add tests and admin page ui to manage the config 3 months ago
Dockerfile add timezone db files to docker images 3 months ago
Dockerfile.imaptest help run mox with docker 4 months ago
Dockerfile.moximaptest help run mox with docker 4 months ago
Dockerfile.release fix cross-compiled docker images 3 months ago
LICENSE.MIT mox! 4 months ago
LICENSE.MPLv2.0 mox! 4 months ago
Makefile add automated test for quickstart 5 days ago
README.md move "how do i upgrade"-question to just below "how do i stay up to date" question 1 week ago
backup.go tweaks to backup & verifydata tool to make a typical backup+verifydata produce no output 1 week ago
checkhtmljs mox! 4 months ago
compatibility.txt add notes on tests with microsoft outlook. 4 months ago
ctl.go add a "backup" subcommand to make consistent backups, and a "verifydata" subcommand to verify a backup before restoring, and add tests for future upgrades 2 weeks ago
develop.txt add automated test for quickstart 5 days ago
doc.go tweaks to backup & verifydata tool to make a typical backup+verifydata produce no output 1 week ago
docker-compose-imaptest.yml change mox to start as root, bind to network sockets, then drop to regular unprivileged mox user 3 months ago
docker-compose-integration.yml change mox to start as root, bind to network sockets, then drop to regular unprivileged mox user 3 months ago
docker-compose-quickstart.yml add automated test for quickstart 5 days ago
docker-compose.yml add automated test for quickstart 5 days ago
docker-release.sh replace use of docker registry docker.io (hub.docker.com) with self-hosted r.xmox.nl 3 months ago
export.go add a "backup" subcommand to make consistent backups, and a "verifydata" subcommand to verify a backup before restoring, and add tests for future upgrades 2 weeks ago
gendoc.sh add "mox localserve" subcommand, for running mox locally for email-related testing/developing 3 months ago
gentestdata.go add a "backup" subcommand to make consistent backups, and a "verifydata" subcommand to verify a backup before restoring, and add tests for future upgrades 2 weeks ago
go.mod update to latest bstore (with support for an index on a []string: Message.DKIMDomains), and cyclic data types (to be used for Message.Part soon); also adds a context.Context to database operations. 3 weeks ago
go.sum update to latest bstore (with support for an index on a []string: Message.DKIMDomains), and cyclic data types (to be used for Message.Part soon); also adds a context.Context to database operations. 3 weeks ago
import.go update to latest bstore (with support for an index on a []string: Message.DKIMDomains), and cyclic data types (to be used for Message.Part soon); also adds a context.Context to database operations. 3 weeks ago
integration_test.go add a "backup" subcommand to make consistent backups, and a "verifydata" subcommand to verify a backup before restoring, and add tests for future upgrades 2 weeks ago
junk.go update to latest bstore (with support for an index on a []string: Message.DKIMDomains), and cyclic data types (to be used for Message.Part soon); also adds a context.Context to database operations. 3 weeks ago
localserve.go open tls keys/certificate as root, pass fd's to the unprivileged child process 1 week ago
main.go tweaks to backup & verifydata tool to make a typical backup+verifydata produce no output 1 week ago
mox.service more permissions in mox.service to ease with upgrade to v0.0.2 3 months ago
prometheus.rules tweak alerting rule to include that it is about authentication rate limiting 1 month ago
quickstart.go mention where the admin interface can be accessed 3 months ago
quickstart_test.go add automated test for quickstart 5 days ago
sendmail.go document that mox sendmail -t does not treat cc and bcc headers specially 3 months ago
serve.go open tls keys/certificate as root, pass fd's to the unprivileged child process 1 week ago
test-upgrade.sh add a "backup" subcommand to make consistent backups, and a "verifydata" subcommand to verify a backup before restoring, and add tests for future upgrades 2 weeks ago
tools.go mox! 4 months ago
updates.go remove debug print 2 months ago
updating.txt clear updating.txt for release 2 months ago
verifydata.go tweaks to backup & verifydata tool to make a typical backup+verifydata produce no output 1 week ago

README.md

Mox is a modern full-featured open source secure mail server for low-maintenance self-hosted email.

See Quickstart below to get started.

Features

  • Quick and easy to start/maintain mail server, for your own domain(s).
  • SMTP (with extensions) for receiving and submitting email.
  • IMAP4 (with extensions) for giving email clients access to email.
  • Automatic TLS with ACME, for use with Let's Encrypt and other CA's.
  • SPF, verifying that a remote host is allowed to sent email for a domain.
  • DKIM, verifying that a message is signed by the claimed sender domain, and for signing emails sent by mox for others to verify.
  • DMARC, for enforcing SPF/DKIM policies set by domains. Incoming DMARC aggregate reports are analyzed.
  • Reputation tracking, learning (per user) host- and domain-based reputation from (Non-)Junk email.
  • Bayesian spam filtering that learns (per user) from (Non-)Junk email.
  • Slowing down senders with no/low reputation or questionable email content (similar to greylisting). Rejected emails are stored in a mailbox called Rejects for a short period, helping with misclassified legitimate synchronous signup/login/transactional emails.
  • Internationalized email, with unicode names in domains and usernames ("localparts").
  • TLSRPT, parsing reports about TLS usage and issues.
  • MTA-STS, for ensuring TLS is used whenever it is required. Both serving of policies, and tracking and applying policies of remote servers.
  • Web admin interface that helps you set up your domains and accounts (instructions to create DNS records, configure SPF/DKIM/DMARC/TLSRPT/MTA-STS), for status information, managing accounts/domains, and modifying the configuration file.
  • Autodiscovery (with SRV records, Microsoft-style and Thunderbird-style) for easy account setup (though not many clients support it).
  • Webserver with serving static files and forwarding requests (reverse proxy), so port 443 can also be used to serve websites.
  • Prometheus metrics and structured logging for operational insight.
  • "localserve" subcommand for running mox locally for email-related testing/developing, including pedantic mode.

Mox is available under the MIT-license and was created by Mechiel Lukkien, mechiel@ueber.net. Mox includes the Public Suffix List by Mozilla, under Mozilla Public License, v2.0.

Download

You can easily (cross) compile mox if you have a recent Go toolchain installed (see "go version", it must be >= 1.19; otherwise, see https://go.dev/dl/ or https://go.dev/doc/manage-install and $HOME/go/bin):

GOBIN=$PWD CGO_ENABLED=0 go install github.com/mjl-/mox@latest

Or you can download a binary built with the latest Go toolchain from https://beta.gobuilds.org/github.com/mjl-/mox, and symlink or rename it to "mox".

Verify you have a working mox binary:

./mox version

Note: Mox only compiles for/works on unix systems, not on Plan 9 or Windows.

You can also run mox with docker image r.xmox.nl/mox, with tags like v0.0.1 and v0.0.1-go1.20.1-alpine3.17.2, see https://r.xmox.nl/repo/mox/. See docker-compose.yml in this repository for instructions on starting. You must run docker with host networking, because mox needs to find your actual public IP's and get the remote IPs for incoming connections, not a local/internal NAT IP.

Quickstart

The easiest way to get started with serving email for your domain is to get a vm/machine dedicated to serving email, name it [host].[domain] (e.g. mail.example.com), login as root, and run:

# Create mox user and homedir (or pick another name or homedir):
useradd -m -d /home/mox mox

cd /home/mox
... compile or download mox to this directory, see above ...

# Generate config files for your address/domain:
./mox quickstart you@example.com

The quickstart creates an account, generates a password and configuration files, prints the DNS records you need to manually create and prints commands to start mox and optionally install mox as a service.

A dedicated machine is highly recommended because modern email requires HTTPS, and mox currently needs it for automatic TLS. You could combine mox with an existing webserver, but it requires more configuration. If you want to serve websites on the same machine, consider using the webserver built into mox. If you want to run an existing webserver on port 443/80, see "mox help quickstart", it'll tell you to run "./mox quickstart -existing-webserver you@example.com".

After starting, you can access the admin web interface on internal IPs.

Future/development

Mox has automated tests, including for interoperability with Postfix for SMTP. Mox is manually tested with email clients: Mozilla Thunderbird, mutt, iOS Mail, macOS Mail, Android Mail, Microsoft Outlook. Mox is also manually tested to interoperate with popular cloud providers: gmail.com, outlook.com, yahoo.com, proton.me.

The code is heavily cross-referenced with the RFCs for readability/maintainability.

Roadmap

  • Privilege separation, isolating parts of the application to more restricted sandbox (e.g. new unauthenticated connections).
  • DANE and DNSSEC.
  • Sending DMARC and TLS reports (currently only receiving).
  • OAUTH2 support, for single sign on.
  • Add special IMAP mailbox ("Queue?") that contains queued but not-yet-delivered messages.
  • Sieve for filtering (for now see Rulesets in the account config)
  • Calendaring
  • IMAP CONDSTORE and QRESYNC extensions
  • IMAP THREAD extension
  • Using mox as backup MX.
  • Old-style internationalization in messages.
  • JMAP
  • Webmail

There are many smaller improvements to make as well, search for "todo" in the code.

Not supported

But perhaps in the future...

  • HTTP-based API for sending messages and receiving delivery feedback
  • Functioning as SMTP relay
  • Forwarding (to an external address)
  • Autoresponders
  • POP3
  • Delivery to (unix) OS system users
  • Mailing list manager
  • Support for pluggable delivery mechanisms
  • iOS Mail push notifications (with XAPPLEPUSHSERVICE undocumened imap extension and hard to get APNS certificate)

FAQ - Frequently Asked Questions

Why a new mail server implementation?

Mox aims to make "running a mail server" easy and nearly effortless. Excellent quality mail server software exists, but getting a working setup typically requires you configure half a dozen services (SMTP, IMAP, SPF/DKIM/DMARC, spam filtering). That seems to lead to people no longer running their own mail servers, instead switching to one of the few centralized email providers. Email with SMTP is a long-time decentralized messaging protocol. To keep it decentralized, people need to run their own mail server. Mox aims to make that easy.

Where is the documentation?

See all commands and help text at https://pkg.go.dev/github.com/mjl-/mox/, and example config files at https://pkg.go.dev/github.com/mjl-/mox/config/.

You can get the same information by running "mox" without arguments to list its subcommands and usage, and "mox help [subcommand]" for more details.

The example config files are printed by "mox config describe-static" and "mox config describe-dynamic".

Mox is still in early stages, and documentation is still limited. Please create an issue describing what is unclear or confusing, and we'll try to improve the documentation.

How do I import/export email?

Use the import functionality on the accounts web page to import a zip/tgz with maildirs/mbox files, or use the "mox import maildir" or "mox import mbox" subcommands. You could also use your IMAP email client, add your mox account, and copy or move messages from one account to the other.

Similarly, see the export functionality on the accounts web page and the "mox export maildir" and "mox export mbox" subcommands to export email.

How can I help?

Mox needs users and testing in real-life setups! So just give it a try, send and receive emails through it with your favourite email clients, and file an issue if you encounter a problem or would like to see a feature/functionality implemented.

Instead of switching email for your domain over to mox, you could simply configure mox for a subdomain, e.g. [you]@moxtest.[yourdomain].

If you have experience with how the email protocols are used in the wild, e.g. compatibility issues, limitations, anti-spam measures, specification violations, that would be interesting to hear about.

Pull requests for bug fixes and new code are welcome too. If the changes are large, it helps to start a discussion (create a ticket) before doing all the work.

By contributing (e.g. code), you agree your contributions are licensed under the MIT license (like mox), and have the rights to do so.

Where can I discuss mox?

Join #mox on irc.oftc.net, or #mox on the "Gopher slack".

For bug reports, please file an issue at https://github.com/mjl-/mox/issues/new.

How do I change my password?

Regular users (doing IMAP/SMTP with authentication) can change their password at the account page, e.g. http://localhost/. Or you can set a password with "mox setaccountpassword".

The admin can change the password of any account through the admin page, at http://localhost/admin/ by default (leave username empty when logging in).

The account and admin pages are served on localhost on your mail server. To access these from your browser, run ssh -L 8080:localhost:80 you@yourmachine locally and open http://localhost:8080/[...].

The admin password can be changed with "mox setadminpassword".

How do I configure a second mox instance as a backup MX?

Unfortunately, mox does not yet provide an option for that. Mox does spam filtering based on reputation of received messages. It will take a good amount of work to share that information with a backup MX. Without that information, spammers could use a backup MX to get their spam accepted. Until mox has a proper solution, you can simply run a single SMTP server.

How do I stay up to date?

Please set "CheckUpdates: true" in mox.conf. Mox will check for a new version through a DNS TXT request for _updates.xmox.nl once per 24h. Only if a new version is published will the changelog be fetched and delivered to the postmaster mailbox.

The changelog, including latest update instructions, is at https://updates.xmox.nl/changelog.

You can also monitor newly added releases on this repository with the github "watch" feature, or use the github RSS feed for tags (https://github.com/mjl-/mox/tags.atom) or releases (https://github.com/mjl-/mox/releases.atom), or monitor the docker images.

Keep in mind you have a responsibility to keep the internect-connected software you run up to date and secure.

How do I upgrade my mox installation?

We try to make upgrades effortless and you can typically just put a new binary in place and restart. If manual actions are required, the release notes mention them. Check the release notes of all version between your current installation and the release you're upgrading to.

Before upgrading, make a backup of the data directory with mox backup <destdir>. This writes consistent snapshots of the database files, and duplicates message files from the queue and accounts. Using the new mox binary, run mox verifydata <backupdir> (do NOT use the "live" data directory!) for a dry run. If this fails, an upgrade will probably fail too. Important: verifydata with the new mox binary can modify the database files (due to automatic schema upgrades). So make a fresh backup again before the actual upgrade. See the help output of the "backup" and "verifydata" commands for more details.

During backup, message files are hardlinked if possible. Using a destination directory like data/tmp/backup increases the odds hardlinking succeeds: the default systemd service file specifically mounts the data directory, causing attempts to outside it to fail with an error about cross-device linking.

If an upgrade fails and you have to restore (parts) of the data directory, you should run mox verifydata <datadir> (with the original binary) on the restored directory before starting mox again. If problematic files are found, for example queue or account message files that are not in the database, run mox verifydata -fix <datadir> to move away those files. After a restore, you may also want to run mox bumpuidvalidity <account> for each account for which messages in a mailbox changed, to force IMAP clients to synchronize mailbox state.

How secure is mox?

Security is high on the priority list for mox. Mox is young, so don't expect no bugs at all. Mox does have automated tests for some security aspects, e.g. for login, and uses fuzzing. Mox is written in Go, so some classes of bugs such as buffer mishandling do not typically result in privilege escalation. Of course logic bugs will still exist. If you find any security issues, please email them to mechiel@ueber.net.

I'm now running an email server, but how does email work?

Congrats and welcome to the club! Running an email server on the internet comes with some responsibilities so you should understand how it works. See https://explained-from-first-principles.com/email/ for a thorough explanation.

What are the minimum requirements to run mox?

Mox does not need much. Nowadays most machines are larger than mox needs. You can start with a machine with 512MB RAM, any CPU will do. For storage you should account for the size of the email messages (no compression currently), an additional 15% overhead for the meta data, and add some more headroom. Expand as necessary.

Can I see some screenshots?

Yes, see https://www.xmox.nl/screenshots/.

Mox has an "account" web interface where users can view their account and manage their address configuration, such as rules for automatically delivering certain incoming messages to a specific mailbox.

Mox also has an "admin" web interface where the mox instance administrator can make changes, e.g. add/remove/modify domains/accounts/addresses.

Mox does not have a webmail yet, so there are no screenshots of actual email.