如何configuration后缀pipe道所有传入的电子邮件到脚本?

使用postfix,我希望所有传入的邮件到任何地址(包括那些不映射到本地用户的地址)被传送到一个脚本。 我已经尝试在/etc/postfix/main.cfconfigurationmailbox_command

 mailbox_command = /path/to/myscript.py 

如果用户是本地用户,这很有效,但对于没有别名的“未知”用户则失败。 我尝试将luser_relay设置为本地用户,但是这会luser_relay ,所以命令无法运行。 我尝试设置local_recipient_maps= (空string),但消息仍然弹回(未知的用户)。

是否有一个魔术调用我可以用来让所有已知和未知的用户也去脚本?

完整的/etc/postfix/main.cf如下 – 它是默认的Ubuntu 10.04,除了mailbox_command行:

 # See /usr/share/postfix/main.cf.dist for a commented, more complete version # Debian specific: Specifying a file name will cause the first # line of that file to be used as the name. The Debian default # is /etc/mailname. #myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h readme_directory = no # TLS parameters smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for # information on enabling SSL in the smtp client. myhostname = ... snip ... alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = sassafras, ... snip ...,localhost.localdomain, localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all mailbox_command = /path/to/my/script.py 

好吧,我刚刚得到这个工作 – 虽然比我想象的要多。 我放弃了maildir_command部分,并使用transport_maps 。 关键是做5件事情:

  1. 设置一个数据库文件来处理别名(并添加一个全部别名)
  2. 设置一个数据库文件,将相关域的'transport'映射到一个特殊的处理程序。
  3. 将db文件编译成postfix想要的berkeley db格式。
  4. /etc/postfix/master.cf设置处理程序,将邮件传递给脚本。
  5. /etc/postfix/main.cf设置为使用transport_maps的传输数据库和virtual_alias-maps的别名数据库。

(1)创build/etc/postfix/virtual_aliases来添加一个全部别名 – localuser需要是一个现有的本地用户:

 @mydomain.tld [email protected] 

(2)创build/etc/postfix/transport来添加一个传输映射。 “mytransportname”可以是任何你想要的; 它在master.cf使用如下:

 mydomain.tld mytransportname: 

(3)接下来, transportvirtual_aliases需要被编译成berkeley db文件:

 $ sudo postmap /etc/postfix/virtual_aliases $ sudo postmap /etc/postfix/transport 

(4)将传输添加到/etc/postfix/master.cf

 mytransportname unix - nn - - pipe flags=FR user=localuser argv=/path/to/my/script.py ${nexthop} ${user} 

(5)在/etc/postfix/main.cf

  ... transport_maps = hash:/etc/postfix/transport virtual_alias_maps = hash:/etc/postfix/virtual_aliases 

而且…好去! 啧。

我唯一一次使用这样的东西是针对特定用户的邮箱。 所有这一切都需要将该用户的名称别名到别名中的pipe道和进程:

pong:“| /usr/local/bin/gotit.pl”

这将发送到“[email protected]”的stream量发送到我写的处理它的perl脚本。

gotit.pl(作为一个例子,不要select我蹩脚的编程skillz =)。 它的工作是处理我发送到我们的Exchange服务器(通过一些VB代码自动回复)的电子邮件,以validationExchange是否及时处理电子邮件。 如果没有,邮件服务器会发送一个警报邮件给我们的寻呼机,并写一个locking文件,所以我们并没有经常收到垃圾邮件。

 #! /usr/bin/perl -w use vars qw ( $mung $sent $tvalue $remainder $delta $fout ); $mung = time; while (<STDIN>) { ($sent, $tvalue, $remainder ) = split /: /, $_, 3; $tvalue =~ s/(\D+)//g; chomp($tvalue); $delta = $mung-$tvalue; if ( $sent =~ "Sent" ) { $fout = "/var/spool/mailcheck/$tvalue"; next unless ( -e $fout ); open (TMP, "> $fout") or die "Couldn't open output file: $!\n"; print TMP "Received in: $delta seconds.\n"; close TMP; last; } } 

我使用了一个旧式的“平面文件” Mailbox来接收所有的邮件(然后每隔几个小时修剪一次),而不是使用现代的maildir/文件夹,通过脚本来处理邮件。 你也可以在文件上运行logrotate,我想保持它的可pipe理性。

这样,您可以简单地将所有邮件作为本地用户复制到邮箱。