Есть несколько способов сделать это.Я объясню на уровне протокола и могу поспорить, что ваша библиотека C предоставит хотя бы один из них ...
В общем, наиболее эффективный способ - выполнить команду STATUS и запроситьUNSEEN count для папки:
A001 STATUS "INBOX" (UNSEEN)
* STATUS "INBOX" (UNSEEN 16)
A001 OK STATUS completed
Вы можете выбрать папку и проверить, возвращается ли код ответа [UNSEEN] на немаркированном OK:
A002 SELECT INBOX
* 223 EXISTS
* 223 RECENT
* OK [UNSEEN 1] mailbox contains unseen messages
* OK [UIDVALIDITY 1] UIDs are valid for this mailbox
* OK [UIDNEXT 554] next expected UID is 554
* FLAGS (\Answered \Deleted \Draft \Flagged \Seen $Forwarded $MDNSent)
* OK [PERMANENTFLAGS (\Answered \Deleted \Draft \Flagged \Seen $Forwarded $MDNSent \*)] junk-related flags are not permanent
* OK [HIGHESTMODSEQ 504] modseq tracked on this mailbox
A002 OK [READ-WRITE] SELECT completed
После выбора папки,Вы можете выполнить команду SEARCH и запросить НЕПРИЕМЛЕДЫЕ сообщения (если что-то возвращается, у вас есть непрочитанная почта):
A003 SEARCH UNSEEN
* SEARCH 1 2 12 13 14 155 156 157 158 159 183 184 185 215 216 218
A003 OK SEARCH completed
Обратите внимание, что все они работают для каждой папки.Если вы хотите узнать обо всех папках в вашем почтовом ящике, вам придется перебирать их все.Чтобы получить полный список папок, используйте команду LIST:
A004 LIST "" "*"
* LIST (\HasNoChildren) "/" "Drafts"
* LIST (\HasNoChildren) "/" "INBOX"
* LIST (\NoInferiors) "/" "Junk"
* LIST (\HasNoChildren) "/" "Sent"
* LIST (\HasNoChildren) "/" "Trash"
* LIST (\HasNoChildren) "/" "Unread Messages"
A004 OK LIST completed