<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://saguiitay.spaces.live.com/mmm2008-05-17_13.22/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fsaguiitay.spaces.live.com%2fcategory%2fMAPI__xa5CDO__xa5Outlook%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Itay's space: MAPI/CDO/Outlook</title><description /><link>http://saguiitay.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catMAPI__xa5CDO__xa5Outlook</link><language>en-US</language><pubDate>Wed, 23 Jul 2008 03:21:52 GMT</pubDate><lastBuildDate>Wed, 23 Jul 2008 03:21:52 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://saguiitay.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>4287375271627483618</live:id><live:alias>saguiitay</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>Populating a TreeView with Outlook folders</title><link>http://saguiitay.spaces.live.com/Blog/cns!3B7FD118142669E2!657.entry</link><description>&lt;div&gt;
&lt;p&gt;In this post I will demonstrate how to populate a TreeView with the different Outlook folders. We’ll be using the Outlook Object Model (OOM) to retrieve the folder and some basic information about them. The code itself is well documented, so I’ll not explain it.
&lt;p&gt;&lt;code&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#0000ff"&gt;private void&lt;/font&gt; GetFolders(MAPIFolder currentFolder)&lt;br&gt;{&lt;br&gt;    TreeNodeCollection nodes = &lt;font color="#0000ff"&gt;null&lt;/font&gt; ;&lt;br&gt;    &lt;font color="#0000ff"&gt;if&lt;/font&gt; (currentFolder == null)&lt;br&gt;        &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// If current folder is null, we’ll be adding the root folders to&lt;br&gt;        // the TreeView itself&lt;br&gt;&lt;/font&gt;        nodes = treeView1.Nodes;&lt;br&gt;    &lt;font color="#0000ff"&gt;else&lt;/font&gt;&lt;br&gt;    {&lt;br&gt;        &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// otherwise, find th node that represent the MAPIFolder we’re about&lt;br&gt;        // to expand&lt;br&gt;&lt;/font&gt;        TreeNode parentNode = folderToNode[currentFolder] as TreeNode;&lt;br&gt;        &lt;font color="#0000ff"&gt;if&lt;/font&gt; (parentNode == &lt;font color="#0000ff"&gt;null&lt;/font&gt; )&lt;br&gt;            throw new ArgumentException(&amp;quot;currentFolder&amp;quot;);&lt;br&gt;        nodes = parentNode.Nodes;&lt;br&gt;    }&lt;br&gt;    &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// If this folder was already expanded, there’s nothing left for us to do&lt;br&gt;&lt;/font&gt;    &lt;font color="#0000ff"&gt;if&lt;/font&gt; (currentFolder != &lt;font color="#0000ff"&gt;null&lt;/font&gt; &amp;amp;&amp;amp; folderExpanded[currentFolder] != &lt;font color="#0000ff"&gt;null&lt;/font&gt; )&lt;br&gt;        &lt;font color="#0000ff"&gt;return&lt;/font&gt; ;&lt;br&gt;    &lt;font color="#0000ff"&gt;else if&lt;/font&gt; (currentFolder != &lt;font color="#0000ff"&gt;null&lt;/font&gt; )&lt;br&gt;    {&lt;br&gt;        &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// Otherwise, clear the children nodes of the node we’re about to expand&lt;br&gt;        // This is done since we might have placed a Dummy node there - see later&lt;br&gt;&lt;/font&gt;        &lt;font color="#0000ff"&gt;if&lt;/font&gt;  (nodes.Count &amp;gt; 0)&lt;br&gt;            nodes.Clear();&lt;br&gt;        &lt;font color="#008000"&gt;// Mark folder as expanded&lt;/font&gt;&lt;br&gt;        folderExpanded[currentFolder] = &lt;font color="#0000ff"&gt;true&lt;/font&gt; ;&lt;br&gt;    }&lt;br&gt;    &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// Retrieve the roo/sub folders&lt;br&gt;&lt;/font&gt;    Folders folders = (currentFolder == &lt;font color="#0000ff"&gt;null &lt;/font&gt;? nameSpace.Folders : currentFolder.Folders);&lt;br&gt;    &lt;font color="#0000ff"&gt;foreach&lt;/font&gt; (MAPIFolder folder &lt;font color="#0000ff"&gt;in&lt;/font&gt; folders)&lt;br&gt;    {&lt;br&gt;        &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// If this folder already has a node, we’re done with it&lt;br&gt;&lt;/font&gt;        &lt;font color="#0000ff"&gt;if&lt;/font&gt; (folderToNode[folder] != &lt;font color="#0000ff"&gt;null&lt;/font&gt; )&lt;br&gt;            &lt;font color="#0000ff"&gt;continue&lt;/font&gt; ;&lt;br&gt;        &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// Generate a node for the current subfolder&lt;br&gt;&lt;/font&gt;        TreeNode newNode = GenerateNode(folder);&lt;br&gt;        &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// Add folder to hashes and to it’s parent node&lt;br&gt;&lt;/font&gt;        nodeToFolder[newNode] = folder;&lt;br&gt;        folderToNode[folder] = newNode;&lt;br&gt;        nodes.Add(newNode);&lt;br&gt;    }&lt;br&gt;}&lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt; TreeNode GenerateNode(MAPIFolder folder)&lt;br&gt;{&lt;br&gt;    &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// Create a new node with the correct name&lt;br&gt;&lt;/font&gt;    TreeNode newNode = new TreeNode(folder.Name);&lt;br&gt;    &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// Check if and how the number of items should be displayed&lt;br&gt;&lt;/font&gt;    &lt;font color="#0000ff"&gt;switch&lt;/font&gt; (folder.ShowItemCount)&lt;br&gt;    {&lt;br&gt;        &lt;font color="#0000ff"&gt;case&lt;/font&gt; OlShowItemCount.olNoItemCount:&lt;br&gt;            &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// Don’t display the number of items&lt;br&gt;&lt;/font&gt;            &lt;font color="#0000ff"&gt;break&lt;/font&gt; ;&lt;br&gt;        &lt;font color="#0000ff"&gt;case&lt;/font&gt; OlShowItemCount.olShowTotalItemCount:&lt;br&gt;            &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// Display the total number of items&lt;br&gt;&lt;/font&gt;            &lt;font color="#0000ff"&gt;if&lt;/font&gt; (folder.Items.Count &amp;gt; 0)&lt;br&gt;                newNode.Text += &amp;quot; (&amp;quot; + folder.Items.Count + &amp;quot;)&amp;quot;;&lt;br&gt;            &lt;font color="#0000ff"&gt;break&lt;/font&gt; ;&lt;br&gt;        &lt;font color="#0000ff"&gt;case&lt;/font&gt; OlShowItemCount.olShowUnreadItemCount:&lt;br&gt;            &lt;/font&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// Display only the number of unread items&lt;br&gt;&lt;/font&gt;            &lt;font color="#0000ff"&gt;if&lt;/font&gt; (folder.UnReadItemCount &amp;gt; 0)&lt;br&gt;                newNode.Text += &amp;quot; (&amp;quot; + folder.UnReadItemCount + &amp;quot;)&amp;quot;;&lt;br&gt;            &lt;font color="#0000ff"&gt;break&lt;/font&gt; ;&lt;br&gt;    }&lt;br&gt;    &lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#008000"&gt;// If folder has any subfolders, create a dummy node beneath it. This is&lt;br&gt;    // used so that the node will have the nice plus (+) sign next to it&lt;br&gt;    // so the user will know there are subfolders. This Dummy node will be&lt;br&gt;    // removed once the folder is actually expanded&lt;br&gt;&lt;/font&gt;    &lt;font color="#0000ff"&gt;if&lt;/font&gt; (folder.Folders.Count &amp;gt; 0)&lt;br&gt;        newNode.Nodes.Add(new TreeNode(DummyNode));&lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New, Courier, Monospace"&gt;    &lt;font color="#0000ff"&gt;return&lt;/font&gt; newNode;&lt;br&gt;}&lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;font color="#0000ff"&gt;private const string&lt;/font&gt; DummyNode = &amp;quot;{1194595F-CAF7-474b-8972-CF143F097243}&amp;quot;;&lt;br&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt; Hashtable nodeToFolder   = &lt;font color="#0000ff"&gt;new&lt;/font&gt; Hashtable();&lt;br&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt; Hashtable folderToNode   = &lt;font color="#0000ff"&gt;new&lt;/font&gt; Hashtable();&lt;br&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt; Hashtable folderExpanded = &lt;font color="#0000ff"&gt;new&lt;/font&gt; Hashtable();&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4287375271627483618&amp;page=RSS%3a+Populating+a+TreeView+with+Outlook+folders&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=saguiitay.spaces.live.com&amp;amp;GT1=saguiitay"&gt;</description><comments>http://saguiitay.spaces.live.com/Blog/cns!3B7FD118142669E2!657.entry#comment</comments><guid isPermaLink="true">http://saguiitay.spaces.live.com/Blog/cns!3B7FD118142669E2!657.entry</guid><pubDate>Wed, 06 Sep 2006 13:25:00 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!657/comments/feed.rss</wfw:commentRss><wfw:comment>http://saguiitay.spaces.live.com/Blog/cns!3B7FD118142669E2!657.entry#comment</wfw:comment><dcterms:modified>2006-09-06T13:25:00Z</dcterms:modified></item><item><title>Working with MAPI Items</title><link>http://saguiitay.spaces.live.com/Blog/cns!3B7FD118142669E2!650.entry</link><description>&lt;div&gt;
&lt;p&gt;While the Outlook objects expose most of the properties of the items they represent, sometime they miss the exact field that you need. In this post I'll show you the very basics in retrieving information from the MAPI object that your CDO object represent.
&lt;p&gt;Assuming that you have an Outlook mail item, you need to convert it to a MAPI object. First well need to have a &lt;font face="Courier New, Courier, Monospace"&gt;MAPI.Session &lt;/font&gt;object:
&lt;p&gt;&lt;code&gt;MAPI.Session session = &lt;font color="#0000ff"&gt;new &lt;/font&gt;MAPI.SessionClass();&lt;br&gt;session.Logon(&lt;font color="#0000ff"&gt;null&lt;/font&gt;, &lt;font color="#0000ff"&gt;null&lt;/font&gt;, &lt;font color="#0000ff"&gt;false&lt;/font&gt;, &lt;font color="#0000ff"&gt;false&lt;/font&gt;, &lt;font color="#0000ff"&gt;null&lt;/font&gt;, &lt;font color="#0000ff"&gt;true&lt;/font&gt;, Missing.Value);&lt;/code&gt;
&lt;p&gt;And now to the actual conversion, which is basically a request for the MAPI object, according to its &lt;font face="Courier New, Courier, Monospace"&gt;EntryID&lt;/font&gt;:
&lt;p&gt;&lt;code&gt;MAPI.Message message = (MAPI.Message)session.GetMessage(item.EntryID, Missing.Value);&lt;/code&gt;
&lt;p&gt;Now that we have our &lt;font face="Courier New, Courier, Monospace"&gt;MAPI.Message&lt;/font&gt;, well get all its properties (called fields), then well fish out of them the specific required field. After that, you can just get the fields value, and type:
&lt;p&gt;&lt;code&gt;MAPI.Fields fields = message.Fields &lt;font color="#0000ff"&gt;as &lt;/font&gt;MAPI.Fields;&lt;br&gt;MAPI.Field field = fields.get_Item(MAPI.CdoPropTags.CdoPR_SUBJECT, Missing.Value) &lt;font color="#0000ff"&gt;as &lt;/font&gt;MAPI.Field;&lt;br&gt;Console.WriteLine(field.Type.ToString());&lt;br&gt;Console.WriteLine(field.Value.ToString());&lt;/code&gt;
&lt;p&gt;In the above example weve retrieved the items subject. Nothing fancy here, since we could have just as easily get that from the Outlook object. However, if youll have a closer look at the &lt;font face="Courier New, Courier, Monospace"&gt;MAPI.CdoPropTags &lt;/font&gt;enumeration, youll be able to find many more fields that are not exposed. You can see the values of the enum and the meanings of the different type in a file called MAPITags.h&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4287375271627483618&amp;page=RSS%3a+Working+with+MAPI+Items&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=saguiitay.spaces.live.com&amp;amp;GT1=saguiitay"&gt;</description><comments>http://saguiitay.spaces.live.com/Blog/cns!3B7FD118142669E2!650.entry#comment</comments><guid isPermaLink="true">http://saguiitay.spaces.live.com/Blog/cns!3B7FD118142669E2!650.entry</guid><pubDate>Wed, 06 Sep 2006 12:08:39 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!650/comments/feed.rss</wfw:commentRss><wfw:comment>http://saguiitay.spaces.live.com/Blog/cns!3B7FD118142669E2!650.entry#comment</wfw:comment><dcterms:modified>2006-09-06T12:08:39Z</dcterms:modified></item></channel></rss>