مستقبل البريد لا يوصل البريد إلى Discourse

لقد ارتكبت هذا الخطأ، وتركت discourse.example.com في ملف mail-receiver.yml.

لقد قمت بإصلاح هذا الآن، ولكن يبدو أن mail-receiver لا “يحصل” على التفاصيل الجديدة.
كيف يمكنني “إعادة تعيين” mail-receiver (على سبيل المثال، ما هو الأمر المكافئ لـ ./launcher rebuild app؟).

تعديل: لم أقرأ المنشور السابق بعناية كافية، الأمر هو ./launcher rebuild mail_receiver.

إعجاب واحد (1)

أواجه مشكلة أخرى الآن حيث لا يقوم mail-receiver بتسليم البريد إلى Discourse — لقد حاولت البحث عن مساعدة، ولكن دون جدوى.

السجلات:

Starting Postfix
Dec 14 03:12:32 forum-mail-receiver postfix/master[1]: daemon started -- version 3.5.6, configuration /etc/postfix
Dec 14 03:15:47 forum-mail-receiver postfix/smtpd[113]: connect from mail-pl1-f169.google.com[209.85.214.169]
Dec 14 03:15:47 forum-mail-receiver postfix/smtpd[113]: 821CB37A659: client=mail-pl1-f169.google.com[209.85.214.169]
Dec 14 03:15:47 forum-mail-receiver postfix/cleanup[120]: 821CB37A659: message-id=<602f2194be912e92b969eacf5eac26e2@frontapp.com>
Dec 14 03:15:47 forum-mail-receiver postfix/qmgr[98]: 821CB37A659: from=<[my personal email address]>, size=4086, nrcpt=1 (queue active)
<23>Dec 14 03:15:47 receive-mail[122]: Recipient: nobody@[my forum URL]Dec 14 03:16:20 forum-mail-receiver postfix/smtpd[113]: disconnect from mail-pl1-f169.google.com[209.85.214.169] ehlo=1 mail=1 rcpt=1 bdat=1 quit=1 commands=5
<19>Dec 14 03:16:47 receive-mail[122]: Failed to POST the e-mail to [my forum URL]/admin/email/handle_mail: execution expired (Net::OpenTimeout)<19>Dec 14 03:16:47 receive-mail[122]:   /usr/lib/ruby/2.7.0/net/http.rb:960:in `initialize'
  /usr/lib/ruby/2.7.0/net/http.rb:960:in `open'
  /usr/lib/ruby/2.7.0/net/http.rb:960:in `block in connect'
  /usr/lib/ruby/2.7.0/timeout.rb:105:in `timeout'
  /usr/lib/ruby/2.7.0/net/http.rb:958:in `connect'
  /usr/lib/ruby/2.7.0/net/http.rb:943:in `do_start'
  /usr/lib/ruby/2.7.0/net/http.rb:932:in `start'
  /usr/lib/ruby/2.7.0/net/http.rb:1483:in `request'
  /usr/local/lib/site_ruby/mail_receiver/discourse_mail_receiver.rb:43:in `process'
  /usr/local/bin/receive-mail:13:in `<main>'Dec 14 03:16:47 forum-mail-receiver postfix/pipe[121]: 821CB37A659: to=<nobody@[my forum URL]>, relay=discourse, delay=60, delays=0.17/0.01/0/60, dsn=4.3.0, status=deferred (temporary failure)
Dec 14 03:17:32 forum-mail-receiver postfix/qmgr[98]: 7C67437A663: from=<[my personal email address]>, size=4093, nrcpt=1 (queue active)

أي فكرة عما قد يسبب هذا؟

ملف mail-receiver.yml صالح، وقد تحققت من الأخطاء الإملائية:

هذه هي نطاقات مفتاح API الخاص بي:

يصل البريد إلى mail-receiver، ولكنه يبقى في mailq:

بدلاً من ذلك، هل هناك أي طريقة لحذف حاوية mail-receiver بالكامل والبدء من جديد؟

قد تكون المشكلة أن مفتاح واجهة برمجة التطبيقات (API) غير مُعيّن لديك

شكراً على الرد @pfaffman… تم تعيينه بالتأكيد في إعدادات mail-receiver.yml الخاصة بي. هل يجب أن يكون بين علامتي اقتباس؟

 (Net::OpenTimeout)

هذه هي مشكلتك. لا يمكن لمستقبل البريد الوصول إلى عنوان URL الخاص بالمنتدى الخاص بك. لذا، إما أن لديك عنوانًا خاطئًا بطريقة ما أو أن هناك مشكلة في الشبكة داخل دوكر بين مستقبل البريد والمنتدى الخاص بك، على ما أعتقد.

