web-dev-qa-db-ja.com

Postfix:キューに入れられたメッセージの送信者を変更する

完全な再インストール後、設定に問題が発生しました:送信者アドレスが間違っていて、一部の受信者(メールサーバー)が拒否しました。

そのため、Postfixキューに大量のメールがスタックしています。

理想的には、キューに入れられたメールで送信者アドレスを直接変更してから、キューをフラッシュするのが最適です。

私は試しました この答え これはまさにこの問題に対処します。しかし、私が持っているバージョン(2.11.0)では、メッセージを簡単に変更できないようです。

たとえば、/var/spool/mqueue dir、ただし、代わりに/var/spool/postfix/...

active
bounce
corrupt
defer
deferred
dev
etc
flush
hold
incoming
lib
maildrop
pid
private
public
saved
trace
usr

関心のあるディレクトリはdeferredです。いくつかのファイルを修正して、間違ったドメインを正しいドメインに変更しようとしました(変更されたファイルのみが変更されるように注意しました)。

しかし、その後、それらのメールはcorruptに移動されました。つまり、単純なテキスト変更は機能しないようです(viで行われます)。

キューに入れられたメールの送信者を変更する他のよりきれいな方法はありますか?

8
Ring Ø

私はこの問題に対処するために this answe rを試しました。しかし、私が持っているバージョン(2.11.0)では、メッセージを簡単に変更できないようです。

たとえば、/ var/spool/mqueue dirはありませんが、代わりに/ var/spool/postfix/...

二つはっきりさせておきたい。

  • まず、その答えはsendmailではなくpostfixに適用されました。
  • 次に、raw-queue-filesを直接操作することはまったくサポートされていませんでした。

したがって、ここにはいくつかのオプションがあります

1. smtp_generic_mapsパラメータ

この答えは、これに触発されたものです 優れた答え 。古いアドレスを新しいアドレスに自動的に書き換えます。 old-addressをnew-addressにマップするファイルを定義できます。

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    [email protected]       [email protected]

postmap /etc/postfix/genericを実行してpostfix reloadを実行することを忘れないでください

  • pside:メッセージを再キューイングする必要はありません
  • ダウンサイド: Postfixは書き換えを行います送信者と受信者[email protected]に一致するアドレス。

2. sender_canonical_address

最初のオプションの欠点を克服するには、sender_canonical_mapsを使用できます。 Postfix作者の提案 に基づくこのソリューション。最初のオプションと同じように、古いアドレスを新しいアドレスにマップするファイルを定義できます。

/etc/postfix/main.cf:
    sender_canonical_maps = hash:/etc/postfix/sender_canonical

/etc/postfix/sender_canonical:
    [email protected]       [email protected]

postmap /etc/postfix/sender_canonicalを実行してから、postfix reloadを実行します。 postfixキューのフローのため、コマンドpostsuper -r queueidを使用して、影響を受けるキューを再キューイングする必要があります

  • pside: Postfixは受信者アドレスを書き換えません。
  • 欠点:影響を受けるすべてのメッセージをキューに再登録する必要があります。ただし、単一のコマンドpostsuper -r ALL deferredを使用して、延期されたすべてを再キューイングできます。

3. postfixキューの直接操作

これは、高度な処理のためにキューを変更する手動の古い方法です。この回答は postfix-usersメーリングリスト からのものです

要するに

  • キューを抽出

    # postsuper -h queueid
    # postcat -qbh queueid > tempfile.eml
    # vi tempfile.eml
    
  • キューを再送信して古いキューを削除する

    # sendmail -f $sender $recipient < tempfile.eml
    # postsuper -d queueid
    

上記のコマンドのドキュメントについては、 このページ を参照してください

注:
postfix-users mailing list からの元の解決策、postcat -q queueid >tempfileを使用してキューを抽出します。このコマンドは、キューのヘッダー、本文、メタ情報を抽出します。 以下のAzendaleで指摘 の場合、sendmailはメタ情報のため、この不正な電子メールの送信を拒否します。

qパラメータに加えて-bhパラメータを使用すると、postcatは出力をヘッダーと本文のみにフィルタリングし、メタ情報は含みません。これの副次的な利点は、一時ファイルがほとんどの電子メールクライアントが.eml形式として認識する形式であるため、結果の(編集された)メッセージを表示できることです。

19
masegaloeh

素晴らしい記事。設定が不適切な状態で数日間実行されていたメールサーバーに問題があったため、新しい受信者に再送信する必要のあるキューがたくさんありました。そこで、すべてのキューをループする2つのワンライナーを作成しました。

最初に、すべてのキューを見つけて保留にし、.emlファイルとして保存して再送信します。

for ID in `mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }' | tr -d \!`; do postsuper -h $ID; postcat -qbh $ID > tempfile$ID.eml; sendmail -f $sender $recipient < tempfile$ID.eml; done

キューを削除するための2番目:

for ID in `mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }' | tr -d \!`; do postsuper -d $ID; done

この最後のコードを実行する前に、保留されていない新しいキューがないことを確認してください。これを発行してそれを行い、「!」のないキューIDを探します最後に:

mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }'

オンではこれらの2つの1つのライナーを1つに簡単に入れることができましたが、キューを削除する前に実際にメールが受信されたことを確認することで、より細かく制御できると感じました。

1
Jorn