سؤال

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

يمكنني استخدام البحث مع التاريخ، ولكن لا يوجد دعم للوقت + قد يتم خداع التاريخ بسهولة.

لقد جربت أيضا العلم الأخير، لكن هذا لا يبدو أن يعمل مع Gmail (في Ruby، يظهر Nil في كل مرة).

هل كانت مفيدة؟

المحلول

تريد استخدام UnientID (UID) للرسائل. هذا هو على وجه التحديد لماذا تم إنشاؤه.

سترغب في تتبع آخر UID المطلوب، ثم طلب جميع الرسائل الجديدة التي تستخدمها [UID]: *"، حيث [UID] هي قيمة UID الفعلية.

على سبيل المثال، دعونا نقول أن آخر رسالة Feteched لديها معرف فريد من "123456". سوف تجلب

123456:*

ثم، تجاهل أول رسالة عادت.

UIDS "من المفترض" أن تكون مستقرة عبر الجلسات، ولا تتغير أبدا، وتزيد دائما في القيمة. CATCH للتحقق من ذلك، هو التحقق من UIDEvality عند تحديد المجلد. إذا لم يتغير رقم UIDEVELIALY، فيجب أن يكون UIDS صالحا عبر الجلسات.

فيما يلي الأجزاء ذات الصلة من RFC:

2.3.1.1. سمة رسالتي المعرفة الفريدة (UID)

تشكل قيمة 32 بت تم تعيينها لكل رسالة، والتي عند استخدامها مع قيمة صلاحية المعرف الفريدة (انظر أدناه) قيمة 64 بت يجب أن لا تشير إلى أي رسالة أخرى في صندوق البريد أو أي صندوق بريد لاحق بنفس الاسم إلى الأبد. يتم تعيين معرفات فريدة من نوعها بطريقة تصاعدي بدقة في صندوق البريد؛ نظرا لأن كل رسالة تضاف إلى علبة البريد، يتم تعيين UID أعلى من الرسالة (الرسائل) التي تمت إضافتها مسبقا. على عكس أرقام تسلسل الرسائل، فإن المعرفات الفريدة ليست متجاورة بالضرورة.

يجب ألا يتغير المعرف الفريد للرسالة أثناء الجلسة، ويجب ألا يتغير بين الجلسات. يجب اكتشاف أي تغيير في المعرفات الفريدة بين الجلسات باستخدام آلية UIDEvality التي تمت مناقشتها أدناه. هناك حاجة إلى معرفات فريدة مستمرة للعميل لإعادة بيع حالتها من جلسة سابقة مع الخادم (على سبيل المثال، غير متصل أو غير متصل أو غير متصل بالوصول)؛ تمت مناقشة هذا أكثر في [قرص IMAP].

ملاحظة: تهدف قيمة المعرف الفريدة التالية إلى توفير وسيلة لعميل لتحديد ما إذا كان قد تم تسليم أي رسائل إلى صندوق البريد لأن المرة السابقة التي تم التحقق منها هذه القيمة.

هنا هو الرابط مع مزيد من المعلومات:

http://www.faqs.org/rfcs/rfc3501.html.

ما سأفعله، هو أيضا تتبع internaldate من الرسائل التي تم تنزيلها. بهذه الطريقة، إذا فقدت أي وقت مضى مزامنة UID، يمكنك على الأقل تكرر من خلال الرسائل، والعثور على آخر واحد قمت بتنزيله، بناء على Internaldate للرسالة.

نصائح أخرى

هناك علامة IMAP تسمى "رأيت". سيقوم معظم العملاء بتمييز رسالة شوهد عند عرض الرسالة، لذلك تريد التكرار فوق الرسائل على الخادم التي لا تملك مجموعة العلامة هذه.

إليك مقتطف رمز يجب أن يمنحك الفكرة الصحيحة. القليل من المنطوق هو

imap.search(["NOT", "SEEN"]).each do bla.bla.bla

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top