تهيئة البريد الإلكتروني الوارد بالتسليم المباشر للمواقع المستضافة ذاتيًا باستخدام Mail-Receiver

مرحباً! لدي مشكلة غريبة حيث قمت بإعداد هذا باتباع الدليل، وهو يعمل بشكل رائع! ومع ذلك، حدث خطأ ما في البريد الإلكتروني الصادر، والذي اعتقدت أنه لن يتأثر بأي من هذا. يعطي Sidekiq الخطأ التالي لكل محاولة بريد إلكتروني (كلها عالقة في قائمة المحاولات) منذ تشغيل mail-receiver:

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

تشير عمليات البحث التي أجريتها إلى أن هذا مرتبط بـ TLS بطريقة ما. لقد قمت بإلغاء التعليق على الأسطر المتعلقة بـ TLS في ملف .yml، لكن إعادة التعليق عليها لم تحل المشكلة أيضًا. لقد جربت التعليمات الموجودة في الدليل لحل تعارضات Postfix، ولكن يبدو أنني لا أملك Postfix؟ (الدليل /etc/postfix غير موجود في نسختي، كما أنه لا يتعرف على postfix كخدمة.) ووفقًا لنتائج netstat، فإن docker-proxy فقط هو الذي يستخدم المنفذ 25.

نحن نستخدم Gmail كخدمة SMTP الصادرة، وفي الواقع كنا نستخدم Gmail لاستطلاع POP3 الوارد قبل هذا. لقد حذفت مجموعة من سجلات MX التي تشير إلى Google، لكن الدليل قال أن أفعل ذلك.

هذا هو ملف 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


  ## عنوان URL الأساسي لهذا مثيل Discourse.
  ## سيكون هذا هو عنوان URL الخاص بموقع Discourse الخاص بك. على سبيل المثال،
  ## https://discourse.example.com. إذا كنت تقوم بإعداد مجلد فرعي،
  ## تأكد من حساب ذلك (أي https://example.com/forum).
DISCOURSE_BASE_URL: 'https://discourse.[mydomain].org'

  ## مفتاح API الرئيسي لمنتدى Discourse الخاص بك. يمكنك الحصول عليه من
  ## علامة التبويب "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 الخاصة بنا. بمجرد تجاوز هذا الارتباك، اتضح كل شيء.

إنه بالتأكيد خطئي السخيف، لكن الدليل ساهم في ارتباكي قليلاً مع هذا:

ليس من الواضح جدًا أن الإدخالين forum.example.com لا يجب أن يكونا متطابقين، وفي حالتي كانا بحاجة إلى أن يكونا مختلفين. قد يكون هذا شيئًا يجب أن يكون الأشخاص الذين يستخدمون هذا الدليل على دراية كافية به، لكنني لم أكن كذلك. لذلك أترك هذا هنا لأي شخص آخر قد يواجه مشكلة مماثلة. لقد تعلمت بعض الأشياء عن DNS لم أكن أعرفها، لذا كانت هذه تجربة تعليمية جيدة، وكل شيء يعمل بشكل رائع الآن. :slight_smile:

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

تحتوي سجلات mail-receiver الخاصة بي بشكل أساسي على ثلاثة أنواع من الإدخالات. الإدخال الناجح، والذي كان ردًا عبر البريد الإلكتروني على منشور موجود، يبدو كالتالي:

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

بخلاف ذلك، هناك نوعان من الأخطاء (التي أفترض أنها كذلك)، وكل منهما يتكرر كثيرًا. الأول يبدو كالتالي:

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 denied يشير إلى أن discourse.[domain].org ربما لا يكون النطاق المستخدم لـ MAIL_DOMAIN في mail-receiver.yml. ربما يُسمح لعنوان الرد بالمرور بوسائل أخرى.

أعلم أن ما يُستخدم في MAIL_DOMAIN ينتهي به الأمر في مكان واحد على الأقل في ملف تكوين postfix لذا فإن تغييره قد يتطلب إعادة بناء الحاوية. هل قمت بتغيير MAIL_DOMAIN وإذا كان الأمر كذلك، فهل قمت بتشغيل ./launcher rebuild mail-receiver بعد ذلك؟

إعجابَين (2)

[عذرًا على الضغط على Enter عن طريق الخطأ قبل إنهاء مشاركتي السابقة]

ما زلت أواجه هذه المشكلة. ولكن لدي فكرة جديدة حول ما قد تكون المشكلة. أعمل مع نطاقين، لنسميهما [domain1] و [domain2]. يتم استضافة خادم البريد الصادر الخاص بـ Gmail الخاص بي على [domain1]. تتم استضافة مثيل Discourse الخاص بي، وكذلك mail-receiver الخاص بي، على [domain2].

كيف أقوم بتعيين إعداد reply-by-email-address في Discourse لإجبار عنوان الرد في [domain2]، عندما يتم إرسال البريد الإلكتروني من [domain1]؟ أحصل على خطأ SSL EOF المذكور أعلاه عند محاولة القيام بذلك. أفترض أن هناك بعض الحيل في مصادقة DNS أو شيء ما أفتقده.

