使用 postfix,我希望将所有发往任何地址(包括未映射到本地用户的地址)的邮件通过管道传输到脚本。我尝试mailbox_command
在以下位置进行配置/etc/postfix/main.cf
:
mailbox_command = /path/to/myscript.py
如果用户是本地用户,此方法很有效,但对于没有别名的“未知”用户,此方法会失败。我尝试设置luser_relay
为本地用户,但这会抢占mailbox_command
,因此命令不会运行。我尝试设置local_recipient_maps=
(空字符串),但邮件仍然被退回(未知用户)。
是否存在一种神奇的调用方式,可以让所有已知和未知的用户也访问该脚本?
完整内容/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
答案1
好的,我刚刚让它工作了——尽管比我想象的要复杂得多。我放弃了这个maildir_command
部分,然后继续transport_maps
。关键是要做 5 件事:
- 设置一个 db 文件来处理别名(并添加一个 catch-all 别名)
- 设置一个数据库文件来将相关域的“传输”映射到一个特殊的处理程序。
- 将 db 文件编译为 postfix 想要的 berkeley db 格式。
- 设置处理程序
/etc/postfix/master.cf
以将邮件传送到脚本。 - 设置
/etc/postfix/main.cf
为使用传输 db fortransport_maps
,以及别名 db forvirtual_alias-maps
。
(1)创建/etc/postfix/virtual_aliases
以添加一个 catch-all 别名 -localuser
需要是现有的本地用户:
@mydomain.tld [email protected]
(2)创建/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 - n n - - 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
然后...就可以出发了!天啊。
答案2
我唯一一次使用类似的东西是针对特定用户的邮箱。所需的只是将该用户的名称别名化为管道和别名中的进程:
pong:“| /usr/local/bin/gotit.pl”
这将流量发送到“[电子邮件保护]“我编写了一个 perl 脚本来处理它。
gotit.pl(作为示例,不要因为我编程技巧差而找我的茬=)。它的工作是处理我发送到 Exchange 服务器的电子邮件(通过一些 VB 代码自动回复),以验证 Exchange 是否及时处理电子邮件。如果没有,邮件服务器将向我们的寻呼机发送警报电子邮件并写入锁定文件,这样我们就不会不断收到垃圾邮件。
#! /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;
}
}
答案3
经过很多头痛之后我整理此解决方案根据几个不同的来源,这大大减少了工作量,关键步骤是配置virtual_alias_domains
以及virtual_alias_maps
确保虚拟映射是到my-alias@localhost
而不是只是my-alias
。在我的示例中,命令别名是将电子邮件管道传输到网站 API 端点,但它也可以很容易地管道传输到其他东西。
以下是您需要采取的步骤:
- 为您的域名设置 A 和 MX 记录,A 记录 @ 指向您将在其上接收电子邮件的服务器的 IP,MX 记录的主机名是 @,值是
10 mail.your-domain-name
sudo apt-get install postfix
- 选择“互联网站点”并输入您的域名(完全合格)
sudo vi /etc/postfix/main.cf
mydestination
将 mail.your-domain-name 添加到值列表中- 附加
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual
到文件末尾
sudo apt-get vi /etc/aliases
curl_email: "|curl --data-binary @- http://your-domain-name/email"
sudo newaliases
sudo apt-get vi /etc/postfix/virtual_domains
example.net #domain
example.com #domain
your-domain-name #domain
(#domain 字段抑制警告)
sudo postmap /etc/postfix/virtual_domains
sudo apt-get vi /etc/postfix/virtual
info@your-domain-name [email protected]
everyone@your-domain-name [email protected] [email protected]
email_processor@your-domain-name curl_email@localhost
@your-domain-name [email protected]
[email protected] [email protected]
sudo postmap /etc/postfix/virtual
sudo /etc/init.d/postfix reload
答案4
我使用旧式“平面文件”Mailbox
接收所有邮件(如果邮件很大,则每隔几个小时修剪一次),而不是使用现代maildir/
文件夹,通过脚本处理邮件。我想您也可以在文件上运行 logrotate,以使其易于管理。
这样,您就可以以本地用户的身份简单地将所有邮件复制到邮箱。