Ethsim2
(Ethan )
1
Discourse が受信メールを以下のように拒否している現象が発生しています:
Email can not be processed: Access Denied
受信メール自体は正常に動作しているように見えます。メッセージはメール受信者に届き、SPF、DKIM、DMARC もすべて通過しています。その後、Discourse は Jobs::ProcessEmail を通じてそれを処理します。
この動作は MIME/本文の内容に依存しているようです:
- シンプルなプレーンテキストメール → 受理
- Outlook の署名、テーブル、および/またはインライン画像を含むメール →
Access Denied で拒否
拒否されたメールのログには、失敗が Email::Processor#process! で発生していることが示されています。
Discourse アプリケーションのバージョン:
4143157a17dc3ff63c909c64d0cf578243d38861
このインストールは最近別のサーバーに移動/復元されましたが、SMTP による受信配信自体は機能しており、この動作はリッチなメール本文に特に関連しているようです。
必要であれば、個人情報を削除した生の MIME メッセージや、さらに詳しい IncomingEmail/Email::Receiver の診断情報を提供できます。
Ethsim2
(Ethan )
2
更新:Access Denied(アクセス拒否)エラーの原因を再現し、PR を作成しました:
私の元の観察結果の重要な点は以下の通りです:
- 簡易/プレーンな受信メール → 受理
- 埋め込みメディアを含むリッチなメール →
Access Denied で拒否
拒否されたメッセージは、外部ユーザーからの受信メールを許可するカテゴリにおいて、ステージング/外部ユーザーとして処理されていました。
#42079 以降、NewPostManager は画像サイズのメタデータがない場合、投稿コンテンツから直接埋め込みメディアを検出します。これにより、これらのメッセージは正しく :contains_media のレビューパスに送られます。
しかし、投稿をレビューキューに追加する前に、NewPostManager.default_handler は通常のカテゴリトピック作成の Guardian チェックを実行します。
ステージング中の受信メールユーザーの場合、Email::Receiver がすでにカテゴリの外部ユーザーメールパスを受理し skip_validations を渡しているにもかかわらず、このチェックは失敗する可能性があります。
これにより、私が遭遇していた以下のエラーが発生します:
Email::Receiver::InvalidPost: Access Denied
外部ユーザーからのメディアを含むメールに対するエンドツーエンドの受信機回帰テストを追加しました。
現在の main ブランチでは、修正前にこのテストは以下を再現します:
Email::Receiver::InvalidPost: Access Denied
また、#42079 の直前でも同様のケースをテストし、受信メールが受理されることを確認しました。これにより、この問題がその変更によって導入された回帰エラーであることが確認できました。
この PR は意図されたメディアモデレーションをバイパスするのではなく、それを維持します。修正により、受信メールは ReviewableQueuedPost としてキューに追加され、そのレビュー理由は以下のように保持されます:
contains_media
関連する Email::Receiver および NewPostManager のスペックはローカルで正常に実行されました:
261 examples, 0 failures
したがって、これは私が上記で報告した Access Denied の挙動、特にプレーンなメールが機能した一方で埋め込みメディアを含むリッチなメッセージが機能しなかった理由を説明していると考えられます。