دعم IMAP لصناديق البريد الجماعية

:rotating_light: سنقوم بإزالة دعم IMAP في Discourse. راجع هذا المنشور للحصول على التفاصيل: IMAP support for group inboxes - #39 by martin . :rotating_light:


يسعدنا تقديم النسخة التجريبية (Alpha) من دعم IMAP لصناديق الوارد الجماعية. تتيح هذه الميزة إدخال بيانات اعتماد IMAP وإعداداتها على أساس كل مجموعة على حدة لمزامنة صناديق الوارد الجماعية مع صندوق بريد إلكتروني. :email:

:warning::warning: :warning:

هذه ميزة في مرحلة تجريبية (Alpha)، وبالتالي فهي غير مكتملة أو مصقولة بنسبة 100%. من المرجح جدًا أن تكون معطلة، ولا نقوم بصيانتها حاليًا أو استخدامها في الإنتاج. استخدمها على مسؤوليتك الخاصة!

:warning: :warning: :warning:

الفوائد

  • يمكن لمجموعتك البدء فورًا باستخدام صناديق الوارد في Discourse، لأن جميع بريدك الإلكتروني الحالي سيتم مزامنته! :running_woman:
  • يمكن لمجموعتك مزامنة رسائلها بين Discourse ومزود البريد الإلكتروني الخاص بك، بحيث لا توجد نقطة فشل واحدة. يمكن للأشخاص الرد من حساب البريد الإلكتروني أو من داخل Discourse، وستتم مزامنة كل شيء :zap:
  • لن تحتاج بعد الآن إلى إعداد قواعد إعادة توجيه غريبة من مزود البريد الإلكتروني الخاص بك إلى صندوق الوارد الوارد في Discourse. :arrow_right:
  • سيتم مزامنة تسميات البريد الإلكتروني مع وسوم Discourse لتبقى الأمور منظمة ومرتبة :card_file_box:
  • ستقوم بالرد على الأشخاص الذين يرسلون بريدًا إلكترونيًا إلى مجموعتك من عنوان البريد الإلكتروني الذي قمت بإعداده، حتى لو قمت بالرد من Discourse. لا مزيد من الارتباك! :relieved:

الميزات

  • سيتم مزامنة جميع الرسائل الواردة والصادرة بين خادم IMAP وDiscourse، مع إنشاء المواضيع ورسائل الرد المناسبة بناءً على تحليل البريد الإلكتروني. يمكن إنشاء الردود من Discourse أو من خادم IMAP وسيتم مزامنة كل شيء!
  • يمكن الرد على الرسائل الإلكترونية من صندوق الوارد الجماعي في Discourse أو من حساب البريد الإلكتروني.
  • سيتم إنشاء الوسوم المطبقة على موضوع Discourse كتسميات (Labels) وتطبيقها على البريد الإلكتروني على خادم IMAP (وهذا يعتمد على المزود).
  • سيتم أرشفة الرسائل الإلكترونية المؤرشفة على خادم IMAP في صندوق الوارد الجماعي.
  • سيتم أرشفة مواضيع الرسائل الخاصة الجماعية المؤرشفة في Discourse على خادم IMAP.
  • سيتم حذف المواضيع في صندوق الوارد الجماعي عند حذف الرسائل الإلكترونية على خادم IMAP.
  • سيتم حذف مواضيع الرسائل الخاصة الجماعية على خادم IMAP عند حذفها في Discourse.
  • ستحتوي الرسائل الإلكترونية المرسلة من المجموعات المفعلة لهذه الميزة على عنوان “رد إلى” (Reply-to) مضبوط على نفس اسم مستخدم البريد الإلكتروني الذي تم إعداده في إعدادات IMAP.

البدء

