Pertanyaan dapatkan email yang belum dibaca, tanpa mempengaruhi status yang belum dibaca [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Sekarang ini kotak gmail tetapi cepat atau lambat saya ingin skalanya.

Saya ingin menyinkronkan salinan kotak surat pribadi langsung (kotak masuk dan kotak keluar) di tempat lain, tetapi saya tidak ingin memengaruhi unread keadaan pesan yang belum dibaca.

jenis akses apa yang akan membuat ini mudah? Saya tidak dapat menemukan informasi apa pun jika IMAP akan mempengaruhi status baca, tetapi tampaknya saya dapat mereset pesan ke tidak dibaca secara manual. Pop oleh definisi tidak mempengaruhi negara yang belum dibaca tetapi sepertinya tidak ada yang menggunakan pop untuk mengakses gmail mereka, mengapa?


4
2017-10-14 04:27


asal


Jawaban:


Di dunia IMAP, setiap pesan memiliki bendera. Anda dapat mengatur masing-masing bendera pada setiap pesan. Saat Anda Mengambil pesan, sebenarnya mungkin untuk membaca pesan, tanpa menerapkan tanda \ Tampak.

Sebagian besar klien email akan menerapkan flag \ Seen ketika pesan dibaca. Jadi, jika pesan sudah dibaca, di luar aplikasi Anda, maka Anda harus menghapus tanda \ Seen.

Sama seperti fyi ... di sini adalah bagian yang relevan tentang bendera dari RFC:

Bendera sistem adalah nama bendera yang ditentukan sebelumnya dalam hal ini    spesifikasi. Semua tanda sistem dimulai dengan "\". Sistem tertentu    bendera (\ Dihapus dan \ Seen) memiliki semantik khusus yang dijelaskan    di tempat lain. Bendera sistem yang saat ini ditetapkan adalah:

    \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.

5
2017-10-14 14:14



Ada opsi .PEEK pada perintah FETCH di IMAP yang secara eksplisit tidak mengatur flag / Seen.

Melihat perintah FETCH di RFC 3501 dan gulir ke bawah sedikit ke halaman 57 atau cari "BODY.PEEK".


3
2017-10-16 17:42



Anda perlu menentukan bagian saat menggunakan BODY.PEEK. Bagian dijelaskan dalam Perintah Ambil IMAP dokumentasi di bawah BODY [<section>] << parsial >>

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()

PS: Saya ingin memperbaiki jawaban yang diberikan Gene Wood tetapi tidak diizinkan karena edit lebih kecil dari 6 karakter (BODY.PEEK -> BODY.PEEK [])


2
2018-03-19 20:39



Tidak ada yang menggunakan POP karena biasanya mereka ingin fungsi tambahan IMAP, seperti status pesan pelacakan. Ketika fungsi itu hanya menghalangi Anda dan membutuhkan penyelesaian, saya pikir menggunakan POP adalah taruhan terbaik Anda! -)


1
2017-10-14 04:52



jika itu membantu siapa saja, GAE memungkinkan Anda melakukannya menerima email sebagai permintaan HTTP, jadi untuk sekarang saya hanya mengirim email ke sana.


0
2017-12-01 21:16



Untuk menindaklanjuti Jawaban Dan Goldstein di atas, di python sintaks untuk menggunakan opsi ".PEEK" akan memanggil IMAP4.fetch dan lulus "BODY.PEEK"

Untuk menerapkan ini ke contoh di dokumen python :

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()

0
2018-03-01 06:03