Configure direct-delivery incoming email for self-hosted sites with Mail-Receiver

こんにちは!ガイドに従って設定したのですが、送信メールで奇妙な問題が発生しています。これは、この設定とは関係ないと思っていたのですが。メール受信機能(mail-receiver)をオンにしてから、すべての試行されたメール(すべてリトライリストに滞留しています)に対して、Sidekiq は次のエラーを返します。

Jobs::HandledExceptionWrapper: Wrapped OpenSSL::SSL::SSLError: SSL_read: unexpected eof while reading

検索したところ、これは TLS に関連しているようです。yml ファイルの TLS 関連の行のコメントを解除しましたが、コメントアウトし直しても問題は解決しませんでした。ガイドの Postfix の競合を解決するための手順を試しましたが、Postfix はインストールされていないようです。(ガイドにある /etc/postfix ディレクトリは私のインスタンスには存在せず、サービスとしても認識されません。)また、netstat の結果によると、ポート 25 を使用しているのは docker-proxy のみです。

送信 SMTP サービスとして Gmail を使用しており、実際、この設定を行う前は受信 POP3 ポーリングにも Gmail を使用していました。Google を指す多くの MX レコードを削除しましたが、ガイドでそうするように指示されていました。

以下は、詳細を伏せた mail-receiver.yml です。

## これは受信メール受信コンテナのテンプレートです
##
## このファイルを変更した後は、必ず再ビルドしてください
## /var/discourse/launcher rebuild mail-receiver
##
## *編集には細心の注意を払ってください!*
## YAML ファイルは、空白やインデントの間違いに非常に敏感です!
## 必要に応じて http://www.yamllint.com/ でこのファイルを検証してください

base_image: discourse/mail-receiver:release
update_pups: false

expose:
  - "25:25"   # SMTP

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  ## フォーラムに送信されるメールの宛先。一般的に、
  ## ここでフォーラム自体のドメインを使用しても問題ありません。
  MAIL_DOMAIN: discourse.[mydomain].org
# TLS をサポートするためにコメントを解除してください(および以下のボリュームも!)
  POSTCONF_smtpd_tls_key_file:  /letsencrypt/discourse.[mydomain].org/discourse.[mydomain].org.key
  POSTCONF_smtpd_tls_cert_file:  /letsencrypt/discourse.[mydomain].org/fullchain.cer
  POSTCONF_smtpd_tls_security_level: may


  ## この Discourse インスタンスの基本 URL。
  ## これは、Discourse サイトの URL と同じになります。例えば、
  ## https://discourse.example.com。サブフォルダ設定を実行している場合は、
  ## それを考慮してください(例:https://example.com/forum)。
DISCOURSE_BASE_URL: 'https://discourse.[mydomain].org'

  ## Discourse フォーラムのマスター API キー。管理パネルの
  ## 「API」タブから取得できます。
  DISCOURSE_API_KEY: [myapikey]

  ## 受信メールの処理に使用するユーザー名。`system` ユーザーを
  ## 名前変更していない限り、そのままにしておくべきです。
  DISCOURSE_API_USERNAME: system

volumes:
  - volume:
      host: /var/discourse/shared/mail-receiver/postfix-spool
      guest: /var/spool/postfix
# TLS をサポートするためにコメントを解除
  - volume:
      host: /var/discourse/shared/standalone/letsencrypt
      guest: /letsencrypt

メールの技術的なことは私の専門外なので、設定時に何か単純なことを見落としていたとしても、どんなアドバイスでもありがたいです。ありがとうございます!

「いいね!」 1

思った通り、ネックレシーバーとは関係ありません。メールを送信しているホストのSSL証明書が破損しています。

トラブルシューティングを重ねた結果、解決しました。問題は、Discourseインスタンスをホストしているドメインと、MXレコードがあるドメインが同じではなかったことにある可能性が高いです。その混乱を乗り越えたら、すべてがうまくいきました。

明らかに私の単純なミスですが、ガイドにも少し混乱させられました。

2つの forum.example.com エントリが同一である必要はないということは、あまり明確ではありません。私の場合は、異なる必要がありました。このガイドを使用する人々は、それを理解できるだけの経験を持っているべきかもしれませんが、私はそうではありませんでした。そのため、同様の問題に遭遇する可能性のある他の人のために、ここに残しておきます。DNSについて知らなかったことをいくつか学びました。良い学習体験でした。すべてうまくいっています。:slight_smile:

さて、早とちりだったようです。送信メールは正常に機能し、受信の返信も正常に機能しているようですが、カテゴリのメールアドレスへの投稿がサイレントに失敗しています。設定からアドレスをそのままコピーして新しいメールに貼り付けたので、タイプミスはありません。

私の mail-receiver のログには、主に3種類のログエントリがあります。既存の投稿への返信メールである成功したログは、次のようになります。