أولاً، هناك بعض إعدادات الموقع التي يجب عليك تكوينها قبل إعداد هذه الوظيفة في مجموعة.

  • يجب تفعيل enable imap و enable smtp معًا. يُستخدم IMAP للمزامنة مع خادم البريد الخاص بك، ويُستخدم SMTP لإرسال رسائل البريد الإلكتروني من خادم البريد الخاص بك.
  • tagging enabled و allow staff to tag pms - يجب تفعيل كليهما، حيث تطبق مزامنة التسميات الوسوم على الرسائل الخاصة.
  • enable imap write - يجب تفعيله إذا كنت تريد أن تنعكس التغييرات التي تتم في Discourse على خادم البريد الخاص بك (مثل الوسوم، وأرشفة المواضيع، وحذف المواضيع).
  • enable imap idle - يسمح لنا بتلقي تحديثات مباشرة من خادم البريد الخاص بك IF كان خادم البريد الخاص بك يدعم IDLE. هذا يسرع بشكل كبير من انعكاس التغييرات في مزود البريد الإلكتروني الخاص بك إلى Discourse. يجب عليك تشغيل هذا الخيار (على سبيل المثال، يدعم Gmail ذلك). إذا كنت تريد جميع التفاصيل الدقيقة، يمكنك قراءة المزيد عنها في RFC الخاصة بـ IDLE.
  • imap polling period mins - إذا لم يتم دعم IDLE، فهذا هو عدد الدقائق التي ننتظرها قبل التحقق من خادم IMAP بحثًا عن التغييرات. وهو أيضًا الوقت الذي ننتظره بين إرسال التغييرات إلى خادم IMAP من Discourse إذا كان enable imap write مفعلاً. الحد الأدنى هو دقيقة واحدة.

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

  • imap polling old emails - الحد الأقصى لعدد رسائل البريد الإلكتروني القديمة (المعالجة) التي يتم تحديثها في كل مرة يتم فيها استجواب صندوق IMAP (0 للكل).
  • imap polling new emails - الحد الأقصى لعدد رسائل البريد الإلكتروني الجديدة (غير المعالجة) التي يتم تحديثها في كل مرة يتم فيها استجواب صندوق IMAP.
  • imap batch import email - الحد الأدنى لعدد رسائل البريد الإلكتروني الجديدة التي تثير وضع الاستيراد (يعطل تنبيهات المنشورات).

إذا كنت تريد مزامنة التسميات/الوسوم مع خادم IMAP، فيجب عليك تفعيل إعدادات الموقع tagging enabled و allow staff to tag pms.

بعد ذلك، يجب عليك الدخول إلى المجموعة التي تريد مزامنتها مع خادم IMAP الخاص بك وملء الإعدادات.

ستكون هذه الإعدادات خاصة بالمزود، راجع أدناه للحصول على مزيد من التفاصيل. بمجرد إدخال الإعدادات وبيانات الاعتماد، انقر فوق “حفظ التغييرات” وسنتحقق من صحة بيانات الاعتماد مقابل خوادم مزود IMAP. إذا نجح ذلك، سيتم ملء قائمة صناديق البريد، وعليك اختيار الصندوق الذي تريد مزامنته (الإرشادات حول هذا الأمر خاصة بالمزود أيضًا):

إذا لم تكن التحقق من صحة بيانات الاعتماد ناجحًا، فسيتم عرض رسالة خطأ على الصفحة. وللتوضيح، سيتم استخدام خادم SMTP المدخل لإرسال رسائل البريد الإلكتروني باسم الحساب المدخل تحت اسم المستخدم & كلمة المرور، وليس خادم SMTP الرئيسي المكون في Discourse للرسائل الجماعية.

أخيرًا، داخل ملف app.yml الخاص بك، ستحتاج إلى إضافة DISCOURSE_ENABLE_EMAIL_SYNC_DEMON: true داخل قسم env وتشغيل ./launcher rebuild. هذا سيمكن العامل الخلفي من البدء والبدء في مزامنة رسائل البريد الإلكتروني! :fireworks:

معلومات خاصة بالمزود

