لدينا مشكلة غريبة مع خادم Discourse الخاص بنا. منذ عدة أسابيع، كان استلام البريد الإلكتروني من خادم POP3 الداخلي يعمل دون أي مشاكل. في 16 فبراير، توقف استقبال البريد الإلكتروني فجأة. بشكل غريب، نرى نشاطًا من Discourse في ملفات السجل الخاصة بخادم POP3:
Feb 25 13:54:49 mailout popa3d[12458]: Authentication passed for discourse
Feb 25 13:54:49 mailout popa3d[12458]: 1545 messages (12060237 bytes) loaded
Feb 25 13:54:49 mailout popa3d[12458]: 0 (0) deleted, 1545 (12060237) left
ومع ذلك، لا تتم معالجة رسائل البريد الإلكتروني الجديدة.
نحن نستخدم أحدث إصدار من Discourse وهو 2.7.0.beta4 (منذ اليوم، بينما كان الإصدار السابق هو 2.7.0.beta3). هذه هي إعدادات البريد الإلكتروني لدينا:
انتقل إلى خادم البريد الإلكتروني، واحذف جميع الرسائل الموجودة هناك. بالطبع، يجب أن يكون هناك طريقة للحفاظ على الرسائل التي ترغب في الاحتفاظ بها…
ثم انتظر حتى يقوم Discourse بجلب الرسائل عبر بروتوكول POP3 مرة أخرى.
هذا الحل يعمل معي الآن وتبدأ الرسائل في الظهور مرة أخرى.
أشك في أن عداد معرف البريد الإلكتروني الداخلي قد تعطل أثناء تحديث الإصدار الأخير. @codinghorror ربما يكون مضبوطًا على رقم كبير جدًا، مما يجعل جميع الرسائل تُعتبر “مقروءة مسبقًا” أو شيء مشابه…
إذا لم أحذف جميع الرسائل الموجودة مسبقًا، فإن الرسائل الجديدة تتراكم فقط.
حدث أحدث تغيير في استعلام POP3 في يناير. FIX: Do not process pop3 mails > 1 week old (#11740) · discourse/discourse@5710d5d · GitHub هذا بحد ذاته لا ينبغي أن يمنع Discourse من الاستعلام، لكن من الممكن أن يؤدي بريد وارد إلى استثناء. لا يوجد معالجة للأخطاء في الكود الجديد… @jzedlitz هل لا تزال تواجه المشكلة وتود المساعدة في تحديد سببها؟ هل توجد أخطاء ذات صلة في /logs؟ هل ترى خطأ في /sidekiq/scheduler عند البحث عن Jobs::PollMailbox؟ هل ترى خطأ عند الاستعلام يدويًا في وحدة تحكم Rails؟ ./launcher enter app rails c Jobs::PollMailbox.new.execute({})
نعم، هذا هو طلب السحب (PR) الذي ربط به @gerhard في POP3 email polling stopped working - #6 by gerhard. لا أعتقد أن هذا يجب أن يكسر أي شيء. سأحتاج إلى رسالة البريد الإلكتروني الأصلية بالكامل للاختبار. هذا هو التغيير الرئيسي في الكود:
def mail_too_old?(mail_string)
mail = Mail.new(mail_string)
date_header = mail.header['Date']
return false if date_header.blank?
date = Time.parse(date_header.to_s)
date < 1.week.ago
end
لذا، أعتقد أنه ربما قد يكون هناك خطأ صامت إذا فشل Time.parse؟ بما أننا لا نحاول حتى القيام بأي شيء إذا كان رأس البريد Date مفقودًا.
عذراً على التأخر في الرد. لقد قمنا بحل المشكلة إلى حد كبير عن طريق تفريغ صندوق البريد POP3 الخاص بـ Discourse. فوراً، استطاع Discourse استلام الرسائل مرة أخرى. لقد نقلت بعض الرسائل الأحدث إلى صندوق البريد الفارغ الآن، وتمت معالجتها أيضاً. ومع ذلك، بمجرد أن وضعت بعض الرسائل الأقدم البالغ عددها 1,400 رسالة في صندوق البريد، توقف Discourse عن معالجة أي رسائل.
لقد صادفتُ المشكلة نفسها للتو. لاحظتُ أن هناك شيئًا غير طبيعي عندما كان من المفترض أن تُنشئ الرسائل البريد الإلكتروني. كانت صندوق البريد POP3 يحتوي على بضع رسائل بريد إلكتروني (أدير مثيلًا صغيرًا). يبدو أن وضع الرسائل واحدة تلو الأخرى قد حلّ المشكلة، وأعتقد أنها تعمل بشكل أفضل الآن، لكن عليّ الانتظار قليلًا للتأكد من ذلك.
للأسف، تكررت المشكلة. باستخدام formail، قمت بتقسيم صندوق البريد إلى رسائل فردية وأدخلتها واحدة تلو الأخرى إلى حساب POP3. تم معالجة بعض الرسائل (حتى القديمة منها) بواسطة Discourse، بينما لم تتم معالجة أخرى.
هل توجد طريقة لتفعيل رسائل سجل أكثر من Jobs::PollMailbox.new.execute({}) لمعرفة سبب تجاهل رسالة معينة؟
أي ملف سجل بالتحديد؟ لقد جربت tail -f /var/discourse/shared/standalone/log/rails/*.log لكن لا تظهر أي رسائل بينما يحاول Discourse جلب رسائل البريد الإلكتروني.
هل يمكنك تطبيق التغييرات التالية على app/jobs/scheduled/poll_mailbox.rb داخل حاوية Docker قبل تنفيذ Jobs::PollMailbox.new.execute({}) في وحدة تحكم Rails؟
pop3.start(SiteSetting.pop3_polling_username, SiteSetting.pop3_polling_password) do |pop|
+ mail_string = nil
pop.each_mail do |p|
+ mail_string = nil
mail_string = p.pop
break if mail_too_old?(mail_string)
process_popmail(mail_string)
p.delete if SiteSetting.pop3_polling_delete_from_server?
+ rescue => e
+ puts e.message
+ puts e.backtrace.join("\n\t")
+ puts "", "MESSAGE:", mail_string if mail_string
end
end
نعم، كنت أشك في ذلك، لكن سيكون من المثير للاهتمام معرفة أي بريد إلكتروني منع دالة mail_too_old? من العمل. هل كان قديمًا حقًا؟ هل فشل في تحليل البريد الإلكتروني؟ أم شيء آخر؟ يمكنك إرسال البريد الإلكتروني الذي كان يعيق عمل POP3 لي عبر الرسائل الخاصة إذا رغبت.