فلدي تذهب بسرعة. مزامنة البريد الإلكتروني IMAP سريع

مرحبا! أنا إيليا. قبل عامين ، انضممت إلى عميل IMAP للجوّال. قامت الإصدارات السابقة من التطبيق بتنزيل قائمة الرسائل لفترة طويلة وقضت الكثير من حركة المرور لتحديث صندوق البريد. نشأ سؤال حول تحسين العمل مع البروتوكول وحول قدرات هذا البروتوكول بشكل عام. لم أكن أعرف أي شيء عن البروتوكول وانغمست في قراءة الوثائق. اتضح أنه طوال هذه الفترة استخدم العميل البروتوكول دون انقطاع ولم يأخذ في الاعتبار على الإطلاق ميزات التنفيذ. ساعدت هذه الميزات في تسريع تنزيلات البريد من 2 إلى 3 مرات. حول ما هو IMAP وما هي رقائق تحسينه لاحقًا في مقالتي.

لن أخوض في البروتوكول بعمق. مقال بدلاً من فئة "أود قراءة هذا المقال قبل عامين". من غير المحتمل أن يجد معلمو IMAP معلومات جديدة لأنفسهم. تعتمد هذه المقالة على وصف البروتوكول من RFC 3501 .

اتصال الخادم


IMAP هو بروتوكول ذو حالة. كان هذا اكتشافًا لي ، قبل ذلك لم أر أو عملت مع هذه البروتوكولات. خذ بعين الاعتبار مخطط العمل مع الخادم. 


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

openssl s_client -connect imap.server.com:993 -crlf 

رائع ، تم تأسيس الاتصال ويمكنك مراقبة استجابة OK بخط يبدأ باستجابة CAPABILITY

OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE  SPECIAL-USE AUTH=PLAIN AUTH=LOGIN]

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

إذن الخادم


بعد الاتصال بالخادم ، تحتاج إلى الانتقال إلى صندوق البريد الخاص بك. يتم ذلك باستخدام الأمر LOGIN.

a1 LOGIN email pass

لذا ، توقف ، تسجيل الدخول ، أفهم ، و a1 ما هذا؟ - ربما تسأل. وهذه علامة الفريق. من أجل مصلحة العميل ، يجب أن تكون العلامات مختلفة ، حيث تصل الاستجابة بنفس علامة الطلب ، مما يعني أنه يمكن مطابقتها للتحليل بين الفرق. يمكن للخادم أيضًا إرجاع استجابة بعلامة النجمة في البداية ، مثل * OK ، وهذا ما يسمى استجابة غير مميزة. بشكل أساسي ، يتم إرجاع هذه الإجابة للفرق التي تتوقع العديد من الكيانات في الاستجابة ، على سبيل المثال ، LIST. 

طلب قائمة المجلدات


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

A2 LIST «» *
* LIST (\HasNoChildren \Trash) «/» Trash
* LIST (\HasNoChildren \Sent) «/» Sent
* LIST (\HasNoChildren \Drafts) «/» Drafts
* LIST (\HasNoChildren \Junk) «/» Junk
* LIST (\HasNoChildren) «/» INBOX
A2 OK List completed (0.001 + 0.000 + 0.001 secs).

المعلمة الأولى في الأمر هي مساحة الاسم. إذا كان الخادم يدعم مساحة الاسم ، فيمكن طلب قيمه باستخدام استعلام NAMESPACE. تبدو مساحة الاسم القياسية مثل سلسلة فارغة. بعد ذلك ، يتم تشغيل معلمة أحرف البدل. باستخدامه ، يمكننا إخبار الخادم بالمجلدات التي نحتاج إلى إرجاعها. على سبيل المثال ، يمكننا الحصول على: فرع شجرة مجلد ، أو جذور فقط ، أو كل شيء فقط ، كما في المثال أعلاه. من الأفضل عدم القيام بذلك ، لأن من يعرف عدد المجلدات الموجودة لدى المستخدم في الصندوق. يوصي مؤلفو البروتوكول باستخدام "٪" - في هذه الحالة ستحصل على جميع مجلدات المستوى الأعلى من صندوق البريد. 

من الجواب ، نتفهم أن هذه إجابة بدون علامة حيث يكون كل سطر هو مجلدك في المربع. أولاً ، هناك علامات نقرأ من خلالها المعلومات الوصفية للمجلد ، على سبيل المثال ، في المثال ، لا تحتوي جميع المجلدات على أحفاد وبعض المجلدات ذات الأغراض الخاصة (مثل سلة المهملات ، والبريد غير الهام ، وما إلى ذلك). بعد ذلك يأتي حرف فاصل المجلد. يستخدم هذا الرمز للمجلدات الفرعية. على سبيل المثال ، بالنسبة إلى سليل مجلد المهملات ، سيبدو الاسم مثل "سلة المهملات / مجلد جديد". بعد كل المجلدات ، سيرجع الخادم OK إلينا بالعلامة التي خصصناها للأمر ووقت تنفيذ هذا الأمر.  

