Quantcast
Channel: Blog | Limilabs
Viewing all articles
Browse latest Browse all 120

Thread emails using IMAP

$
0
0

The THREAD extension to the IMAP protocol provide a means of server-based threading of messages, without requiring that the IMAP component download the necessary data to do so itself.

Following sample shows how to use Imap Thread method to thread all emails available in the mailbox.

  • First it checks if THREAD extension is available on the server (defined in RFC 5256).
  • It also downloads envelopes of all email messages to get messages subjects and basic data.
  • Finally recursive ShowThread method is used. It displays message UID and subject in a formatted tree manner.

There is one interesting thing in this sample: you can use any search criterion to get messages from the IMAP server. For example you could only get unseen messages or messages that are unseen and contain a certain word.

// C#

using (Imap imap = new Imap())
{
    imap.Connect("imap.example.org");    // or ConnectSSL
    imap.Login("user", "password");
    
    ThreadMethod method = ThreadMethod.ChooseBest(imap.SupportedThreadMethods());
    if (method == null)
        throw new Exception("This server does not support any threading algorithm.");

    imap.SelectInbox();

    List<MessageThread> threads = imap.Thread(method).Where(Expression.All());
    List<Envelope> envelopes = imap.GetEnvelopeByUID(
        imap.Search().Where(Expression.All()));

    foreach (MessageThread thread in threads)
    {
        ShowThread(0, thread, envelopes);
    }
    imap.Close();
}

public void ShowThread(int level, MessageThread thread, List<Envelope> envelopes)
{
    string indent = new string(' ', level*4);
    string subject = envelopes.Find(x => x.UID == thread.UID).Subject;
    Console.WriteLine("{0}{1}: {2}", indent, thread.UID, subject);

    foreach (MessageThread child in thread.Children)
    {
        ShowThread(level + 1, child, envelopes);
    }
}
' VB.NET

Using imap As New Imap()
	imap.Connect("imap.example.org")	' or ConnectSSL
	imap.Login("user", "password")

	Dim method As ThreadMethod = ThreadMethod.ChooseBest(imap.SupportedThreadMethods())
	If method Is Nothing Then
		Throw New Exception("This server does not support any threading algorithm.")
	End If

	imap.SelectInbox()

	Dim threads As List(Of MessageThread) = _ 
		imap.Thread(method).Where(Expression.All())
	Dim envelopes As List(Of Envelope) = 
		_ imap.GetEnvelopeByUID(imap.Search().Where(Expression.All()))

	For Each thread As MessageThread In threads
		ShowThread(0, thread, envelopes)
	Next
	imap.Close()
End Using

Public Sub ShowThread(level As Integer, thread As MessageThread, envelopes As List(Of Envelope))
	Dim indent As New String(" "C, level * 4)
	Dim subject As String = envelopes.Find(Function(x) x.UID = thread.UID).Subject
	Console.WriteLine("{0}{1}: {2}", indent, thread.UID, subject)

	For Each child As MessageThread In thread.Children
		ShowThread(level + 1, child, envelopes)
	Next
End Sub

Here you can see the results:

2299: First thread
    2300: Re: First thread
    2301: Re: First thread
2302: Second thread
    2303: Re: Second thread
    2304: Re: Re: Second thread
    2305: Re: Re: Re: Second thread

Viewing all articles
Browse latest Browse all 120

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>