محلل Discourse doctor لا يعمل مع بيانات اعتماد SMTP (بالإضافة إلى عدم عمل البريد الإلكتروني لتسجيل المسؤول)

حسنًا، للبدء، هذا بيئة إنتاجية، ولا يمكنني إرسال بريد التسجيل الأول.

أنا متأكد من أن إعدادات SMTP الخاصة بي صحيحة.
أستطيع عمل ping و telnet لخادم البريد الخاص بي باستخدام المنفذ المستخدم، ولكن بمجرد أن أقوم بـ “EHLO mailserver” يتم إغلاق الاتصال من قبل المضيف البعيد.

في نهاية سجلاتي، يُذكر:

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 32)
Delivered mail f3853b94-b772-48c2-b1b7-a78bbcbfc5c1@discourse.mywebsite.com (60177.6ms)
Job exception: Net::ReadTimeout

وحاولت التأكد من صحة إعدادات SMTP الخاصة بي، لذا شغّلت /var/discourse/discourse-doctor، لكنه لا يمكنه التحقق من إعداداتي. يقول:

==================== YML SETTINGS ====================
awk: not an option: --field-separator=:
DISCOURSE_HOSTNAME=
awk: not an option: --field-separator=:
SMTP_ADDRESS=
awk: not an option: --field-separator=:
DEVELOPER_EMAILS=
awk: not an option: --field-separator=:
SMTP_PASSWORD=
awk: not an option: --field-separator=:
SMTP_PORT=
awk: not an option: --field-separator=:
SMTP_USER_NAME=
awk: not an option: --field-separator=:
LETSENCRYPT_ACCOUNT_EMAIL=

لكن ملف YAML الخاص بي (./containers/app.yml) يبدو منسقًا بشكل مثالي.

  ## TODO: The SMTP mail server used to validate new accounts and send notifications
  # SMTP ADDRESS, username, and password are required
  # WARNING the char '#' in SMTP password can cause problems!
  DISCOURSE_SMTP_ADDRESS: mail.redacted.com
  DISCOURSE_SMTP_PORT: 465
  DISCOURSE_SMTP_USER_NAME: redacted@redacted.com
  DISCOURSE_SMTP_PASSWORD: "redacted"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)

  ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
  LETSENCRYPT_ACCOUNT_EMAIL: redacted@redacted.com

يبدو أن هذا شيء يحتاج إلى حل. هذا يتوافق مع خطأ الشبكة الذي وصفته.

أعتقد أن الأحرف الخاصة في كلمة المرور الخاصة بك تُربك أداة Discourse-doctor.

يبدو أن هذا العنوان ليس عنوان SMTP.
أعتقد أن “mail.redacted.com” هو عنوان HTTP.
أظن أنك بحاجة إلى التحقق منه.

@irwinstar، قمت بإزالة خادم البريد الفعلي تجنبًا لكشف خادم بريدي على منتدى عام. لكنني أستطيع أن أضمن صحته لأنني نسخت الإعدادات من عميل بريدي (يعمل بشكل صحيح) وقارنتها أيضًا بإعدادات SMTP الخاصة بخادم بريدي الفعلي.

شكرًا لك على عرضك للمساعدة. أعتقد أن المشكلة تكمن في سجلات SPF/DKIM، لذا أنا أحاول إصلاحها.

ومع ذلك، يجب أن يستمر discourse-doctor في تحليله بشكل صحيح. لست متأكدًا مما يحدث هناك، حيث لم أقوم أنا بتعديل الملف بنفسي باستخدام vim/nano. للتوضيح، تم إنشاء ملف YAML باستخدام discourse-setup.

وأعتقد أن Discourse لا يدعم البروتوكول على المنفذ 465 حاليًا. إذا كان خادم البريد الخاص بك يدعم المنفذ 587، فيمكنك تغييره إلى 587 بدلاً من ذلك. للأسف، لا يمكن لخادم بريدي استخدام المنفذ 587، لذا أضفت وكيل بريد خارجي لـ Discourse.

@irwinstar، هذه معلومات بالغة الأهمية إذا كانت صحيحة، وهي ستفسر سبب عدم عمل إعدادات بريدي الإلكتروني. هل لديك مصدر لهذه المعلومات؟

لست متأكدًا بشأن ذلك، لكنني جربت المنفذ 465 عدة مرات.
في النهاية، استخدمت صورة Docker “hieulq/mailproxy” كوكيل بريد.
واستخدمت إعدادات app.yml هذه لـ Discourse.
قد يبدو هذا الاستخدام غير مثالي، لكنه يعمل.
حاولت اليوم العثور على إضافة بريد، لكنني لم أعثر على أي منها.

  DISCOURSE_SMTP_ADDRESS: x.x.x.x
  DISCOURSE_SMTP_PORT: 2525
  DISCOURSE_SMTP_AUTHENTICATION: none
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
  DISCOURSE_SMTP_ENABLE_START_TLS: false

مرحبًا @simbleau

تجربتي هي أن SendGrid تعمل بشكل جيد (المنفذ 587).

يمكنك أيضًا تجربة SendGrid مجانًا!

نقدر الاقتراحات.

أحاول تجنب شراء أي خوادم بريد سحابية، أو استخدام الوكلاء (لأنه لو أردت حلاً غير نظيف، لكنت أخذت حساب مسؤول في هذه المرحلة) بينما لدي بالفعل خادم بريد على HostGator.

