الحصول على محتوى البريد الإلكتروني غير المقروء، دون التأثير على الحالة غير المقروءة [نسخة مكررة]
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
إنه الآن صندوق 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()