Sep 20 16:59:44 discourse-mail-receiver postfix/smtpd[277]: connect from server168-1.web-hosting.com[68.65.122.144]
Sep 20 16:59:45 discourse-mail-receiver postfix/smtpd[277]: NOQUEUE: reject: RCPT from server168-1.web-hosting.com[68.65.122.144]: 454 4.7.1 <[category]@discourse.[domain].org>: Relay access denied; from=<ryan@[redacted].com> to=<[category]@discourse.[domain].org> proto=ESMTP helo=<server168-1.web-hosting.com>
<22>Sep 20 16:59:45 policyd-spf[288]: : prepend Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=[redacted]; helo=server168-1.web-hosting.com; envelope-from=ryan@[redacted].com; receiver=discourse.[domain].org Sep 20 16:59:45 discourse-mail-receiver postfix/cleanup[281]: 4CCED114200: message-id=<20240920165945.4CCED114200@discourse-mail-receiver.localdomain>
Sep 20 16:59:45 discourse-mail-receiver postfix/smtpd[277]: disconnect from server168-1.web-hosting.com[68.65.122.144] ehlo=1 starttls=0/1 mail=1 rcpt=0/1 data=0/1 quit=1 commands=3/6

それ以外では、(私がエラーだと想定している) 2種類のログエントリがあり、それぞれがかなりの頻度で繰り返されています。最初のものは次のようになります。

Sep 20 17:00:23 discourse-mail-receiver postfix/qmgr[124]: 5D162FC26D: from=<double-bounce@discourse-mail-receiver.localdomain>, size=960, nrcpt=1 (queue active)

そしてもう一つは次のようになります。

Sep 20 17:00:23 discourse-mail-receiver postfix/error[293]: 8DC3BFC141: to=<postmaster@discourse-mail-receiver.localdomain>, orig_to=<postmaster>, relay=none, delay=126622, delays=126622/0.05/0/0, dsn=4.4.3, status=deferred (delivery temporarily suspended: Host or domain name not found. Name service error for name=discourse-mail-receiver.localdomain type=MX: Host not found, try again)

そして、私の mailq は、このようなエントリが何度も何度も繰り返されているだけです。

3D07BFC23D      960 Fri Sep 20 06:42:23  double-bounce@discourse-mail-receiver.localdomain
(delivery temporarily suspended: Host or domain name not found. Name service error for name=discourse-mail-receiver.localdomain type=MX: Host not found, try again)
                                         postmaster@discourse-mail-receiver.localdomain

これらの一部は、Discourse が送信したメールに関連しているようで、何らかの理由でバウンスバックされています。 mail-receiver には、これらのバウンスを処理する機能はありますか、それとも mailq に永久に残り続けますか?

次に、返信は機能するのに、カテゴリに直接メールで投稿できないのはなぜですか? いつも助けてくれて、辛抱強くありがとう。 :slight_smile:

これは、投稿への返信の成功ではなく、カテゴリへの送信失敗のログエントリのようです。

100%確信はありませんが、relay access denieddiscourse.[domain].orgmail-receiver.ymlMAIL_DOMAIN に使用されているドメインではないことを示唆していると思います。おそらく、返信アドレスは他の手段で許可されているのでしょう。

MAIL_DOMAIN で使用されているものが、少なくとも postfix 設定ファイルの一箇所に格納されることはわかっていますので、それを変更するにはコンテナを再構築する必要があるでしょう。MAIL_DOMAIN を変更しましたか?もしそうであれば、その後 ./launcher rebuild mail-receiver を実行しましたか?

「いいね!」 2

[前の投稿を完了する前に誤ってEnterキーを押してしまったこと、申し訳ありません]

この問題についてまだ試行錯誤していますが、問題の原因について新しいアイデアがあります。[domain1]と[domain2]という2つのドメインで作業しています。GmailのSMTPリレーは[domain1]でホストされています。Discourseインスタンスとmail-receiverは[domain2]でホストされています。

メールが[domain1]から送信されているときに、返信先アドレスを[domain2]に強制するために、Discourseのreply-by-email-address設定をどのように設定すればよいですか?これを試みると、前述のSSL EOFエラーが発生します。DNS認証のトリックか、何か見落としていることがあると推測しています。

どうやら最終的に解決できたようです。SMTPリレーとは異なるドメインに「返信先」アドレスを設定するために、Google Workspaceの一部の設定を緩和する必要がありました。双方向で意図したとおりに動作しているようです。

「いいね!」 1

これで最後の質問です。すべて正常に動作していますが、mailq に古いエントリがたくさん残っています。これらは、おそらく間違った設定で生成されたため、永遠に処理されないメールでしょう。削除して次に進みたいのですが、mailq をクリアするにはどうすればよいですか?

少し古い投稿ですが、SSL EOFエラーの最も一般的な原因は、OpenSSLのバージョン間の競合(v1.1.1f対v3)である可能性があります。古い1.1.1fをアップグレードすることが解決策になります。悪いニュースは、例えばUbuntu 20.xでは新しいバージョンを使用できないため、Ubuntu全体をアップグレードする必要があるということです。

