More .NET libraries
-
Rebex Mail Pack
IMAP, MS Graph, EWS, POP3, SMTP, MIME, S/MIME, MSG
-
Rebex Total Pack
All Rebex .NET libraries together
Back to feature list...
Folder operations
On this page:
The sample code on this page assumes you have already connected and authenticated to an IMAP servers.
Setting and getting current folder
An IMAP mailbox can contain lot of folders at various level of hierarchy.
However, you can always find an Inbox
folder. Before working
with messages in a specific folder, you have to specify a current
working folder first for most IMAP commands.
- To set a working folder, use the
SelectFolder
method. - To unset a working folder, use the
UnselectFolder
method (optional). - To get the current working folder, use the
CurrentFolder
property.
// create IMAP client instance, connect, log in
var imap = new Rebex.Net.Imap();
imap.Connect(hostname, SslMode.Implicit);
imap.Login(username, password);
// set Inbox as working folder
imap.SelectFolder("Inbox");
// print info about current working folder
ImapFolder info = imap.CurrentFolder;
Console.WriteLine("Working folder: {0}", info.Name);
Console.WriteLine("Total messages: {0}", info.TotalMessageCount);
Console.WriteLine("Not-seen messages: {0}", info.NotSeenMessageCount);
// unselect folder
imap.UnselectFolder();
' create IMAP client instance, connect, log in
Dim imap As New Rebex.Net.Imap()
imap.Connect(hostname, SslMode.Implicit)
imap.Login(username, password)
' set Inbox as working folder
imap.SelectFolder("Inbox")
' print info about current working folder
Dim info As ImapFolder = imap.CurrentFolder
Console.WriteLine("Working folder: {0}", info.Name)
Console.WriteLine("Total messages: {0}", info.TotalMessageCount)
Console.WriteLine("Not-seen messages: {0}", info.NotSeenMessageCount)
' unselect folder
imap.UnselectFolder()
Getting folder info
There are several ways to retrieve information about an IMAP folder:
Imap
object'sCurrentFolder
property provides information about the current working folder.GetFolderInfo
method retrieves information about the specified folder.GetFolderList
method lists available folders.
All of these methods and properties provide an instance (or list) of ImapFolder
objects.
However, not all of them provide all the information. Please see the description of specific ImapFolder
property to determine when it is available.
// create IMAP client instance, connect, log in
// ...
// print info about Inbox
ImapFolder info = imap.GetFolderInfo("Inbox");
Console.WriteLine("Folder: {0}", info.Name);
Console.WriteLine("Total messages: {0}", info.TotalMessageCount);
Console.WriteLine("Not-seen messages: {0}", info.NotSeenMessageCount);
' create IMAP client instance, connect, log in
' ...
' print info about Inbox
Dim info As ImapFolder = imap.GetFolderInfo("Inbox")
Console.WriteLine("Folder: {0}", info.Name)
Console.WriteLine("Total messages: {0}", info.TotalMessageCount)
Console.WriteLine("Not-seen messages: {0}", info.NotSeenMessageCount)
Getting list of folders
To get list of folders in a mailbox, use the GetFolderList
method.
// create IMAP client instance, connect, log in
// ...
// get the root folders
ImapFolderCollection rootFolders = imap.GetFolderList();
// get all folders
ImapFolderCollection allFolders = imap.GetFolderList("", ImapFolderListMode.All, true);
' create IMAP client instance, connect, log in
' ...
' get the root folders
Dim rootFolders As ImapFolderCollection = imap.GetFolderList()
' get all folders
Dim allFolders As ImapFolderCollection = imap.GetFolderList("", ImapFolderListMode.All, True)
Please note that the ImapFolder
objects returned by this method don't provide as much information as those returned by GetFolderInfo
.
See the description of specific ImapFolder
property to determine when it is available.
Subscribing to a folder
IMAP protocol enables you to mark folders as subscribed, speeding up listing of them later (by ignoring non-subscribed folders).
// create IMAP client instance, connect, log in
// ...
// subscribe some folders
imap.Subscribe("Inbox");
imap.Subscribe("Outbox");
// list all subscribed folders
ImapFolderCollection list = imap.GetFolderList("", ImapFolderListMode.Subscribed, true);
foreach (ImapFolder folder in list)
{
// get richer info for folder and print it
ImapFolder info = imap.GetFolderInfo(folder.Name);
Console.WriteLine("Folder: {0}", info.Name);
Console.WriteLine("Total messages: {0}", info.TotalMessageCount);
Console.WriteLine("Not-seen messages: {0}", info.NotSeenMessageCount);
}
// unsubscribe some folders
imap.Unsubscribe("Outbox");
' create IMAP client instance, connect, log in
' ...
' subscribe some folders
imap.Subscribe("Inbox")
imap.Subscribe("Outbox")
' list all subscribed folders
Dim list As ImapFolderCollection = imap.GetFolderList("", ImapFolderListMode.Subscribed, True)
For Each folder As ImapFolder In list
' get richer info for folder and print it
Dim info As ImapFolder = imap.GetFolderInfo(folder.Name)
Console.WriteLine("Folder: {0}", info.Name)
Console.WriteLine("Total messages: {0}", info.TotalMessageCount)
Console.WriteLine("Not-seen messages: {0}", info.NotSeenMessageCount)
Next
' unsubscribe some folders
imap.Unsubscribe("Outbox")
Checking folder existence
To determine whether a folder exists, use the FolderExists
method.
// create IMAP client instance, connect, log in
// ...
// check if "My mails" folder exists
bool exists = imap.FolderExists("My mails");
' create IMAP client instance, connect, log in
' ...
' check if "My mails" folder exists
Dim exists As Boolean = imap.FolderExists("My mails")
Creating and removing folders
Most IMAP servers let you create or remove custom folders.
- To create a folder, use the
CreateFolder
method. - To remove a folder, use the
DeleteFolder
method.
// create IMAP client instance, connect, log in
// ...
// create new "My mails" folder if doesn't exist
if (!imap.FolderExists("My mails"))
imap.CreateFolder("My mails");
// remove "My e-mails" if exists
if (imap.FolderExists("My e-mails"))
imap.DeleteFolder("My e-mails");
' create IMAP client instance, connect, log in
' ...
' create new "My mails" folder if doesn't exist
If Not imap.FolderExists("My mails") Then
imap.CreateFolder("My mails")
End If
' remove "My e-mails" if exists
If imap.FolderExists("My e-mails") Then
imap.DeleteFolder("My e-mails")
End If
Renaming folders
To rename a folder, use the RenameFolder
method.
// create IMAP client instance, connect, log in
// ...
string oldName = "My e-mails";
string newName = "My mails";
bool oldExists = imap.FolderExists(oldName);
bool newExists = imap.FolderExists(newName);
// rename folder "My e-mails" to "My mails"
if (oldExists && !newExists)
imap.RenameFolder(oldName, newName);
' create IMAP client instance, connect, log in
' ...
Dim oldName As String = "My e-mails"
Dim newName As String = "My mails"
Dim oldExists As Boolean = imap.FolderExists(oldName)
Dim newExists As Boolean = imap.FolderExists(newName)
' rename folder "My e-mails" to "My mails"
If oldExists AndAlso Not newExists Then
imap.RenameFolder(oldName, newName)
End If
Getting list of changes
IMAP servers notify connected clients of changes in the current working folder. For example, they inform clients when a new message arrives or when a message has been deleted. The client usually receives these notifications when reading server response to its command.
However, handling these notifications is a bit tricky.
The most straightforward way of processing those notifications is to use a combination of Notification
event and CheckForUpdates
method.
The following code shows how to use the Notification
event and CheckForUpdates
method to implement
simple one-way-synchronization.
The program downloads all not-Read
messages to a local directory and waits for server notifications in the meantime.
When new mail arrives to the folder, it is downloaded immediately.
When a mail is marked as not-Read
(by one of the other sessions), it is downloaded again.
Note: This variant of CheckForUpdates
utilizes IMAP IDLE
extension when available.
// create IMAP client instance, connect, log in, select desired folder
// ...
// register notification event
imapClient.Notification += imap_Notification;
// keep synchronization process running
while (!_stopped)
{
// search for UNREAD mails
ImapMessageCollection list =
imapClient.Search(ImapListFields.UniqueId, ImapSearchParameter.Unread);
// download all UNREAD mails
foreach (ImapMessageInfo info in list)
{
// exit if stopped
if (_stopped)
return;
// prepare path
string path = string.Format(@"C:\MyData\{0}.eml", Guid.NewGuid());
// download mail
imapClient.GetMessage(info.UniqueId, path);
}
// keep waiting for server notifications
while (!_syncNeeded && !_stopped)
{
// process server notifications in 5 minutes intervals
imapClient.CheckForUpdates(5 * 60 * 1000);
}
// reset flag
_syncNeeded = false;
}
' create IMAP client instance, connect, log in, select desired folder
' ...
' register notification event
AddHandler imap.Notification, AddressOf imap_Notification
' keep synchronization process running
While Not _stopped
' search for UNREAD mails
Dim list As ImapMessageCollection =
imap.Search(ImapListFields.UniqueId, ImapSearchParameter.Unread)
' download all UNREAD mails
For Each info As ImapMessageInfo In list
' exit if stopped
If _stopped Then
Return
End If
' prepare path
Dim path As String = String.Format("C:\MyData\{0}.eml", Guid.NewGuid())
' download mail
imap.GetMessage(info.UniqueId, path)
Next
' keep waiting for server notifications
While Not _syncNeeded AndAlso Not _stopped
' process server notifications in 5 minutes intervals
imap.CheckForUpdates(5 * 60 * 1000)
End While
' reset flag
_syncNeeded = False
End While
Event handler for the code above is following:
// flag - whether to stop the synchronization process
bool _stopped;
// flag - whether the synchronization needs to be performed
bool _syncNeeded;
private Imap client;
// Notification handler can be triggered by any Imap method
void imap_Notification(object sender, ImapNotificationEventArgs e)
{
// for one-way-synchronization following values are relevant
switch (e.Notification)
{
case ImapNotification.MessageCount:
case ImapNotification.RecentMessages:
case ImapNotification.MessageInfo:
// set flag
_syncNeeded = true;
// abort current operation
// we cannot perform any operation here,
// because Imap object is still locked,
// performing any operation will always fail
// with ImapExceptionStatus.Pending
var imap = sender as Imap;
imap.Abort();
break;
}
}
' flag - whether to stop the synchronization process
Private _stopped As Boolean
' flag - whether the synchronization needs to be performed
Private _syncNeeded As Boolean
' Notification handler can be triggered by any Imap method
Private Sub imap_Notification(sender As Object, e As ImapNotificationEventArgs)
' for one-way-synchronization following values are relevant
Select Case e.Notification
Case ImapNotification.MessageCount,
ImapNotification.RecentMessages,
ImapNotification.MessageInfo
' set flag
_syncNeeded = True
' abort current operation
' we cannot perform any operation here,
' because Imap object is still locked,
' performing any operation will always fail
' with ImapExceptionStatus.Pending
Dim imap = TryCast(sender, Imap)
imap.Abort()
Exit Select
End Select
End Sub
Back to feature list...