The Moxy Mail Proxy
Moxy is a mail proxy that acts as a mail server for multiple
domains. Mail received for each domain is transparently proxied
to different hosts and/or ports.
- User mail servers can transparently receive mail on non
standard ports (ie ports other than 25)
- Users who's MX record points to the Moxy host retain complete
control over their mail server configuration and may
continue to use the MTA of their choosing (Sendmail, Postfix,
- The Moxy host can easily log mail bandwidth usage on a
per destination or per email address basis. Using
Moxy allows you to keep track of bandwidth used in a manner
that is independent of MTA and without having to parse eccentric
log files. Moxy includes tools like moxystats
and moxylogalyze that give you a real time
and complete view of mail bandwidth usage.
- A mail server can change IP instantly, without
needing to update the DNS MX record.
- Mail for a given domain can be directed to multiple
- Users get anonymity: The location of destination
mail servers remain unknown to senders, all they see is
the host running Moxy.
- Moxy can be run on an existing mail server and proxy connections
for other domains without disrupting the current setup.
For many, there's a problem with the way email is routed
through the internet. If you are to receive mail, you are
expected to a have a mail server listening at a single (usually
static) IP, on port 25. This will (one day) be fixed by the
use of DNS SERV records but in the meantime Moxy solves the
problem and a few others.
Moxy has been released by Pat Deegan
under the terms and conditions of the GNU
The requirements for running Moxy are minimal, basically
all you need is a box with a Unix type TCP/IP stack (sockets
and all that) and GDBM support.
To be really usefull, Moxy needs to be run on a machine that
can receive connections on the standard mail port (25).
Finally, you need a few friends or clients with domains to
proxy mail for. Just set their MX record (in the DNS) to point
to the IP of the server you're running Moxy on and configure
Moxy to proxy mail for these domains.
How it works
Mail to Moxy host (MX for domains) is transparently proxied
to other hosts/ports:
In the example above, the Moxy host acts as the MX record
for the Bigorg, DynIP and Wall domains. When mail arrives,
Moxy looks up the destination and determines the hosts and
ports to proxy the mail to. Moxy then opens a connection to
the destination(s), identifies the sender, requests to deliver
mail to the recipient(s) and sends the destinations' response
back to the sender. Mail data is then proxied from sender
to destination. Control over the validity of email addresses
etc remains in the hands of Bigorg, DynIP and Wall exclusively.
In the example, mail to users @Bigorg is sent to 2 different
hosts. Any number of host/port combinations may be assigned
as the destination for a given domain. Mail to users @Wall
is proxied to the Mail3500 machine on port 3500 thereby traversing
the firewall (with the sysadmin's approval of course).
The developer section contains
the juicy details but here is a brief summary. Moxy runs as
a daemon listening for connections, usually on port 25 (configurable).
The daemon forks a process for incomming connections, which
handles the entire transaction with the sender.
Domain to host:port translations are accomplished using a
child of the DomainDB class (a specific instance class derived
from the DomainDB). This allows all sorts of databases to
be used, for now lookups are implemented for flat file or
gdbm DBs but it should be a simple matter to implement the
lookups from a relational DB (MySQL, PostgreSQL), an LDAP
directory or pretty much anything else.
Moxy minimizes the number of connections required to transmit
mail. If an MTA connects and declares its desire to send mail
to firstname.lastname@example.org and email@example.com and if both these
domains resolve to the same destination, the connection will
be 'reused' and the message only sent once.
A similar scheme is used for logging as for domain lookups.
Log objects derived from the Log class currently implemented
include instances for logging to a text file, logging through
syslog and logging to a gdbm db. Again, it should be a simple
affair to create a new subclass to implement logging elsewhere
(to a MySQL table, for instance).
Please see the developer section
for more info and pretty pictures.
Using Moxy involves little more than editing the config file
and launching the program. For details, please see the page