「いいね!」 1

これには本当に困っています。何時間も費やしましたが、設定ファイル名がすべて小文字であるにもかかわらず、ランチャーのエラーを乗り越えることができません。

“ERROR: Config name must not contain upper case characters, spaces or special characters. Correct config name and rerun ./launcher.”

実行中

./launcher rebuild mail-receiver

または

./launcher bootstrap mail-receiver

または

./launcher start mail-receiver

ランチャーのコードベースでこれを見ることができます。

うーーーーーー – 助けてください!

上記のリンクされた投稿のロケールに関連するすべてと、他の場所で見つけたすべてを試しました。

./launcher rebuild app___ はすべて正常に動作しています!

考えられる手がかりが一つあります。設定ファイルの名前を付けている最中に、誤ってCapsLockキーを押し(文字のうち2文字だけ大文字になった)、すぐにCapsLockキーを無効にして、保存する前にその2文字を打ち直した直後に、この現象が発生し始めたのです。

この短いタイプミス/修正が原因でこれが発生したとは想像しにくいですが、もしかしたら大文字/小文字の情報がどこかのバッファに引っかかっているのかもしれません。

私の知識をはるかに超えていますが、エラーメッセージに $config 変数が出力されないことに驚いています :thinking:
デバッグに間違いなく役立つでしょう。

「いいね!」 1

@Canapin さん、ありがとうございます!設定しようとしているのはこれです。

https://www.perplexity.ai/search/provide-the-code-lJcI4BrFQ2auuD42ehYFwA

コマンドラインの全内容をコピー&ペーストしていただけますか?

./launcher start mail-receiver からエラーメッセージ、そして正確な .yml ファイル名までお願いします。

設定ファイルを Mail-receiver.yml にリネームし、./launcher start Mail-receiver を実行すると、以下のような出力が得られます。

ERROR: Config name 'Mail-receiver' must not contain upper case characters, spaces or special characters. Correct config name and rerun ./launcher.

ここでは、エラーメッセージにファイル名が含まれています。

また、./launcher start aaa を実行すると、対応するファイルが見つからず、利用可能なファイルがリスト表示されます。フォルダからしかピックアップされないので、特別なことはありませんが、何か興味深い出力があるかもしれません :person_shrugging:

ERROR: containers/aaa.yml does not exist or is not readable.

Available configs ( app, mail-receiver )

ありがとうございます。解決して動作するようになりました。

結局、問題は何でしたか? 他の人たちの参考になるかもしれません :slight_smile:

問題はありませんでした。ドメインとメールのルーティングにおいて、さまざまなサーバーコンポーネントがどのように連携するかを理解するための学習曲線だっただけです。Postfixについて学ぶのは初めてでした。楽しかったですし、多くのことを学びました。

最終的にたどり着いたレシピは、各Discourseインスタンスにペアリングされたmail-receiver.yml(Dockerコンテナ)を使用し、Postfixのトランスポート機能を使用してルーティングを処理するために、すべてポート25を共有することです。

「いいね!」 2

Ubuntu 22.04 で Postfix をインストールした専用サーバーで、メール受信機能が有効になっている Discourse の各インスタンスに個別の mail-receiver.yml を使用しています。

この設定により、サーバー上に Discourse のインスタンスごとに (通常の app コンテナに加えて) 別個のコンテナが作成され、それぞれの Discourse インスタンスのメールを受信・処理します。

サーバー上のすべての Discourse フォーラムの受信メールは、標準ポート 25 を介して Postfix によって受信されます。Postfix のメイン設定ファイルは、「トランスポートマップ」を使用して、メールの「To:」アドレスのドメイン名を解析することで、各メールを意図した Discourse フォーラムに「リレー」します。

そのため、このトピックの説明に加えて、私は…

  1. 既存の postfix 設定ファイルを以下で変更しました: /etc/postfix/main.cf

  2. 次に、対応する postfix トランスポートマップ ファイルを以下で追加しました: /etc/postfix/transport

  1. 最後に、各フォーラムのメールコンテナを作成するために対応するファイルを追加しました:
    /var/discourse/containers/mail-receiver-domain1.yml
    /var/discourse/containers/mail-receiver-domain2.yml
    /var/discourse/containers/mail-receiver-domain3.yml
    /var/discourse/containers/mail-receiver-domain4.yml
    /var/discourse/containers/mail-receiver-domain5.yml

「いいね!」 3

mail-receiver.yml には DISCOURSE_MAIL_ENDPOINT はなく、変更する DISCOURSE_BASE_URL もあります。

「いいね!」 2

メール転送サービスを利用しており、メールをJSON形式でWebhookに転送できます。

これは直接配信のオプションですか?

「いいね!」 1