送信者に拒否メッセージを返しますが、まだ電子メールを転送するようにPostfixを設定する

送信者に拒否メッセージを返しますが、まだ電子メールを転送するようにPostfixを設定する

私はPostfixサーバーが特定のエンベロープの送信者からの電子メールを拒否しているように見えますが、同じ電子メールを意図した受信者に転送し続ける方法を見つけようとしています。

マイクロソフトの電子メールサーバーは、マイメールサーバーのIPアドレスをブラックリストに登録し続け、マイサーバーからの電子メールを拒否し、次のメッセージを表示します。

ネットワークの一部がブロックリスト(S3150)にあるので、適切なインターネットサービスプロバイダに連絡してください。

過去数ヶ月間、ホスティングプロバイダーと私は、低容量のメールサーバーで疑わしい活動が発生せず、リバースDNS、SPF、およびDKIMレコードが正しく構成されており、ブラックリストに表示されないことを3回確認しました。一般に、GmailやYahooなどの他の大規模な電子メールプロバイダドメインにメールを送信することに問題はありません。

私のプロバイダは、これまでにMicrosoftの問題を解決し、「緩和」を成功させるために3回助けました。これにより、私は彼らのドメインの1つで定期的に電子メールを送信している人としばらくの間通信することができましたが、毎回安心感は一時的なものであることが判明し、状況は急速に回復しました。帰ってきた。

私はこの無意味なゲームに疲れたので、私はこの一般ユーザーに私のメールサーバーにアカウントを与えました。

私の電子メールの記録によると、この人は過去数年間に私が連絡した唯一のMS「顧客」なので、私は継続的にMSを通過する手間をかけたくなく、代わりにメッセージを拒否したいと思います。 MSメールサーバーから適切な方法でニュースを入手してください。電子メールを拒否すると、Microsoftは何の理由もなく私のメールサーバーを検閲し続けるため、返信を送信できないことを発信者に通知します。

私はそのような電子メールに返信を送信できないので、これが彼らにこの情報を提供する唯一の方法のようです。しかし、同時に私が知っている誰かが電子メールプロバイダを変更したり、一時的に連絡が切れたりした場合に備えて、そのような送信者が何を書いているのかを確認したいと思います。

もしそうなら、Postfixを使ってこのようなことが可能かどうかを誰でも教えてもらえますか?それでは、これを構成する最良の方法は何ですか?

ベストアンサー1

より多くの研究と実験を経て、これまで効果があるように見えるソリューションを見つけました。

私は説明された方法に従った。http://www.postfix.org/SMTPD_PROXY_README.html、リンクに示すようにmaster.cfを編集し、次のようにsocatを使用します。

socat tcp-l:10025,fork,bind=127.0.0.1 system:/path/to/filterscript.sh

127.0.0.1:10025で受信し、各接続で私が作成したbashフィルタスクリプトのインスタンスを起動します。これは以下に掲載されています。

SMTPD_PROXY_README の最後の部分によると、私のスクリプトは単にプレフィルタ Postfix smtp サーバの smtp コマンドとデータを 127.0.0.1:10026 の Postix ポストフィルタ smtp サーバに戻し、(ほとんど) コマンドを返します.フィルタのポストフィルタサーバから受信したコマンド応答は、プレフィルタサーバに返されます。

ただし、このプロセス中にスクリプトに「@hotmail.com」で終わる「MAIL FROM:」アドレスが表示された場合、メッセージの完了時にポストフィルタサーバーの250成功応答はプレフィルタサーバーに戻されません。これにより、カスタムメッセージとともに550拒否コードがプレフィルタサーバーに送信されます。これにより、Postfixのプレフィルタサーバーは、ポストフィルタサーバーが実際にメッセージを配信したにもかかわらず、そのメッセージが拒否されたことをHotmailに報告します。

これは私が使用するスクリプトです。

#!/usr/bin/bash

exec 4<>/dev/tcp/127.0.0.1/10026  # output back to postfix

export IFS='$\n'

function relay_smtp_responses {
    while read -r -t 1 -u 4 rline; do
    if [[ $rline == "221 "* ]]; then
        Finished=true
    else
        echo "$rline"
    fi
    done
}

InDataMode=false
Finished=false
Reject=false

relay_smtp_responses    # relay initial smtp greeting from after filter server back to before filter server

until "$Finished"; do
    if ! read -r -t 5 line; then  # fetch line from before filter smtp server
        relay_smtp_responses
        echo -e "QUIT\r" >&4
        exit
    fi
    echo "$line" >&4  # relay line to after filter smtp server
    if "$InDataMode"; then
        if [[ ${line%$'\r'} == "." ]]; then
            InDataMode=false
            if "$Reject"; then
                echo "550 5.7.1 Replies to you are blocked, see <insert link to customized error explanation here>"
            else
                relay_smtp_responses  # relay post-filter's eom response back to pre-filter server
            fi
        fi
    else
        relay_smtp_responses   # relay command response from after filter server back to pre filter server
        if [[ ${line%$'\r'} == "MAIL FROM:"*"@hotmail.com>" ]]; then
            Reject=true
        elif [[ ${line%$'\r'} == "DATA" ]]; then
                InDataMode=true
        fi
    fi
done

Bashの読み取りコマンドはバイナリデータをうまく処理できないため、次のように追加してBDATコマンドも無効にする必要がありました。

smtpd_discard_ehlo_keywords = chunking

Postfix main.cf ファイルに。他の言語を使用すると、これを回避できます。

私のスクリプトが8ビットデータをどれだけうまく処理しているかはまだわかりませんが、まだ8BITMIMEまたはSMTPUTF8を無効にしておらず、問題は発生していません。

これまでは私が望むことを行っていますが、このスクリプトはまだ主に概念を証明するためのものなので、追加のテスト後にそれを改善または交換できることを願っています。

どんな考えや提案でも歓迎します。この情報が誰かに役立つことを願っています。

おすすめ記事