بعض السياق هنا: Emails have stopped sending - end of file reached
قبل حوالي أسبوع (13 يناير 2021)، بدأت رسائل البريد الإلكتروني في الفشل عند الإرسال عبر خادم Google’s smtp-relay.gmail.com (وهو استخدام مسموح به ومقصود لمستخدمي Google Apps).
أبلغ Sidekiq عن الفشل مع أخطاء EOFErrors:
Jobs::HandledExceptionWrapper: Wrapped EOFError: end of file reached
كما أبلغت سجلات /logs عن المهام الفاشلة أيضًا:
Job exception: end of file reached
متوفر تتبع الأخطاء (Backtrace) في المنشور الآخر.
===================
كشفت التحقيقات أن تثبيتات Discourse المحدثة تتصل بخوادم SMTP الوسيطة باستخدام ‘EHLO localhost’ - وقد بدأ Google في رفض هذه الطلبات منذ حوالي أسبوع.
من tcpdump على نسخة إنتاجية:
0x0030: d10f f8e4 4548 4c4f 206c 6f63 616c 686f ....EHLO.localho
0x0040: 7374 0d0a st..
...
0x0030: de62 f0c3 3432 3120 342e 372e 3020 5472 .b..421.4.7.0.Tr
0x0040: 7920 6167 6169 6e20 6c61 7465 722c 2063 y.again.later,.c
0x0050: 6c6f 7369 6e67 2063 6f6e 6e65 6374 696f losing.connectio
0x0060: 6e2e 2028 4548 4c4f 2920 6a31 3673 6d34 n..(EHLO).j16sm4
0x0070: 3831 3932 3976 736d 2e31 202d 2067 736d 81929vsm.1.-.gsm
0x0080: 7470 0d0a tp..
ومحاكاة الأمر عبر telnet تعطي نفس النتيجة:
root@conversation:~# telnet smtp-relay.gmail.com 587
Trying 74.125.137.28...
Connected to smtp-relay.gmail.com.
Escape character is '^]'.
220 smtp-relay.gmail.com ESMTP ls8sm507258pjb.6 - gsmtp
ehlo localhost.localdomain
421 4.7.0 Try again later, closing connection. (EHLO) ls8sm507258pjb.6 - gsmtp
Connection closed by foreign host.
ومع ذلك، فإن استخدام ehlo محدد بالنطاق يعمل بشكل صحيح:
root@conversation:~# telnet smtp-relay.gmail.com 587
Trying 74.125.137.28...
Connected to smtp-relay.gmail.com.
Escape character is '^]'.
220 smtp-relay.gmail.com ESMTP p10sm668563uaw.3 - gsmtp
ehlo conversation.sevarg.net
250-smtp-relay.gmail.com at your service, [64.227.96.27]
250-SIZE 157286400
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
======
بناءً على السجلات، حددت الملف الذي يجب تعديله لاختبار الإصلاح (داخل صورة Docker):
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mail-2.7.1/lib/mail/network/delivery_methods/smtp.rb
بتغيير
DEFAULTS = {
:address => 'localhost',
:port => 25,
:domain => 'localhost.localdomain',
إلى
DEFAULTS = {
:address => 'conversation.sevarg.net',
:port => 25,
:domain => 'conversation.sevarg.net',
تم حل المشكلة (بعد إعادة تشغيل النسخة). الآن يتم إرسال EHLO مع سلسلة النطاق، وتُرسَل رسائل البريد الإلكتروني بشكل صحيح من نسختي.
================
السلوك المطلوب: عند إرسال البريد الإلكتروني، يستخدم التثبيت الافتراضي لـ Discourse اسم النطاق المُهيأ للاتصال الأولي بخادم SMTP. بديلاً عن ذلك، توجد خيار إعداد لتجاوز النطاق المُرسل. إذا كان هذا الخيار موجودًا، فلم أتمكن من العثور عليه عبر البحث.