使用postfix,我希望所有传入的邮件到任何地址(包括那些不映射到本地用户的地址)被传送到一个脚本。 我已经尝试在/etc/postfix/main.cf
configurationmailbox_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件事情:
/etc/postfix/master.cf
设置处理程序,将邮件传递给脚本。 /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)接下来, transport
和virtual_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理性。
这样,您可以简单地将所有邮件作为本地用户复制到邮箱。