اختيار المجلد


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

4 SELECT INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft $Forwarded $MDNSent)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft $Forwarded $MDNSent \*)] Flags permitted.
* 16337 EXISTS
* 2 RECENT
* OK [UNSEEN 6037] First unseen.
* OK [UIDVALIDITY 1532079879] UIDs valid
* OK [UIDNEXT 17412] Predicted next UID
* OK [HIGHESTMODSEQ 21503] Highest
4 OK [READ-WRITE] Select completed (0.015 + 0.000 + 0.014 secs).

عند تحديد مجلد ، يتم إرجاع كافة المعلومات الخاصة به. دعنا نذهب بالترتيب.

  • أجب بالعلامات المسموح بها داخل المجلد للأحرف.  
  • أجب بالعلامات التي يمكن للعميل تغييرها للأبد
  • رد مع عدد الحروف في المجلد
  • الجواب هو مع عدد الرسائل الأخيرة ، أي تلك التي تلقيناها بين تحديدات المجلد
  • الرد مع عدد الرسائل غير المقروءة

حسنًا ، الآن ، دعنا نتناول هذا. بقية المعلومات التي لا نحتاجها.

طلب رسائل


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

5 FETCH 16337:16327 (ENVELOPE)

يحسب القولون عدد أرقام الحروف التي نريد استلامها ، وبين قوسين ما نريد قراءته من هذه الحروف ، في هذه الحالة ، غلاف الحرف.

سأعطي الإجابة في شكل مختصر:

* 16334 FETCH (ENVELOPE ("Sat, 07 Sep 2019 23:07:48 +0000" "Hello from Fabric.io" (("Fabric" NIL "notifier" "fabric.io")) (("Fabric" NIL "notifier" "fabric.io")) (("Fabric" NIL "notifier" "fabric.io")) ((NIL NIL "me" "me@mail")) NIL NIL NIL "<5d7438441b07c_2d872ad30967b9646405c6@answers-notifier2012.mail>"))

من الواضح أنه لا يوجد شيء واضح. والشيء هو أن تنسيق المغلف تمليه RFC 2822. لن أعتبره في هذه المقالة. يحتوي هذا المغلف على جميع المعلومات اللازمة: تاريخ استلام الرسالة وموضوع الرسالة والمرسل والمستلم وحتى معرف الرسالة. يستخدمه زبائنه لعرض محادثة.

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

6 FETCH 16337:16327 (BODY[]) 

جرب مثل هذا الأمر في صندوق البريد الوارد الخاص بك ، وسوف تفهم ما قصدته بـ "مكلف" ، حتى مع 10 رسائل نحصل على استجابة ضخمة إلى حد ما مع جميع المعلومات حول الرسالة. بالحديث عنها.

كم مرة قمت بتنزيل مصدر الرسالة في أي عميل تعرفه لترى كيف يبدو في شكله الأصلي؟ إذا لم يكن الأمر كذلك ، فلنخرج منه رسالة اختبار. أضفت فيه صورة مباشرة إلى الحرف وصورة كمرفق. احفظه بتنسيق eml ، ثم افتحه باستخدام أي محرر نصوص. اعتمادًا على العميل ، ستتلقى مصادر مختلفة للرسالة ، ولكن بشكل عام ستكون متشابهة. 

لنبدأ برأس البريد الإلكتروني:

Return-Path: <myemail>
Delivered-To:myemail
Received: from localhost (localhost [127.0.0.1])
	byimap.server.com (imap.server.com) with ESMTP id 6C2BE2A0363
	for <myemail>; Sun,  8 Sep 2019 23:41:29 +0300 (MSK)
X-Virus-Scanned: amavisd-new at imap.server.com
Received: from imap.server.com ([127.0.0.1])
	by localhost ( imap.server.com [127.0.0.1]) (amavisd-new, port 10026)
	with ESMTP id abx8HQQT_k5A for <myemail>;
	Sun,  8 Sep 2019 23:41:29 +0300 (MSK)
Mime-Version: 1.0
Date: Sun, 08 Sep 2019 20:41:28 +0000
Content-Type: multipart/mixed;
 boundary=»--=_Part_722_554093397.1567975288»
Message-ID: <9e4e3872e603eac2c20f26bb1d65548d>
From: "Me" <myemail>
Subject: Hey, Habr!
To: myemail
X-Priority: 3 (Normal)

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

