Sender Rewriting Scheme in Python
This web page is written by Stuart D. Gathman
originally sponsored by
Business Management Systems, Inc.
Last updated Oct 17, 2017
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
- 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.
Use the supplied sendmail m4 hack with
install the socketmap.
- 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 Github repo for latest source.