يبدو أنني توصلت أخيرًا إلى حل لهذه المشكلة. لكي يكون عنوان “الرد على” في نطاق مختلف عن وكيل SMTP، كان عليّ تخفيف بعض الإعدادات في Google Workspace. يبدو أن كل شيء يعمل كما هو مقصود في كلا الاتجاهين.

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

سؤال أخير هنا. على الرغم من أن كل شيء يعمل بشكل صحيح الآن، لا يزال لدي مجموعة من الإدخالات القديمة في mailq. هذه على الأرجح رسائل بريد إلكتروني تم إنشاؤها بالإعدادات الخاطئة وبالتالي ستظل عالقة إلى الأبد. أفضل حذفها والمضي قدمًا. لذا، كيف أقوم بمسح mailq؟

منشور قديم بعض الشيء، ولكن ربما يكون السبب الأكثر شيوعًا لخطأ SSL EOF هو التعارض بين إصدارات OpenSSL: v1.1.1f مقابل v3. ترقية الإصدار القديم 1.1.1f سيكون هو الحل. والأخبار السيئة هي أنه على سبيل المثال، لا يمكن لنظام Ubuntu 20.x استخدام إصدار أحدث، لذلك يجب ترقية نظام Ubuntu بأكمله.

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

لقد نفدت حيلتي في هذا الأمر، بعد قضاء ساعات. لا يبدو أنني أستطيع تجاوز خطأ المشغل هذا، على الرغم من أن أسماء ملفات التكوين الخاصة بي كلها بأحرف صغيرة.

“خطأ: يجب ألا يحتوي اسم التكوين على أحرف كبيرة أو مسافات أو أحرف خاصة. قم بتصحيح اسم التكوين وأعد تشغيل ./launcher.”

أثناء تشغيل

./launcher rebuild mail-receiver

أو

./launcher bootstrap mail-receiver

أو

./launcher start mail-receiver

يمكنني رؤيته هنا في قاعدة كود المشغل

غرررررررر – الرجاء المساعدة!

جربت كل شيء في المنشور المرتبط أعلاه المتعلق باللغة المحلية، وكل شيء آخر استطعت العثور عليه.

./launcher rebuild app ___ تعمل جميعها بشكل جيد!

لدي دليل محتمل واحد: بدأ هذا يحدث فورًا بعد أن ضغطت عن طريق الخطأ على مفتاح CapsLock (ولكن قمت بتمييز حرفين فقط) أثناء تسمية ملف التكوين، والذي قمت بعد ذلك بتعطيل CapsLock فورًا وأعدت كتابة الحرفين قبل حفظه حتى.
من الصعب تخيل كيف يمكن أن يكون هذا الخطأ المطبعي/التصحيح القصير قد تسبب في ذلك، ولكن ربما تكون الأحرف الكبيرة عالقة في مخزن مؤقت في مكان ما، أو؟؟؟

إنه يتجاوز معرفتي بكثير، لكنني متفاجئ من أن رسالة الخطأ لا تعرض المتغير $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. لقد كان الأمر ممتعًا وتعلمت الكثير.

الوصفة التي توصلت إليها أخيرًا هي استخدام ملف mail-receiver.yml (حاوية docker) مقترن بكل مثيل من Discourse، وكلها تشترك في المنفذ 25 باستخدام ميزة النقل في postfix للتعامل مع التوجيه.

إعجابَين (2)

على الخادم المخصص الخاص بي (يعمل بنظام Ubuntu 22.04، مع تثبيت Postfix) أستخدم ملف mail-receiver.yml منفصلًا مقترنًا بكل مثيل من Discourse حيث قمت بتمكين ميزة نشر البريد.

ينشئ هذا الإعداد حاوية منفصلة لكل مثيل من Discourse على الخادم الخاص بي (إلى جانب حاوية app النموذجية) والتي تستقبل وتعالج رسائل البريد الإلكتروني لمثيل Discourse المقابل لها.

يتم استقبال رسائل البريد الإلكتروني الواردة لجميع منتديات Discourse على الخادم بواسطة Postfix عبر المنفذ القياسي 25، حيث يستخدم ملف تكوين Postfix الرئيسي “خريطة نقل” (transport map) لإعادة توجيه كل بريد إلكتروني إلى منتدى Discourse المقصود عن طريق تحليل اسم النطاق في عنوان البريد الإلكتروني “إلى:” (To:).

لذلك، بالإضافة إلى التعليمات الواردة في هذا الموضوع، قمت بما يلي:

  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 إعجابات

لا يوجد DISCOURSE_MAIL_ENDPOINT في mail-receiver.yml، وهناك أيضًا DISCOURSE_BASE_URL للتغيير.

إعجابَين (2)

أستخدم خدمة إعادة توجيه بريد إلكتروني تدعم إعادة توجيه رسائل البريد الإلكتروني بتنسيق JSON إلى خطاف ويب.

هل هذا خيار للتسليم المباشر للبريد الإلكتروني؟

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