0

私は1つのメール送信プログラムを書いています。キューからメールを読み取り、キューから削除を送信した後。

したがって、プロセスは次のようになります。

  1. キューから 1 つのメールを読み取る
  2. メールを送る
  3. キューからメールを削除

ステップ 2 の後にアプリケーションがクラッシュした場合。プログラミングのバグまたはネットワーク エラーが原因で、キューからメールを削除できません。メールの複数のコピーを送信することになります。

メールの重複コピーを送信しないようにする方法はありますか? 一意のハッシュを生成し、カスタム ヘッダーを追加するもの。そして、同じヘッダー値を持つメールがあるかどうかを確認します。

4

1 に答える 1

0

特定のメール (たとえば、特定のヘッダーまたはハッシュ値を持つ) が既に送信されているかどうかを確認するためにメール システムにクエリを実行するようなことはないため、これを行う方法は実際にはありません。

メール配信ソフトウェアは、キューに入れられたメールをまったく送信しないよりも、重複したメールを送信する方がよいという観点を取る必要があります。

もちろん、アプリケーションをエラーやクラッシュに対して堅牢にするために、必要と思われるだけ多くの手順を実行できます。これには、すべての例外を確実にキャッチfork()する、アプリケーションを実行する、親が監視している間に子を動作させるなどがあります。 . 基本的に、メールunlink()が送信されたことが確認されたら、できるだけ早くキューから削除するためのあらゆる合理的な努力を行います (これは、たとえば単純な など、簡単に失敗しない単純な操作であることが望ましいです)。

それでも、プログラムにバグがまったくない場合でも、ネットワークは依然としてあなたを噛む可能性があります. メールを送信しても SMTPDATAコマンドからの応答が得られない場合 (ちょうどその時点でネットワーク接続が切断されたなどの理由で)、メールは送信されていますか? 知ることは不可能です。デキューする必要がありますか?いいえ。

于 2013-07-06T17:55:19.790 に答える