如何配置 postfix 以将所有传入的电子邮件传送到脚本?

如何配置 postfix 以将所有传入的电子邮件传送到脚本?

使用 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 件事:

  1. 设置一个 db 文件来处理别名(并添加一个 catch-all 别名)
  2. 设置一个数据库文件来将相关域的“传输”映射到一个特殊的处理程序。
  3. 将 db 文件编译为 postfix 想要的 berkeley db 格式。
  4. 设置处理程序/etc/postfix/master.cf以将邮件传送到脚本。
  5. 设置/etc/postfix/main.cf为使用传输 db for transport_maps,以及别名 db for virtual_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)接下来需要将transportvirtual_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,以使其易于管理。

这样,您就可以以本地用户的身份简单地将所有邮件复制到邮箱。

相关内容