أنا متأكد من أن سجلات SPF مُعدة لعنوان IP الخاص بخادم Discourse الخاص بي. أنا أحاول فقط التحقق من سجلات DKIM الآن.

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

لقد حققت بعض التقدم في عملية التثبيت.

باستخدام المنفذ 587، يمكنني الاتصال عبر telnet بنجاح لإرسال بريد إلكتروني كامل والمصادقة بشكل صحيح. لذا قمت بالتبديل.

الآن، عند إرسال البريد الإلكتروني، أستلم الخطأ التالي:

تم تسليم البريد d86b48cc-b0f4-4df3-8960-ab5ff96613a0@discourse.imbleau.com (251.0ms)
استثناء المهمة: اسم المضيف "mail.redacted.com" لا يطابق شهادة الخادم

لكن ما لاحظته هو أن هذا لم يعد خطأً في مهلة الاتصال (الذي يُثار بعد 60 ثانية كاملة)، بل هو استثناء مختلف يتم استلامه خلال 250 مللي ثانية.

هذا على الأرجح لأنني استخدمت عنوان بريد إلكتروني هو system@discourse.redacted.com، لكن هذا العنوان يستخدم داخليًا mail.redacted.com كخادم بريد.

أنا لست متأكدًا من كيفية إصلاح هذا، بصراحة. جربت ما يلي:

./launcher enter app
rails r "SiteSetting.notification_email = 'system@mail.redacted.com'"
exit

ثم إعادة البناء، لاستخدامه لمرة واحدة فقط. لا يزال دون جدوى. نفس الخطأ.

تم إصلاح مشكلة البريد الإلكتروني! (لا يزال discourse-doctor يحلل بشكل غير صحيح)

بحثتُ أكثر قليلاً عن لغة Ruby ولماذا حدث هذا الخطأ في الخلفية، مما قادني إلى هذه المشكلة على Stack Overflow

كان هذا هو السبب. تضمن الحل تغيير مفاوضة SSL، مما منحني الحدس لتعطيل هذا الإعداد في ملف app.yml
DISCOURSE_SMTP_ENABLE_START_TLS: false # (اختياري، الافتراضي true)

بعد ذلك، نجاح!

سيؤدي هذا إلى تعطيل تشفير TLS، بينما المشكلة “الوحيدة” هي أنك تستخدم اسم مضيف غير صحيح، أي أن خادم البريد يعرض شهادة تقول شيئًا آخر غير mail.redacted.com. تميل العديد من خوادم البريد إلى أن تكون معروفة بأسماء مضيف متعددة مختلفة، كل ما عليك فعله هو معرفة الاسم الذي تستخدمه لشهادتها.

يمكنك محاولة معرفة الاسم الذي تعلنه نفسه وضبط تكوينك وفقًا لذلك.

echo | openssl s_client -connect mail.redacted.com:587 -starttls smtp -servername mail.redacted.com 2>/dev/null |openssl x509 -noout -subject

إذا لم ينجح ذلك، يمكنك ترك تشفير TLS مفعّل وتعطيل التحقق من الشهادة فقط:

DISCOURSE_SMTP_ENABLE_START_TLS: true
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: false

شكرًا لك @RGJ! غريبًا، إنه يقول إن اسم النطاق هو أحد نطاقاتي الفرعية، ولا علاقة له بالبريد على الإطلاق. يستحق ذلك التحقيق. شكرًا لك على التوجيه.

سيحصل جميع مستخدميك على نفس المعلومات.

إذا شاركتني ملف app.yml بشكل خاص، فسأحاول معرفة ما الذي يُربك discourse-doctor.

تم الإرسال. جرّب حلها.

أوه. المشكلة هي أن لديك إصدارًا من awk غير GNU awk، ويُسمى خيار --field-separator باسم آخر في awk الخاص بك.

ما هو إصدار awk الذي تملكه؟ وما هو نظام التشغيل الذي تعمل عليه؟

أمر man awk يخبرني بـ Version 1.3.4 2019-12-31 MAWK(1)

أمر cat /etc/os-release يخبرني بـ:

~$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

هل يمكنك تجربة تعديل discourse-doctor واستبدال --field-separator بـ -F؟

يبدو أن هذا سيحل المشكلة. إذا تأكدت من ذلك، سأقوم بتقديم طلب سحب (PR).

نجح الأمر جزئيًا. اختفى الخطأ لكنه توقف عن إرجاع أي شيء.

==================== إعدادات YML ====================
DISCOURSE_HOSTNAME=
SMTP_ADDRESS=
DEVELOPER_EMAILS=
SMTP_PASSWORD=
SMTP_PORT=
SMTP_USER_NAME=
LETSENCRYPT_ACCOUNT_EMAIL=

لقد حللت المشكلة.

في discourse-doctor، غيّر السطر 213 إلى ما يلي:

  read_config_result=$(echo $config_line | awk  -F ":" '{print $2}')

يعمل هذا لأن mawk لا يحب -F=":"، بل يتطلب حرفياً مسافة بدلاً من ذلك مثل -F ":". :roll_eyes:

تم فتح طلب دمج (PR): Changed awk config command to be more cross platform by nuzzles · Pull Request #513 · discourse/discourse_docker · GitHub