The following code allows e-mail to be sent to realtouser+rewriteuser+rewritedomain@smtp-rewrite.realdomain, and it will change the from address to rewritefrom@rewritedomain and send the mail to realtouser@realdomain
If requires the follwing postfix config in /etc/postfix/master.cf:
filter unix - n n - 10 pipe flags=Rq user=nobody null_sender= argv=/path/to/script -f ${sender} -- ${recipient}
smtp inet ...other stuff here, do not change... smtpd -o content_filter=filter:dummy
And the following in /etc/postfix/main.cf:
relay_domains = smtp-rewrite.realdomain relay_recipient_maps = hash:/etc/postfix/smtp-rewrite-recipient-map
And the following in /etc/postfix/smtp-rewrite-recipient-map
@smtp-rewrite.realdomain OK
And then run:
postmap /etc/postfix/smtp-rewrite-recipient-map
You will also need to add a DNS record for smtp-rewrite.realdomain pointing to the IP address of the mail server (either MX or A record)
Script below:
#!/usr/bin/perl
use strict;
my @sendmailargs=("/usr/sbin/sendmail","-G","-i");
my $frompos=-1;
my $lastarg=-1;
my $endargs=0;
my $origtoaddress="";
my $toaddress="";
my $origfromaddress="";
my $fromaddress="";
foreach my $arg(@ARGV) {
if($arg eq "-f") {
# Record the position of the from address
$frompos=scalar(@sendmailargs)+1;
} elsif ($arg eq "--") {
# -- signals the end of arguments, everything else is an e-mail address
$endargs=1;
$lastarg=scalar(@sendmailargs)+1;
} elsif (!$endargs) {
# If we have not hit a definite end of the args set lastarg
# variable based on whetehr this is an argument or not
if ($arg =~ /^-/) {
$lastarg=-1;
} else {
$lastarg=scalar(@sendmailargs);
}
}
push @sendmailargs,$arg;
}
if($lastarg > 0 && $frompos > 0) {
for(my $i=$lastarg; $i) {
if($headers) {
if($_ =~ /^$/g) {
$headers=0;
} elsif ($fromaddress && $_ =~ /^(From|Sender:Reply-To): /) {
$_ =~ s/()\S+\@\S+(>?)/$1$fromaddress$2/g;
} elsif ($fromaddress && $_ =~ /^(To|CC): /) {
$_ =~ s/$origtoaddress/$toaddress/g;
}
}
print FD $_;
}
close(FD);
exit($?);