I spend today reading about how to pipe a mail received by postfix into a perl script.
I read a lot but could hardly find a solution for my setup. So I give one here.
An application must be able to process email coming in from the net and it must be also able
to respond to these emails.
- The machine is configured to send all emails over an MTA somewhere in the network
- The MTA hosts a virtual mail domain for which it forwards all its email to the machine
- The machine holds an application written in PERL
- A PERL script īs used as delivery agent to process some mails
- The tested platform: Linux Ubuntu 12.04 LTS, postfix 2.9.6
The postfix main.cf configuration created by dpkg-reconfigure postfix
myhostname = [host name]
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = [list for local delivery]
relayhost = [the MTA name for sending emails]
mynetworks = [see posfix documentation]
mailbox_size_limit = [you would rather set it!]
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
mail_spool_directory = /var/mail
As usual TIMTOWTDI but a simple alias will NOT work! My solution works without:
- A cryptic central definition of a local delivery agent in master.cf
- Having pcre compiled in postfix. I have no use for this.
- Creating OS users or virtual users on the system.
- No other ugly things I read.
Now you have to:
- Modify your main.cf to redirect the mail.
- Create a redirect map for postfix
- Create an alias which will fool postfix and deliver the mail to the script
Modifications to the main.cf configuration
To avoid creating whatsoever users, we will use a kind of redirect. So
we add a line like the following to the main.cf file:
virtual_alias_maps = hash:/etc/postfix/redirect
Notice the hash: prefix to the file. This works well and avoid to re-compile
postfix with pcre, in case it is not included.
Creation of the redirect map
Create the file defined above and enter a line with a regexp and a name in it:
/[name]@[machine domain]/ [alias name]
Notice you have to use a regexp as first argument on this line!
The alias name does not matter. Only secure name@domain is the correct email address.
Creation of the alias
Now we create the alias which will pipe the email into our script. Add a line like the
following to the /etc/aliases file:
[alias name]: "|/usr/bin/perl /[path to]/thescript.pl"
Notice you have to secure both alias name match!
Activate the whole thing
To activate all this you have to
- Create your redirect map with postmap [path to ]/redirect
- Activate your new aliases with newaliases
- Load the new posfix configuration with posfix reload
This is what you will get in the STDIN of your script
From [who ever]@[whatever].com Mon Apr 22 17:48:08 2013
Return-Path: <[who ever]@[whatever].com >
X-Original-To: [name]@[machine domain]
Delivered-To: [name]@[machine domain]
Received: by [No matter to you]
To: <[name]@[machine domain]>
Subject: [What so ever]
X-Mailer: mail (GNU Mailutils 2.2)
Date: Mon, 22 Apr 2013 17:48:08 +0200 (CEST)
From: [who ever]@[whatever].com
Notice: If you intent to open(OUT ">", $filename); in your PERL script it will fail with a missing privilege error. To avoid this you have to set default_privs = to an other user than nobody in the postfix main.cf. This has impact on the whole postfix setting. I did not analyse it until now. So if you do this, you do it at your own risk.
The best medicine against depression is a cold beer!
Are you posting in the right place? Check out Where do I post X? to know for sure.
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
Want more info? How to link or
or How to display code and escape characters
are good places to start.