web-dev-qa-db-ja.com

procmailを使用してstdoutと2番目のサーバーに配信します

Postfixサーバーが各メッセージを特定のトランスポートに配信し、2番目のサーバーに中継することを望みます。 master.cfには、次のトランスポートがあります。

zarafa unix - n n - 10 pipe
  flags= user=vmail argv=/usr/bin/zarafa-dagent ${user}

Postfixを2つのトランスポートに配信できないため、おそらく必要なのは、おそらくprocmailを使用して、zarafa-dagentに配信し、2番目のサーバーにリレーするラッパートランスポートです(forwardアドレスへ; リレー 2番目のサーバーへ)。

Sendmailなどを呼び出すスクリプトにすることもできますが、現時点では、続行する方法がわかりません。

bcc_mapsのようなものは機能しません。これは、正しいX-Original-ToヘッダーとDelivered-Toヘッダーが生成されないためです。中継先のサーバー上の元のサーバーと同じ受信者に送信する必要があります。

編集:多分私は何かを明確にする必要があります:バックアップマシンでは、プライマリと同じメールボックスを持つことはできません。箱は1つだけです。すべてのメールボックスがあれば、そのサーバーへのBCCで問題ありません。ただし、プライマリでは、電子メールはカスタムzarafaトランスポートを使用して配信されるため、セカンダリにメールボックスが何であるかを知らせる方法はありません。したがって、私はそのサーバーに中継したかったのですが、そのサーバーは、問題のドメインに対してローカルであると見なします。そうすれば、Delivered-Toヘッダーは、元のRCTPが何であるかを教えてくれます。

1
Halfgaar

助けを借りて このページ 、私はもうすぐそこにいると思いますが、まだです。 bashから2番目のサーバーに中継する方法がまだわかりません。

Master.cfでトランスポートを作成しました:

filtertest    unix  -       n       n       -       10      pipe
    flags=Rq user=filter null_sender=
    argv=/usr/local/bin/filter-test.sh -f ${sender} -- ${recipient}

私はcontent_filterオプションをsmtpトランスポートに含めました(それが機能するときにsmtpsにも追加します):

smtp      inet  n       -       -       -       -       smtpd
    -o content_filter=filtertest:dummy

Filtertestスクリプトがあります:

#!/bin/bash

# Simple Shell-based filter. It is meant to be invoked as follows:
#       /path/to/script -f sender recipients...

# Localize these. The -G option does nothing before Postfix 2.3.
INSPECT_DIR=/var/spool/filter
SENDMAIL="/usr/sbin/sendmail -G -i" # NEVER NEVER NEVER use "-t" here.

# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69

# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15

# Start processing.
cd $INSPECT_DIR || {
    echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }

cat >in.$$ || {
    echo Cannot save mail to file; exit $EX_TEMPFAIL; }

# Relay message to backup server
#TODO: how?

$SENDMAIL "$@" <in.$$

exit $?

残っているのは、このbashスクリプトrelay(転送しない)をtmpファイルの内容を2番目のサーバーに作成するにはどうすればよいですか?

1
Halfgaar

私は似たようなことをする必要がありました、そしてあなたの質問については、接尾辞は一度に複数の配信を許可していないようです。
問題を解決する方法は、小さなラッパーを使用してリクエストをキャッチし、必要なディスパッチを実行することです。
唯一の問題は、接尾辞に「OK、配信されました!」と表示されることですが、配信が成功したかどうかは実際にはわかりません。
とにかく、これは私のラッパーのコードです:

#!/bin/bash
USER=`echo $2 | awk -F"@" '{print $1}'`
NEXTHOP=`echo $2 | awk -F"@" '{print $2}'`
/usr/bin/Sudo -u vmail /usr/bin/procmail -t -m USER=$USER NEXTHOP=$NEXTHOP /etc/procmailrc

「USER」は電子メールに含まれるユーザー名であり、「NEXTHOP」は電子メールに含まれるドメインです...明確にするために:USER @NEXTHOP。

メッセージはstdinとしてスクリプトに渡され、メッセージをフェッチして独自の裁量で使用できるようになります。

お役に立てば幸いです:)

1

roundhouse を試して使用するか、 MIMEDefang をインストールし、 add_recipient を使用して、必要な他のサーバーに電子メールを中継できます。

0
adamo