كيف يمكنني استكشاف الأخطاء وإصلاحها بشكل أكبر؟

ping forum.[mydomain].co.nz

من داخل mailq يظهر:

64 bytes from [ip].vultrusercontent.com ([ip]): icmp_seq=1 ttl=64 time=0.113 ms
64 bytes from [ip].vultrusercontent.com ([ip]): icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from [ip].vultrusercontent.com ([ip]): icmp_seq=3 ttl=64 time=0.069 ms

وما إلى ذلك، مما يوضح أن الاتصال ناجح.
forum.[mydomain].co.nz هو المكان الذي تتم فيه استضافة المنتدى، ويتم استخدام نفس عنوان URL هذا في MAIL_DOMAIN و DISCOURSE_MAIL_ENDPOINT.

بالنظر إلى إعدادات mail-receiver.yml عن كثب، هل أفتقد علامات اقتباس أو https:// في أي مكان يجب أن تكون فيه؟

## this is the incoming mail receiver container template
##
## After making changes to this file, you MUST rebuild
## /var/discourse/launcher rebuild mail-receiver
##
## BE *VERY* CAREFUL WHEN EDITING!
## YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
## visit http://www.yamllint.com/ to validate this file as needed

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

  ## Where e-mail to your forum should be sent.  In general, it's perfectly fine
  ## to use the same domain as the forum itself here.
  MAIL_DOMAIN: forum.[domain].co.nz
# uncomment these (and the volume below!) to support TLS
#  POSTCONF_smtpd_tls_key_file:  /letsencrypt/discourse.example.com/discourse.example.com.key
#  POSTCONF_smtpd_tls_cert_file:  /letsencrypt/discourse.example.com/fullchain.cer
#  POSTCONF_smtpd_tls_security_level: may


  ## The URL of the mail processing endpoint of your Discourse forum.
  ## This is simply your forum's base URL, with `/admin/email/handle_mail`
  ## appended.  Be careful if you're running a subfolder setup -- in that case,
  ## the URL needs to have the subfolder included!
  DISCOURSE_MAIL_ENDPOINT: 'https://forum.[domain].co.nz/admin/email/handle_mail'

  ## The master API key of your Discourse forum.  You can get this from
  ## the "API" tab of your admin panel.
  DISCOURSE_API_KEY: 639[rest of API key]884ef

  ## The username to use for processing incoming e-mail.  Unless you have
  ## renamed the `system` user, you should leave this as-is.
  DISCOURSE_API_USERNAME: system

volumes:
  - volume:
      host: /var/discourse/shared/mail-receiver/postfix-spool
      guest: /var/spool/postfix
# uncomment to support TLS
#  - volume:
#      host: /var/discourse/shared/standalone/letsencrypt
#      guest: /letsencrypt

هل تقوم بتشغيل الأمر ping داخل الحاوية، أي بعد تشغيل ./launcher enter mail-receiver أولاً؟

تجدر الإشارة أيضًا إلى أن الأمر ping (عادةً ICMP) يختلف عن الاتصال بـ http/https (TCP) وقد يتصرف بشكل مختلف اعتمادًا على العديد من العوامل في تكوين الشبكة.

أود أن أجرب استخدام curl بعد الدخول إلى الحاوية لمعرفة ما إذا كان بإمكانه الاتصال بالمنتدى الخاص بك عبر https، على سبيل المثال:

cd /var/discourse
./launcher enter mail-receiver
curl -v https://forum.[domain].co.nz

إذا كان يعمل، فسيقوم بطباعة الكثير من HTML. إذا لم يكن كذلك، فسيعرض بعض الأخطاء وسيؤدي الخيار -v إلى طباعة الكثير من المعلومات على طول الطريق والتي قد تساعد في الكشف عن سبب فشله.

إذا فشل، فمن المفيد أيضًا محاولة تشغيل نفس الأمر curl خارج الحاوية لتحديد ما إذا كان خاصًا بالحاوية أو بالنظام المضيف بشكل عام.

3 إعجابات

شكرًا @Simon_Manning، مساعدتك محل تقدير كبير! لم أكن أعرف أن الاتصالات عبر ping ليست بالضرورة نفس الاتصالات عبر curl.

كنت أقوم بتشغيل ping داخل الحاوية، ونجحت.

لقد اتبعت تعليماتك وقمت بتشغيل curl داخل الحاوية، وفشلت:

root@forum:/var/discourse# ./launcher enter mail-receiver
x86_64 arch detected.
WARNING: containers/mail-receiver.yml file is world-readable. You can secure this file by running: chmod o-rwx containers/mail-receiver.yml
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
root@forum-mail-receiver:/# curl -v https://forum.[domain].co.nz
*   Trying [IPv4 address]:443...
*   Trying [IPv6 address]:443...
* Immediate connect fail for [IPv6 address]: Cannot assign requested address
* connect to [IPv4 address] port 443 failed: Connection timed out
* Failed to connect to forum.[domain].co.nz port 443: Connection timed out
* Closing connection 0
curl: (28) Failed to connect to forum.[domain].co.nz port 443: Connection timed out

ثم قمت بتشغيل exit ثم curl مرة أخرى، وحصلت على:

root@forum:/var/discourse# curl -v https://forum.[domain].co.nz
*   Trying 127.0.1.1:443...
* Connected to forum.[domain].co.nz (127.0.1.1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
...and so on.

يبدو أن المشكلة خاصة بالحاوية، وليست بالنظام المضيف - أي أفكار؟

لقد فتحت أيضًا تذكرة دعم مع Vultr (مزود VPS لهذه النسخة) لمعرفة ما إذا كانت المشكلة من جانبهم!

يقوم Docker بإنشاء شبكات افتراضية للحاويات، وفي حالة عدم تحديد شبكة، ستستخدم الحاويات الشبكة الافتراضية. هذه الشبكة الافتراضية لا تسمح بالاتصال بين الحاويات.

عادةً ما يكون هذا جيدًا لـ mail-receiver لأن حاوية Discourse الخاصة بك ستكون المنفذ 443 مكشوفًا خارج تلك الشبكة، وعندما تحاول mail-receiver الاتصال بـ 1.2.3.4، ستغادر شبكة Docker. سيتعرف نظام المضيف (أو بعض الشبكات الأبعد) على أنه يحتاج فقط إلى العودة مرة أخرى، وسينتهي به الأمر بالدخول إلى حاوية Discourse من الخارج.

هناك احتمالان يتبادران إلى الذهن. الأول هو أن mail-receiver على دراية بعنوان IP لحاوية Discourse عند البحث عن اسم النطاق، وبالتالي يتم حظر الاتصال داخل الحاوية. أعتقد أن هذا غير مرجح.

الآخر هو أن جدار حماية على نظام المضيف يمنع الاتصالات من مغادرة حاوية والدخول إلى حاوية أخرى. قد تستخدم Vultr قواعد جدار حماية افتراضية تسبب ذلك، أو أتذكر أيضًا بشكل غامض أن Docker يقوم بتثبيت بعض القواعد في UFW افتراضيًا، لذلك قد يكون هذا مرتبطًا إذا تم استخدام ذلك.

إعجابَين (2)

لا يمكنك استخدام https لأنك لم تقم بإلغاء التعليق على هذه الأسطر:

هذا ينطبق فقط على دعم TLS على جانب خادم البريد، أي لكي تتمكن خوادم البريد الأخرى من تسليم رسائل البريد الإلكتروني إلى mail-receiver عبر TLS.

جدير بالقيام به نظرًا لأن حاوية Discourse تحتوي بوضوح على شهادة ولكن لا ينبغي أن يؤثر ذلك على اتصال mail-receiver بـ Discourse. من المحتمل أن يؤدي إعادة البناء إلى تصحيح شيء ما في شبكة الحاوية.

شكرًا لك، لقد قمت بإلغاء التعليق على تلك الأسطر، والسطر الخاص بالمجلد.

ملف mail-receiver.yml الخاص بي يبدو الآن كالتالي:

root@forum:/var/discourse# cat containers/mail-receiver.yml
## this is the incoming mail receiver container template
##
## After making changes to this file, you MUST rebuild
## /var/discourse/launcher rebuild mail-receiver
##
## BE *VERY* CAREFUL WHEN EDITING!
## YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
## visit http://www.yamllint.com/ to validate this file as needed

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

  ## Where e-mail to your forum should be sent.  In general, it's perfectly fine
  ## to use the same domain as the forum itself here.
  MAIL_DOMAIN: forum.[domain].co.nz
# uncomment these (and the volume below!) to support TLS
  POSTCONF_smtpd_tls_key_file:  /letsencrypt/forum.[domain].co.nz/forum.[domain].co.nz.key
  POSTCONF_smtpd_tls_cert_file:  /letsencrypt/forum.[domain].co.nz/fullchain.cer
  POSTCONF_smtpd_tls_security_level: may


  ## The URL of the mail processing endpoint of your Discourse forum.
  ## This is simply your forum's base URL, with `/admin/email/handle_mail`
  ## appended.  Be careful if you're running a subfolder setup -- in that case,
  ## the URL needs to have the subfolder included!
  DISCOURSE_MAIL_ENDPOINT: 'https://forum.[domain].co.nz/admin/email/handle_mail'

  ## The master API key of your Discourse forum.  You can get this from
  ## the "API" tab of your admin panel.
  DISCOURSE_API_KEY: '074[rest of API key - yes I generated a new one limited to the system user]d98'

  ## The username to use for processing incoming e-mail.  Unless you have
  ## renamed the `system` user, you should leave this as-is.
  DISCOURSE_API_USERNAME: system

volumes:
  - volume:
      host: /var/discourse/shared/mail-receiver/postfix-spool
      guest: /var/spool/postfix
# uncomment to support TLS
  - volume:
      host: /var/discourse/shared/standalone/letsencrypt
      guest: /letsencrypt

عندما أرسل بريدًا إلكترونيًا جديدًا وأقوم بتشغيل ./launcher logs mail-receiver، أرى ما يلي:

Dec 21 22:41:21 forum-mail-receiver postfix/smtpd[132]: connect from mail-pj1-f54.google.com[209.85.216.54]
Dec 21 22:41:23 forum-mail-receiver postfix/smtpd[132]: 16DAC379E42: client=mail-pj1-f54.google.com[209.85.216.54]
Dec 21 22:41:23 forum-mail-receiver postfix/cleanup[139]: 16DAC379E42: message-id=<94fc2bef18b410ae8b121c6af2da2df4@frontapp.com>
Dec 21 22:41:23 forum-mail-receiver postfix/qmgr[100]: 16DAC379E42: from=<[my email address]>, size=5585, nrcpt=1 (queue active)
<23>Dec 21 22:41:23 receive-mail[141]: Recipient: nobody@forum.[domain].co.nzDec 21 22:41:50 forum-mail-receiver postfix/smtpd[143]: connect from mail-oa1-f50.google.com[209.85.160.50]
Dec 21 22:41:52 forum-mail-receiver postfix/smtpd[143]: 2E445379E48: client=mail-oa1-f50.google.com[209.85.160.50]
Dec 21 22:41:52 forum-mail-receiver postfix/cleanup[139]: 2E445379E48: message-id=<6b2f9d646dc46f4fec4af006de01d3ae@frontapp.com>
Dec 21 22:41:52 forum-mail-receiver postfix/qmgr[100]: 2E445379E48: from=<[my email address]>, size=4100, nrcpt=1 (queue active)
<23>Dec 21 22:41:52 receive-mail[147]: Recipient: nobody@forum.[domain].co.nzDec 21 22:41:53 forum-mail-receiver postfix/smtpd[132]: disconnect from mail-pj1-f54.google.com[209.85.216.54] ehlo=2 starttls=1 mail=1 rcpt=1 bdat=1 quit=1 commands=7
Dec 21 22:41:58 forum-mail-receiver postfix/qmgr[100]: 1194937A670: from=<double-bounce@forum-mail-receiver.localdomain>, size=942, nrcpt=1 (queue active)
Dec 21 22:41:58 forum-mail-receiver postfix/smtp[149]: fatal: unknown service: smtp/tcp
Dec 21 22:41:59 forum-mail-receiver postfix/qmgr[100]: warning: private/smtp socket: malformed response
Dec 21 22:41:59 forum-mail-receiver postfix/qmgr[100]: warning: transport smtp failure -- see a previous warning/fatal/panic logfile record for the problem description
Dec 21 22:41:59 forum-mail-receiver postfix/master[1]: warning: process /usr/lib/postfix/sbin/smtp pid 149 exit status 1
Dec 21 22:41:59 forum-mail-receiver postfix/master[1]: warning: /usr/lib/postfix/sbin/smtp: bad command startup -- throttling
Dec 21 22:41:59 forum-mail-receiver postfix/error[150]: 1194937A670: to=<postmaster@forum-mail-receiver.localdomain>, orig_to=<postmaster>, relay=none, delay=1192, delays=1191/1/0/0.01, dsn=4.3.0, status=deferred (unknown mail transport error)
<19>Dec 21 22:42:23 receive-mail[141]: Failed to POST the e-mail to https://forum.sobercheck.co.nz/admin/email/handle_mail: execution expired (Net::OpenTimeout)<19>Dec 21 22:42:23 receive-mail[141]:   /usr/lib/ruby/2.7.0/net/http.rb:960:in `initialize'
  /usr/lib/ruby/2.7.0/net/http.rb:960:in `open'
  /usr/lib/ruby/2.7.0/net/http.rb:960:in `block in connect'
  /usr/lib/ruby/2.7.0/timeout.rb:105:in `timeout'
  /usr/lib/ruby/2.7.0/net/http.rb:958:in `connect'
  /usr/lib/ruby/2.7.0/net/http.rb:943:in `do_start'
  /usr/lib/ruby/2.7.0/net/http.rb:932:in `start'
  /usr/lib/ruby/2.7.0/net/http.rb:1483:in `request'
  /usr/local/lib/site_ruby/mail_receiver/discourse_mail_receiver.rb:43:in `process'
  /usr/local/bin/receive-mail:13:in `<main>'Dec 21 22:42:23 forum-mail-receiver postfix/pipe[140]: 16DAC379E42: to=<nobody@forum.[domain].co.nz>, relay=discourse, delay=60, delays=0.23/0.01/0/60, dsn=4.3.0, status=deferred (temporary failure)
Dec 21 22:42:25 forum-mail-receiver postfix/smtpd[143]: disconnect from mail-oa1-f50.google.com[209.85.160.50] ehlo=2 starttls=1 mail=1 rcpt=1 bdat=1 quit=1 commands=7
<19>Dec 21 22:42:52 receive-mail[147]: Failed to POST the e-mail to https://forum.[domain].co.nz/admin/email/handle_mail: execution expired (Net::OpenTimeout)<19>Dec 21 22:42:52 receive-mail[147]:   /usr/lib/ruby/2.7.0/net/http.rb:960:in `initialize'
  /usr/lib/ruby/2.7.0/net/http.rb:960:in `open'
  /usr/lib/ruby/2.7.0/net/http.rb:960:in `block in connect'
  /usr/lib/ruby/2.7.0/timeout.rb:105:in `timeout'
  /usr/lib/ruby/2.7.0/net/http.rb:958:in `connect'
  /usr/lib/ruby/2.7.0/net/http.rb:943:in `do_start'
  /usr/lib/ruby/2.7.0/net/http.rb:932:in `start'
  /usr/lib/ruby/2.7.0/net/http.rb:1483:in `request'
  /usr/local/lib/site_ruby/mail_receiver/discourse_mail_receiver.rb:43:in `process'
  /usr/local/bin/receive-mail:13:in `<main>'Dec 21 22:42:52 forum-mail-receiver postfix/pipe[146]: 2E445379E48: to=<nobody@forum.[domain].co.nz>, relay=discourse, delay=60, delays=0.15/0.01/0/60, dsn=4.3.0, status=deferred (temporary failure)
Dec 21 22:45:45 forum-mail-receiver postfix/anvil[135]: statistics: max connection rate 1/60s for (smtp:209.85.216.54) at Dec 21 22:41:21
Dec 21 22:45:45 forum-mail-receiver postfix/anvil[135]: statistics: max connection count 1 for (smtp:209.85.216.54) at Dec 21 22:41:21
Dec 21 22:45:45 forum-mail-receiver postfix/anvil[135]: statistics: max cache size 2 at Dec 21 22:41:50

أنا عالق حقًا الآن، هل لدى أي شخص أي أفكار حول ما قد يسبب هذا؟ :grinning_face_with_smiling_eyes:

دووه! نعم. لقد اختلط عليّ أمر TLS و https.

لم ينجح هذا على الإطلاق، لا يتم تمرير أي رسائل بريد إلكتروني من mail-receiver إلى Discourse.

هل يمكنني “التراجع” عن mail-receiver إلى البداية (إعادة تعيينه بالكامل) والبدء من جديد، على أمل أن ينجح الأمر؟
كيف يمكنني فعل ذلك؟

يمكنك فقط تعديل الملف وإعادة بناء حاوية البريد.

شكراً على النصيحة بخصوص جدار الحماية! لقد واجهت أيضاً مشاكل مشابهة لمشاكل @MathiasFoster، حيث لم يتمكن حاوية mail-receiver من الوصول إلى موقع المنتدى في حاوية app. كان الأمر محيراً في البداية، بما أن الحاويات مسموح لها بالاستماع إلى العالم الخارجي دون مشاكل.

أنا أيضاً أستخدم Vultr كمزود خدمة الخادم الافتراضي الخاص بي مع صورة نظام التشغيل Ubuntu الخاصة بهم. يبدو أن بعض التوليفات بين إعدادات صورة نظام التشغيل الافتراضية بالإضافة إلى Docker تمنع بالفعل الاتصال عبر الحاويات.

على أي حال، في حالتي، كان كافياً السماح بـ HTTPS على المضيف:

$ ufw allow https

بعد ذلك، تمكن mail-receiver من إرسال البريد كما هو متوقع.

إعجاب واحد (1)