مزيد من فهم ما يعنيه هذا.

----=_Part_722_554093397.1567975288
Content-Type: multipart/related;
 boundary=»--=_Part_583_946112260.1567975288»
----=_Part_583_946112260.1567975288
Content-Type: multipart/alternative;
 boundary=»--=_Part_881_599167713.1567975288»
----=_Part_881_599167713.1567975288
Content-Type: text/plain; charset=«utf-8»
Content-Transfer-Encoding: quoted-printable
----=_Part_881_599167713.1567975288
Content-Type: text/html; charset=«utf-8»
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE html><html><head><meta http-equiv=3D"Content-Type" content=3D"t=
ext/html; charset=3Dutf-8" /></head><body><div data-crea=3D"font-wrapper"=
 style=3D«font-family: XO Tahion; font-size: 16px; direction: ltr»> <img =
src=3D"cid:jua-uid-q1nz1guinitrcfd3-1567975257318"><br><br><div></div> <b=
r> </div></body></html>
----=_Part_881_599167713.1567975288--
----=_Part_583_946112260.1567975288
Content-Type: image/jpeg; name=«2018-09-04 22.46.36.jpg»
Content-Disposition: inline; filename=«2018-09-04 22.46.36.jpg»
Content-ID: <jua-uid-q1nz1guinitrcfd3-1567975257318>
Content-Transfer-Encoding: base64

كل حد هو الحد المعتاد لقطعة الكتابة. يبدأون بوصلتين "-". تحتوي الحدود المغلقة على هذين الواصلين في النهاية. يتم وصفه بمزيد من التفصيل في RFC1341.

يمكن تسمية هذا الجزء الرئيسي من الرسالة ، وأجزاء الرسالة وأنواع MIME الخاصة بهم موصوفة هنا.

حول أنواع MIME
MIME- , MIME (Multipurpose Internet Mail Extensions) email . 

  • multipart/mixed , . 

  • multipart/related , , , 

  • multipart/alternative , , , text/plain text/html, . 


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

رابط هذه الصورة ليس بسيطًا تمامًا. يتم وصفه بواسطة معلمة Content-ID ، التي تساوي jua-uid-q1nz1guinitrcfd3-1567975257318 . هذا ارتباط إلى الجزء التالي من الرسالة - صورة مشفرة في الأساس 64. لإنقاذ أعصابي ، لم أقم بتضمين كل كود الأساس 64.

يحتوي الجزء الأخير من الرسالة على النموذج 

----=_Part_722_554093397.1567975288
Content-Type: image/png; name=«2018-07-02 11.08.23 pm.png»
Content-Disposition: attachment; filename=«2018-07-02 11.08.23 pm.png»
Content-Transfer-Encoding: base64

التي تحتوي بالفعل على ترتيب المحتوى غير مضمّن ، مثل الصورة أعلاه ، ولكن المرفق. يجب أن تذهب هذه الصورة فقط إلى لوحة مرفق الملف ، بالمناسبة يتم ترميزها أيضًا في الأساس 64 ولها حجم كبير. هنا يصبح من الواضح أنه لا يجب عليك مرة أخرى تحميل نص الرسالة بالكامل إذا أردنا إظهار المعلومات الأساسية فقط. 

العودة إلى البروتوكول


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


7 CLOSE
7 OK Close completed (0.001 + 0.000 secs).

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

1 NOOP
1 OK NOOP completed (0.001 + 0.000 secs).

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

1 NOOP
* 16472 EXPUNGE
* 16471 EXPUNGE
* 16472 EXISTS
* 1 RECENT
1 OK NOOP completed (0.004 + 0.000 + 0.003 secs).

هنا في الرد ، يتم إعلامنا برسالتين محذوفتين ، واحدة جديدة وأن عدد الرسائل في هذا المجلد هو 16 472.

وألاحظ أيضًا أنه يمكنك العمل مع مجلد محدد واحد فقط ، ولا يوجد عمل متوازي هنا.

حسنًا ، في النهاية ، أغلق الجلسة مع الخادم وسنودّعها.

8 LOGOUT
* BYE Logging out
8 OK Logout completed (0.001 + 0.000 secs).

نرى إجابة BYE الحزينة التي لا تحمل علامات ، مما يعني أن الوقت قد حان لإنهاء المهمة.

مزامنة سريعة مع CONDSOTORE و QRESYNC


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

بالإضافة إلى ذلك ، يضيف هذا الامتداد معلمات إضافية لأوامر STORE و FETCH - تسلسل mod - و CHANGEDSINCE - وتسلسل mod UNCHANGEDSINCE ، مما يسمح لك بإجراء عملية إذا كان تسلسل mod للرسائل المرسلة أكبر وأصغر من ذلك ، على التوالي. لنلقي نظرة على مثال.

