すべての受信メールをスクリプトにパイプするようにpostfixを構成する方法は?


24

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つを構成し、スクリプトでその構成を使用するためのガイドを見つけることができますか?
DerfK

メッセージはWebアプリケーションに送られます。スクリプトの後:データベース、その他の処理、その他のもの、ただし通常のメールのものではありません。重要な質問は、不明なユーザーがバウンスしないようにすることです。これは、マップされていないユーザーをバウンスする通常のウイルス/スパムシナリオの範囲外です。
user67641

@ user67641こんにちは私は私のスクリプト内のpostfixに、またはmaster.cfでいくつかのより多くの行を追加することで、メールを注入する必要があります
merveotesi

回答:


32

わかりました、私はこれが機能するようになりました-思ったよりも毛深いです。私はmaildir_command部品を落とし、一緒に行きましたtransport_maps。キーは5つのことをすることです:

  1. エイリアスを処理するためにdbファイルを設定します(キャッチオールエイリアスを追加します)
  2. 問題のドメインの「トランスポート」を特別なハンドラーにマップするdbファイルをセットアップします。
  3. dbファイルをpostfixが必要とするberkeley db形式にコンパイルします。
  4. ハンドラーをセットアップして、/etc/postfix/master.cfメールをスクリプトにパイプします。
  5. /etc/postfix/main.cfトランスポートデータベースを使用しtransport_maps、にエイリアスデータベースを使用するように設定しますvirtual_alias-maps

(1)/etc/postfix/virtual_aliasesキャッチオールエイリアスを追加するために作成- localuser既存のローカルユーザーである必要があります。

@mydomain.tld   localuser@mydomain.tld

(2)/etc/postfix/transportトランスポートマッピングを追加するために作成します。「mytransportname」には任意の名前を指定できます。以下で使用されていますmaster.cf

mydomain.tld    mytransportname:

(3)次に、両方transport、およびvirtual_aliasesberkeley 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

そして...行ってよかった!シーシュ。


1
非常に有用な答え
-merveotesi

1
仮想エイリアスマップは必要ありません。同じことを実現できますrelay_domains(この場合、トランスポートファイルは実際のTo:アドレスに基づいてフィルタリングできます)。
ブリリアンド

virtual_transport = mailcaptcha:in main.cfmailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient}in を使用して、すべての仮想メールをスクリプトにルーティングできることがわかりましたmaster.cfpostfix.org/transport.5.htmlおよびpostfix.org/VIRTUAL_README.htmlを参照してください。
クロエ

(4)は1行である必要があります、そうですか?また、postfix restartまたはreloadこのような何かを必要としませんか?最後に、postfixに到着したメールを確認するログファイルはありますか?
バスジ

@Basj、ログファイルは/var/log/mail.logです。
フィードル

4

このようなものを使用したのは、特定のユーザーのメールボックスのみでした。必要なことは、そのユーザーの名前をパイプとエイリアスのプロセスにエイリアスすることだけでした。

pong: "| /usr/local/bin/gotit.pl"

これにより、「pong@mymailserver.com」宛のトラフィックが、処理するために作成したperlスクリプトに送信されました。

gotit.pl(例として、くだらないプログラミングskillz =を選択しないでください)。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;
    }
}

ええ、@ mydomain.tldをpongにリダイレクトするだけで、mydomain.tldのすべての着信メインがパイプされます。
ザールハイ

そして、複数の仮想ドメインを使用している私たちにとっては、デフォルトのドメイン名をエイリアスに添付しないように、pong @ localhostにリダイレクトすることを忘れないでください
therightstuff

0

スクリプトを介してメールを処理するためにMailbox、現代のmaildir/フォルダーを使用する代わりに、古いスタイルの「フラットファイル」を使用してすべてのメールを受信します(そして、大きい場合は数時間ごとに整理します)。ファイルに対してlogrotateを実行することもできますが、これは管理しやすい状態に保つためです。

これにより、すべてのメールをローカルユーザーとしてメールボックスにコピーすることができます。


0

多くの頭痛の種の後、私はこのソリューションをいくつかの異なるソースに基づいてまとめました。その結果、労力ははるかに少なくなり、重要な手順はvirtual_alias_domains同様に設定virtual_alias_mapsし、仮想マッピングがのmy-alias@localhost代わりになりましたmy-alias。私の例では、コマンドエイリアスはメールをWebサイト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 bob@gmail.com
everyone@your-domain-name bob@gmail.com jim@gmail.com
email_processor@your-domain-name curl_email@localhost
@your-domain-name catchall@whereveryouwant.com
ted@example.net jane@outlook.com
  • sudo postmap /etc/postfix/virtual
  • sudo /etc/init.d/postfix reload
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.