Gmail

  • :warning: يجب عليك إنشاء كلمة مرور تطبيق (app password)، وإلا ستحتاج إلى تشغيل “الوصول إلى التطبيقات الأقل أمانًا” والذي تتخلص منه Google في النهاية على أي حال. استخدم هذه الكلمة بدلاً من كلمة مرور حساب Gmail الخاص بك في إعدادات IMAP. راجع Sign in with app passwords - Gmail Help للحصول على مزيد من التفاصيل. :warning:
  • تأكد من استخدام هذه الإعدادات لـ SMTP و IMAP:
    • منفذ IMAP: 987
    • منفذ SMTP: 587
    • خادم IMAP: imap.gmail.com
    • خادم SMTP: smtp.gmail.com
    • استخدم SSL لكل من SMTP و IMAP
  • يُنصح بشدة (سيصبح قريبًا ميزة في واجهة المستخدم) بأن تقوم فقط بتحديد صندوق البريد “[Gmail]/All Mail” للمزامنة معه.
  • لا نقوم بحذف رسائل البريد الإلكتروني في Gmail فورًا، بل ننقلها فقط إلى صندوق المهملات عندما يتم حذف الموضوع في Discourse. ستأخذ وظيفة الحذف “30 يومًا” داخل Gmail زمام المبادرة من هناك.
  • ستؤدي الوسوم المطبقة على مواضيع Discourse إلى إنشاء تسميات (Labels) في Gmail وتطبيقها على سلاسل البريد الإلكتروني. التسميات في Gmail هي أيضًا صناديق بريد IMAP!

القيود

هذه ميزة في مرحلة تجريبية (Alpha)، وبالتالي فهي غير مكتملة أو مصقولة بنسبة 100%. لذلك، تنطبق القيود التالية حاليًا:

  • فقط Gmail مدعوم حاليًا كمزود IMAP. لدينا بعض وظائف IMAP العامة ولكن لا يُضمن عملها. Outlook Online هو هدفنا التالي الكبير للدعم.
  • إعادة إحياء رسائل البريد الإلكتروني المحذوفة من سلة مهملات Gmail وعكس حالتها في Discourse غير مستقر حاليًا.
  • :warning: لا يُنصح بتغيير صندوق المزامنة بعد مزامنة رسائل البريد الإلكتروني بالفعل، وقد يؤدي ذلك إلى العديد من المشاكل الغريبة. :warning:
  • يمكن مزامنة صندوق بريد واحد فقط لكل مجموعة.
  • التواصل بين المجموعات منطقة غير مستكشفة ولن يعمل بشكل جيد (على سبيل المثال، إرسال بريد إلكتروني إلى team@yoursite.com من support@yoursite.com إذا تم إعداد كل من هذه الرسائل لمجموعة مختلفة).

قد تكون هناك أيضًا مفاجآت خفية أخرى وحواف خشنة حيث أن هذه ميزة تجريبية.

ملاحظات & خارطة الطريق

نود الحصول على ملاحظات من أي شخص يستخدم هذه الميزة مع Gmail. سأكون أنا الشخص المسؤول عن معالجة أي أخطاء/مشاكل. تصحيح الأخطاء صعب قليلاً في الوقت الحالي لكنني أعمل على ذلك!

الأمور التالية التي سأعمل عليها:

  • تحسين تصحيح الأخطاء لتسهيل عرض سجلات IMAP وفهم الأشياء التي تذهب بشكل خاطئ.
  • تحسين واجهة البريد الإلكتروني للمجموعة للحد من صناديق البريد التي يمكن اختيارها من Gmail ولردع/منع تغيير صناديق البريد.
  • التحقق لمنع استخدام تفاصيل IMAP نفسها لمجموعات متعددة.
  • ربما تحسينات في كيفية تخزين إعدادات IMAP الجماعية وتجربة مستخدم أفضل للتحقق من صحة بيانات الاعتماد.
  • دعم Outlook.

حاليًا، بينما نعمل على حل المشاكل، هذه الميزة غير متاحة لعملائنا المستضافين.

شكر خاص :pray:

كل من @dan و @j.jaffeux هما المساهمان الرئيسيان في هذه الميزة الضخمة التي تم العمل عليها لفترة طويلة. بدون عملهما الرائع، لم أكن لأتمكن من جلب الميزة إلى هذه النقطة وإعلان هذا الخبر :tada:.

