Sender Rewriting Scheme in Python
This web page is written by Stuart D. Gathman
Business Management Systems, Inc.
Last updated Jul 31, 2006
This is a Python implementation of
the Sender Rewriting Scheme.
It is a fairly direct translation of the
draft implementation in Perl
by Shevek. It includes a test suite, which currently checks four
levels of forwarding and subsequent reversal for the Guarded, DB, and
- This package includes scripts to be used as sendmail program maps. See
for an explanation and instructions on incorporating SRS into
srs2envtol.py for the perl scripts. Even simpler, use the
supplied sendmail m4 hack with
- SRS.Daemon.Daemon() provides a simple socket daemon suitable
for use with the Exim mailer.
- RPM now includes a sendmail socketmap daemon. The program map is
no longer recommended. It is slow and a security risk. Prior to socketmaps,
it was all that was available for a custom map. Socketmap is available
in sendmail 8.13.
- For best results, use with Python milter
to reject unsigned recipients.
Add the following lines to your /etc/mail/sendmail.mc (RedHat /
Fedora) after any MAILER():
dnl # File listing domains we do not SRS encode for when sending to
dnl # Uncomment the following if you do not wish to SRS encode mail from
dnl # local domains. Only non-local domains need to be SRS encoded to
dnl # satisfy SPF. But encoding all outgoing mail can detect bounce forgeries.
If you cannot install a version of sendmail with socketmap support, then
the original program map is still available as
- NO_SRS_FILE is the path of a file containing the recipient
MTA's for which you won't do SRS (typically, primary MXes for
which you are secondary). Just leave this away, if you are
secondary for nobody. The no-srs-mailers file is a simple text
file which has one recipient MTA per line.
- The argument to pysrs is the socket where the socketmap daemon
is listening. This must match
the default of
- NO_SRS_FROM_LOCAL : if this is set (define line present), then
no SRS is done if sender is local (i.e. his domain is in
- The argument to pysrsprog is the domain that your SRS addresses bear
(i.e. if your SRS addresses are firstname.lastname@example.org,
then the argument is mydomain.com). This overrides fwdomain in
Goto Sourceforge file release.