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


8

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

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

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

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

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

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

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

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

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

回答:


19

私はこの問題に対処するこの回答を試しました。しかし、私が持っているバージョン(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:
    account@localdomain.example.com       account@example.com

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

  • メリット:メッセージをキューに再登録する必要はありません
  • 欠点: Postfixは、一致する送信者と受信者のアドレスを書き換えますaccount@localdomain.example.com

2. sender_canonical_address

最初のオプションの欠点を克服するには、を使用できますsender_canonical_maps。この解決策はPostfixの作者の提案に基づいています。最初のオプションと同じように、ファイルを定義してold-addressをnew-addressにマップできます。

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

/etc/postfix/sender_canonical:
    account@localdomain.example.com       account@example.com

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

  • メリット: 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メーリングリスト
からの元のソリューション。キューの抽出に使用します。このコマンドは、キューのヘッダー、本文、メタ情報を抽出します。下記のAzendaleで指摘したように、はメタ情報のため、この不正な形式の電子メールの送信を拒否します。postcat -q queueid >tempfilesendmail

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


1
私はこれを試しました、そして少なくとも私のバージョンのpostfixでは、私がのようなものを使うまでメッセージを送信しないようでしたpostcat -qbh queueid >tempfile。(副次的な利点:.eml形式です。)ちょうど使用-qしただけでは、sendmailを実行しても何も実行されないように見えました。Postfixバージョン2.8.4。誰かがこれを確認できますか?もしそうなら、この答えを編集しましょう。
Azendale、2015

こんにちは@Azendale、私は3番目のソリューションを再テストします。はいqbh、それを機能させるために使用する必要があります。更新された回答に説明を追加します... :)
masegaloeh

よろしくお願いします!のような第三の解決策を探していました。それはちょうど完璧です!
JazZ 2017年

1

素晴らしい記事。設定が不適切な状態で数日間実行されていたメールサーバーに問題があったため、新しい受信者に再送信する必要のあるキューがたくさんありました。そこで、すべてのキューをループ処理する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つに簡単に入れることができましたが、キューを削除する前に実際にメールが受信されたことを確認することで、より細かく制御できると感じました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.