HOWTO: Get the list of unread messages from an IMAP server in VB.NET

Summary

This post shows how to connect to an IMAP server and retrieve the list of unread messages. The code uses Rebex Mail for .NET component.

Searching for unread messages

One of the most common mail processing operations is getting the list of new messages. When using the IMAP protocol, you have to select the correct mail folder (or "mailbox" in the IMAP terminology), construct the appropriate query and search for messages. Don't worry - with Rebex Mail, you don't have to learn the complicated IMAP query language or do your own modified-UTF-7-encoding :-)

The following code illustrates the whole process - it searches for messages marked as "not seen" in the selected folder at the IMAP server:

' find the unread messages  
Dim messages As New ImapMessageCollection         
messages = client.Search( _
    ImapSearchParameter.HasFlagsNoneOf(ImapMessageFlags.Seen ) _ 
) 
Console.WriteLine ("Found {0} unread messages.", messages.Count)

' list the unread messages: Dim message As ImapMessageInfo 
For Each message In messages
    Console.WriteLine( _
        "{0} | {1} | {2} | {3}", _
        message.UniqueID, _
        message.From, _
        message.To, _
        message.Subject) 
Next 

More searching options

The search method is of course not limited to seen/unseen messages. To learn more about searching IMAP folders, please see our IMAP Search Tutorial. The Following table illustrates possible search parameters:

Search parameter Description
From(address) Messages that contain the specified string in their From field.
NotFrom Messages that do not contain the specified string in their From field.
To(address) Messages that contain the specified string in their To field.
NotTo Messages that do not contain the specified string in their To field.
CC(address) Messages that contain the specified string in their CC field.
NotCC Messages that do not contain the specified string in their CC field.
Bcc(address) Messages that contain the specified string in their BCC field.
NotBcc Messages that do not contain the specified string in their BCC field.
Subject(queryTerm) Messages that contain the specified string in their subject field.
Body(queryTerm) Messages that contain the specified string in their body.
FullText(queryTerm) Messages that contain the specified string in their headers or body.
Arrived(on) Messages that arrived on the specified date (disregarding time).
Arrived(since, before) Messages that arrived in the specified date interval (disregarding time).
Sent(on) Messages that were sent on the specified date (disregarding time).
Sent(since, before) Messages that were sent in the specified date interval (disregarding time).
HasFlagsAllOf(flags) Messages with all the specified flags set.
HasFlagsNoneOf(flags) Messages with none of the specified flags set.
Deleted Messages whose Deleted flag is set.
New Messages whose Recent flag is set and Seen flag not set.
Recent Messages whose Recent flag is set.
NotRecent Messages whose Recent flag is not set.
Header(headerName, queryTerm) Messages that contain the specified string in the specified header.
Size(min, max) Messages whose size within the specified interval.
All Search for all messages. Same as GetMessageList method.

Full code

Let's see the full source code:

Imports Microsoft.VisualBasic 
Imports System 
Imports System.Collections 
Imports Rebex.Mail 
Imports Rebex.Net

Public Module MyModule
    Public Sub Main
        Dim server As String = "myServer"
        Dim username As String = "myUser"
        Dim password As String = "myPassword"

        ' create client, connect and log in 
        Dim client As New Imap
        client.Connect(server)
        client.Login(username, password)

        ' select the folder for search operation 
        client.SelectFolder("Inbox")

        ' find unread messages 
        Dim messages As New ImapMessageCollection        
        messages = client.Search( _
            ImapSearchParameter.HasFlagsNoneOf(ImapMessageFlags.Seen ) _
        )

        Console.WriteLine ("Found {0} unread messages.", messages.Count)

        ' list unread messages:
        Dim message As ImapMessageInfo
        For Each message In messages
            Console.WriteLine( _
                "{0} | {1} | {2} | {3}", _
                message.UniqueID, _
                message.From, _
                message.To, _
                message.Subject)
        Next                            
    End Sub
End Module