الحصول على محتوى البريد الإلكتروني غير المقروء، دون التأثير على الحالة غير المقروءة [نسخة مكررة]

StackOverflow https://stackoverflow.com/questions/1564237

سؤال

إنه الآن صندوق Gmail ولكن عاجلاً أم آجلاً أريد توسيع نطاقه.

أرغب في مزامنة نسخة من صندوق بريد شخصي مباشر (صندوق الوارد وصندوق الصادر) في مكان آخر، ولكن لا أريد التأثير على unread حالة أي رسائل غير مقروءة.

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

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

المحلول 5

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

نصائح أخرى

في عالم IMAP، تحتوي كل رسالة على علامات.يمكنك تعيين العلامات الفردية على كل رسالة.عندما تقوم بإحضار رسالة، فمن الممكن بالفعل قراءة الرسالة، دون تطبيق العلامة \Seen.

سيتم تطبيق معظم عملاء البريد علامة \Seen عند قراءة الرسالة.لذلك، إذا تمت قراءة الرسالة بالفعل، خارج تطبيقك، فسوف تحتاج إلى إزالة العلامة \Seen.

تمامًا كما لمعلوماتك... إليك الجزء ذو الصلة بالعلامات من RFCs:

علامة النظام هي اسم العلم المحدد مسبقًا في هذه المواصفات.تبدأ جميع إشارات النظام بـ "\".بعض أعلام النظام ( تم حذفها و شوهد) لها دلالات خاصة موصوفة في مكان آخر.إشارات النظام المحددة حاليًا هي:

    \Seen
       Message has been read

    \Answered
       Message has been answered

    \Flagged
       Message is "flagged" for urgent/special attention

    \Deleted
       Message is "deleted" for removal by later EXPUNGE

    \Draft
       Message has not completed composition (marked as a draft).

    \Recent
       Message is "recently" arrived in this mailbox.  This session
       is the first session to have been notified about this
       message; if the session is read-write, subsequent sessions
       will not see \Recent set for this message.  This flag can not
       be altered by the client.

       If it is not possible to determine whether or not this
       session is the first session to be notified about a message,
       then that message SHOULD be considered recent.

       If multiple connections have the same mailbox selected
       simultaneously, it is undefined which of these connections
       will see newly-arrived messages with \Recent set and which
       will see it without \Recent set.

يوجد خيار .PEEK في أمر FETCH في IMAP والذي لن يقوم بشكل صريح بتعيين العلامة /Seen.

ينظر الى أمر الجلب في RFC 3501 وانتقل للأسفل قليلاً إلى الصفحة 57 أو ابحث عن "BODY.PEEK".

تحتاج إلى تحديد القسم عند استخدام BODY.PEEK.تم شرح الأقسام في أمر جلب IMAP الوثائق ضمن BODY[<section>]<<partial>>

import getpass, imaplib

M = imaplib.IMAP4()
M.login(getpass.getuser(), getpass.getpass())
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
    typ, data = M.fetch(num, '(BODY.PEEK[])')
    print 'Message %s\n%s\n' % (num, data[0][5])
M.close()
M.logout()

ملاحظة:أردت إصلاح الإجابة المقدمة جين وود ولكن لم يكن مسموحًا به لأن التعديل كان أصغر من 6 أحرف (BODY.PEEK -> BODY.PEEK[])

لا أحد يستخدم بروتوكول POP لأنه عادة ما يستخدمه يريد الوظائف الإضافية لـ IMAP، مثل تتبع حالة الرسالة.عندما تكون هذه الوظيفة عائقًا في طريقك وتحتاج إلى حلول بديلة، أعتقد أن استخدام بروتوكول POP هو أفضل رهان لك!-)

للمتابعة إجابة دان جولدشتاين أعلاه, ، في لغة بايثون، سيكون بناء الجملة لاستخدام خيار ".PEEK" هو الاتصال IMAP4.fetch وتمريرها "الجسم.نظرة خاطفة"

لتطبيق ذلك على المثال الموجود في مستندات بايثون :

import getpass, imaplib

M = imaplib.IMAP4()
M.login(getpass.getuser(), getpass.getpass())
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
    typ, data = M.fetch(num, '(BODY.PEEK)')
    print 'Message %s\n%s\n' % (num, data[0][5])
M.close()
M.logout()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top