41 إعجابًا

This is at the same time fantastic news and terrible news. Let me explain. First is great news to see IMAP integration with Discourse groups, as it brings a number of useful solutions to group identity (using the correct original address), to facilitate multiple users using the same IMAP account (not well supported natively, e.g. no shared reading states), and it opens the path to ActivityPub inboxes… But it’s a terrible news because its implementation favors email giants who turned a federated service into a largely centralized system. I understand the attraction to work with large scale providers, but I hope IMAP standard will be preferred over provider-specific extensions so that any email provider will be supported once this feature reaches beta state.

Kudos for making this possible.

10 إعجابات

There is a big reason this feature is considered “alpha” :slight_smile:

The trouble with IMAP from what I have observed from the sidelines is the amount of “open to interpretation” we are stuck dealing with.

We certainly want to make this work with more providers, our internal itch favors the big Google cause the reality is that we use Google at Discourse so we wanted to solve our problem first.

PRs to make this work better with more providers are certainly welcome, in absence of them as time passes and we observe more desire to use this with other providers we shall build support.

17 إعجابًا

This is a fair criticism, like @sam said we focused on Gmail first because this is what we use so it is the most relevant for us. However I believe that our base “generic” provider, while certainly not nearly 100% compliant to the RFC and not feature complete, follows the IMAP protocol quite closely…see discourse/lib/imap/providers/generic.rb at main · discourse/discourse · GitHub. The only additions I think this will need are special handling of Archiving and Deleting. Deleting we currently just flag as \Deleted and send an EXPUNGE command, but I know certain email clients will let you choose to do this or send to a trash folder first then EXPUNGE etc. I am not sure what the Archiving standard is for IMAP. We have a specific Gmail provider class that overrides some of these generic methods.

If you have any suggestions on more “generic” IMAP servers/providers that I can test against that would be a great help, as Gmail has its own special snowflake handling of things and Gmail IMAP extensions.

Also, as Sam said, any PRs for improvement are welcome, otherwise we will cater to demand, which I am predicting will be Outlook next as another big use case for organizations wanting this kind of feature (Outlook has its own special snowflake rules…like Archive being a folder/mailbox and no label support).

12 إعجابًا

Looks very exciting, My firm recently switched from our own mailserver to G-Suite and this integration will make it much easier for us to respond to client queries and manage our progress trackers. I have one query for @martin though. It isn’t clear to me whether it would use gmail smtp to reply to messages received in group inbox or would it use the mass smtp configured to send emails on behalf of Discourse? I see that the plugin mentions gmail’s smtp as well but I still wanted clarity on this.

6 إعجابات

Gmail’s SMTP server is used to send the replies, as you are sending the replies on behalf of the email account used for IMAP syncing! I will add a note to this effect in the OP to clarify.

7 إعجابات

That’s actually brilliant. I can think of so many use cases for this. Kudos @martin @dan @j.jaffeux :raised_hands:

9 إعجابات

Quick update here. I merged these two PRs last week. First, the fix so that tagging does not need to be enabled for archiving and deleting to work:

https://github.com/discourse/discourse/pull/10426

Second, I am now writing all IMAP logs to the database for easier inspection. A job will be run daily to delete logs > 5 days old:

https://github.com/discourse/discourse/pull/10435

11 إعجابًا

This is super sweet! Thanks.

I should say, I had to create an application password in my google email account for discourse to get it to accept my username/password

5 إعجابات

Are you running 2-factor authentication on the Google end? If so, this is standard practice.

إعجابَين (2)

Yes. I believe it was required in order for me to create the app password (though I don’t remember for sure)

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

This is noted in the OP :wink: Otherwise you have to jump through crazy hoops to make your Gmail account accept “Less secure apps”. At some point we will need to support OAuth for Google as that looks like the way things are headed.

4 إعجابات

Oops! Did I mention that my reading comprehension skills suck? :woozy_face:

5 إعجابات

It’s okay! It is an important point so I moved it to the top of the Gmail list and added some warning indicators. Thank you for trying to let others know about this to save them trouble :slight_smile:

6 إعجابات

أحاول فهم سبب فشلي في مزامنة رسائل البريد مع خادم Dovecot IMAP (للأسف دون خبرة في Ruby أو Rails).

عند قراءة imap_sync_logs، يتعطل برنامج الاستيراد في حلقة تكرارية:

UIDVALIDITY = 1612565899 لا يطابق المتوقع 0، يتم إبطال ذاكرة التخزين المؤقت لـ IMAP وإعادة مزامنة رسائل البريد لصندوق الوارد INBOX

لذلك أتساءل، ألا ينبغي تحديث @group.imap_uid_validity في هذه الحالة:

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

لا يدعم Dovecot 'LABELS' في:

مما يؤدي إلى خطأ Net::IMAP::BadResponseError، والذي للأسف لا يظهر في السجلات.

والآن أتساءل:

  • ما إذا كان دعم Dovecot للعلامات المخصصة كافياً للمزامنة ثنائية الاتجاه مع Discourse
  • كيفية اكتشاف Dovecot في lib/imap/providers/detector.rb
  • كيفية محاكاة ميزة الملصقات في مورد Dovecot

5 إعجابات

لا يزال مزامنة IMAP لصناديق البريد الجماعية ميزة في مراحلها الأولى وتدعم حاليًا Gmail فقط. نظريًا، يمكنك كتابة مُزود dovecot، لكنني لاحظت قبل بضعة أسابيع أن هناك بعض الأماكن في الكود الرئيسي تستخدم ميزات خاصة بـ Gmail فقط ويجب نقلها إلى كود خاص بالمزود. لذا، نعتذر عن ذلك، ولكن قد ترغب في الانتظار حتى تصبح هذه الميزة جاهزة للإطلاق بشكل أفضل.

7 إعجابات

حسب فهمي، فإن 'LABELS' هي ميزة غير قياسية في Gmail.
أود فهم الفرق بين IMAP الخاص بـ Google و IMAP القياسي.

هذا ملخصي حتى الآن:

IMAP القياسي IMAP الخاص بـ Google
توجد الرسائل المؤرشفة في مجلدات فرعية توجد جميع الرسائل في مجلد واحد
الرسائل المؤرشفة تفتقد إلى التسمية “\INBOX”
تُخزن العلامات المخصصة مع العلامات النظامية تُخزن العلامات المخصصة كتسميات

هل سيكون كافياً:

  • محاكاة التسميات في IMAP القياسي عن طريق تقسيم العلامات إلى علامات نظامية وعلامات مخصصة
  • معالجة email_is_archived من قبل المزود (على سبيل المثال، إضافة واختبار علامة “archived”)

لجعل مزامنة IMAP القياسية تعمل؟

سيؤثر هذا على الأسطر التالية:

يبدو لي أن هذا السطر غريب:

ستُستبدل جميع العلامات النظامية بوسوم discourse.
هل يتعامل هذا بشكل جيد مع جميع علامات IMAP (\Answered, \Deleted, \Draft, \Flagged, \Recent و \Seen / $Forwarded, $MDNSent, $SubmitPending و $Submitted)?

إعجابَين (2)

أعدت النظر في هذا الأمر بعد انقطاعٍ عن الموضوع.

لم أستطع معرفة كيفية جعل رأسية reply-to تعمل بشكل صحيح. يمكنني إعداد مجموعة للمزامنة مع حساب Gmail معين، لكن عند محاولة الرد عبر البريد الإلكتروني، تُضبط عنوان reply-to على عنوان الإشعار المهيأ في Discourse وليس عنوان IMAP.

هل هناك شيء قد فاتني؟

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

لقد جربت ذلك مع مزود البريد الإلكتروني GoDaddy لكن دون نجاح. مع Gmail يعمل بشكل ممتاز، ولكن للأسف نرغب في استخدام نطاقنا الخاص. هل هناك أي تحديثات جاهزة للاستخدام الفعلي؟

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

يمكنك استخدام نطاقك الخاص مع Gmail (مقابل رسوم)، على سبيل المثال.

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