Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Where can I tell exim to run a shell/php command everytime a new mail has been delivered to a virtual mailbox. It does not matter to which user the mail is delivered?

share|improve this question
up vote 1 down vote accepted

You want to look at shadow_transport.

For local deliveries (only), if delivery succeeds and the Transport references another Transport in its shadow_transport option, then that second transport will also be invoked.

You'd then have that second Transport be a driver = pipe transport.


  driver = appendfile
  directory = ...blah blah whatever ...
  # various other maildir extension options if needed
  shadow_transport = audit_delivery

  driver = pipe
  command = /some/path/to/some/command with some options
  user = audituser
  group = mail
share|improve this answer

Given that you apparently have a real user to deliver to, you probably want to look into using a .forward file, or possibly procmail if you want to get a bit fancier (such as if you only want to run the command for a subset of messages delivered to the user).

share|improve this answer
Unfortunately I am having a multi user/domain system via exim4/mysql/courier-imap I meant with local user, that this user is terminated in my system. But it should be called disjunct from the user recieving the mail. – user28047 Dec 28 '09 at 19:51
"local user" has very specific meaning with MTAs, you might want to edit your question to say "virtual mailbox" if you're running that sort of system. – womble Dec 28 '09 at 22:52
thx, I have corrected the question. – user28047 Dec 30 '09 at 12:29

The easyest way I found was creating a new router afterwards delivering to the local users containing:

        driver = accept
        transport = run_script

So, the mail is still handeld the way it should be and my script is running, with the right transport f.e.:

        debug_print = "T: run_script for $local_part@$domain"
        driver = pipe
        path = "<path>"
        command = "<command to be run>"
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.