FETCH 17221:17241 (UID) (CHANGEDSINCE 0)
* OK [HIGHESTMODSEQ 22746] Highest
* 17222 FETCH (UID 18319 MODSEQ (22580))
* 17223 FETCH (UID 18320 MODSEQ (22601))
* 17224 FETCH (UID 18324 MODSEQ (22607))
* 17225 FETCH (UID 18325 MODSEQ (22604))
* 17226 FETCH (UID 18326 MODSEQ (22608))
* 17227 FETCH (UID 18327 MODSEQ (22614))
* 17228 FETCH (UID 18328 MODSEQ (22613))
* 17229 FETCH (UID 18336 MODSEQ (22628))
* 17230 FETCH (UID 18338 MODSEQ (22628))
* 17231 FETCH (UID 18340 MODSEQ (22628)
* 17232 FETCH (UID 18341 MODSEQ (22628))
* 17221 FETCH (UID 18318 MODSEQ (22583))

لقد قمت بمحاكاة موقف نذهب فيه إلى صندوق البريد ولم نكن نعرف أي شيء عنه من قبل ، أي أن تسلسل mod المحلي الخاص بنا هو 0. كما ترى ، فإن الخادم يعيد إلينا عمومًا جميع الرسائل الموجودة في صندوق البريد ، حيث لم نكن نتلقى أي شيء قبل ذلك ولا تعرف أي شيء عن الصندوق. استجابة لطلب رسائل UID من CHANGEDSINCE ، يأتي الرد بلا علامات على OK أيضًا مع HIGHESTMODESEQ الذي سنحفظه الآن ، ولكل رسالة MODSEQ ،

سنقوم ببعض العمليات باستخدام صندوق البريد: إضافة أحرف جديدة ، وتغيير العلامات. دعونا تقديم طلب جديد ولكن مع تسلسل mod السابق

1 fetch 17221:* (UID FLAGS) (CHANGEDSINCE 22746)
* 17267 FETCH (UID 18378 FLAGS () MODSEQ (22753))
* 17270 FETCH (UID 18381 FLAGS (\Seen) MODSEQ (22754))
* 17271 FETCH (UID 18382 FLAGS () MODSEQ (22751))
* 17273 FETCH (UID 18384 FLAGS () MODSEQ (22750))

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

يبدو أفضل بكثير؟ لكن QRESYNC يجعل عملية المزامنة أسرع ، فهو يسمح لك بتحديد معلمات MODSEQ والرسالة UIDs المعروفة لنا مباشرة أثناء اختيار المجلد. دعنا نشرح بمثال. أولاً ، يجب تمكين QRESYNC باستخدام الأمر ENABLE. 

1 ENABLE QRESYNC
* ENABLED QRESYNC
1 OK Enabled (0.001 + 0.000 secs).
1 SELECT INBOX (QRESYNC (0 0))
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft $Forwarded $MDNSent)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft $Forwarded $MDNSent \*)] Flags permitted.
* 17271 EXISTS
* 0 RECENT
* OK [UNSEEN 17241] First unseen.
* OK [UIDVALIDITY 1532079879] UIDs valid
* OK [UIDNEXT 18385] Predicted next UID
* OK [HIGHESTMODSEQ 22754] Highest
1 OK [READ-WRITE] Select completed (0.001 + 0.000 secs).

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

1 CLOSE
1 OK Close completed (0.001 + 0.000 secs).
1 SELECT INBOX (QRESYNC (1532079879 22754 18300:18385))
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft $Forwarded $MDNSent)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft $Forwarded $MDNSent \*)] Flags permitted.
* 17271 EXISTS
* 0 RECENT
* OK [UNSEEN 17241] First unseen.
* OK [UIDVALIDITY 1532079879] UIDs valid
* OK [UIDNEXT 18386] Predicted next UID
* OK [HIGHESTMODSEQ 22757] Highest
* VANISHED (EARLIER) 18380
* 17269 FETCH (UID 18383 FLAGS () MODSEQ (22757))
* 17271 FETCH (UID 18385 FLAGS () MODSEQ (22755))
1 OK [READ-WRITE] Select completed (0.001 + 0.000 secs).

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

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

المعلمة الثانية هي HIGHESTMODSEQ المعروفة لنا والأخيرة هي الفاصل الزمني لـ UIDs المعروفة ، ويمكن كتابتها على شكل نقطتين ، إذا كان الفاصل مستمرًا ، أو مفصولة بفاصلة.

استنتاج


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

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

All Articles