{"id":2009,"date":"2011-10-10T10:03:14","date_gmt":"2011-10-10T08:03:14","guid":{"rendered":"http:\/\/www.limilabs.com\/blog\/?p=2009"},"modified":"2013-05-21T20:55:52","modified_gmt":"2013-05-21T18:55:52","slug":"how-to-access-to-cc-bcc-fields","status":"publish","type":"post","link":"https:\/\/www.limilabs.com\/blog\/how-to-access-to-cc-bcc-fields","title":{"rendered":"How to access To, Cc, Bcc fields"},"content":{"rendered":"<p>IMail To, Cc, Bcc and ReplyTo properties are of <em>IList&lt;MailAddress&gt;<\/em> type (that is <em>IList Of MailAddress<\/em> in VB.NET).<\/p>\n<p>The reason for this, is to handle not only regular mailboxes but also <strong>email groups<\/strong>.<\/p>\n<p>In those collections you can find two kinds of objects:<\/p>\n<ul>\n<li><em>MailBox<\/em> &#8211; which represents single mailbox (e.g.  &#8220;John&#8221; &lt;john@example.org&gt;),<\/li>\n<li><em>MailGroup<\/em> &#8211; which represents group of email addresses (e.g.  Accounting: &lt;pat@example.org&gt;, &#8220;John&#8221; &lt;john@example.com&gt;; ).<\/li>\n<\/ul>\n<h2>Limilabs.Mail.Headers namespace<\/h2>\n<p>First remember that you need to import <em>Limilabs.Mail.Headers<\/em> namespace:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ C#\r\n\r\nusing Limilabs.Mail.Headers;\r\n<\/pre>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\n' VB.NET\r\n\r\nImports Limilabs.Mail.Headers\r\n<\/pre>\n<h2>GetMailboxes method<\/h2>\n<p>The simplest way to access actual email addresses is to use overloaded <strong>GetMailboxes<\/strong> method. <\/p>\n<p>This method returns all mailboxes represented by an email address: in case of <em>MailGroup <\/em>it returns <strong>all mailboxes represented by the group and all child groups<\/strong>, in case of <em>MailBox<\/em> returns a list containing a single mailbox:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ C#\r\n\r\nIMail mail = ...;\r\nforeach (MailAddress address in mail.To)\r\n{\r\n    foreach (MailBox mailbox in address.GetMailboxes())\r\n    {\r\n        Console.WriteLine(&quot;{0} &lt;{1}&gt;&quot;, mailbox.Name, mailbox.Address);\r\n    }    \r\n}\r\n<\/pre>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\n' VB.NET\r\n\r\nDim mail As IMail = ...\r\nFor Each address As MailAddress In mail.To\r\n    For Each mailbox As MailBox In address.GetMailboxes()\r\n        Console.WriteLine(&quot;{0} &lt;{1}&gt;&quot;, mailbox.Name, mailbox.Address)\r\n    Next\r\nNext\r\n<\/pre>\n<p>You can also use LINQ:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ C#\r\n\r\nIMail mail = ...;\r\nvar mailboxes = email.To.SelectMany(address =&gt; address.GetMailboxes());  \r\n<\/pre>\n<h2>Ignore groups<\/h2>\n<p>If for some reason you want to ignore <em>MailGroups<\/em> you can use following code:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ C#\r\n\r\nIMail mail = ...;\r\nforeach (MailBox mailbox in mail.To.OfType&lt;MailBox&gt;())\r\n{\r\n    Console.WriteLine(&quot;{0} &lt;{1}&gt;&quot;, mailbox.Name, mailbox.Address);\r\n}\r\n<\/pre>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\n' VB.NET\r\n\r\nDim mail As IMail = ...\r\nFor Each mailbox As MailBox In mail.&#x5B;To].OfType(Of MailBox)()\r\n\tConsole.WriteLine(&quot;{0} &lt;{1}&gt;&quot;, mailbox.Name, mailbox.Address)\r\nNext\r\n<\/pre>\n<h2>Extract all mailboxes<\/h2>\n<p>Here are sample functions that <strong>print all mailboxes<\/strong> (including those in groups) to string:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ C#\r\n\r\nprivate string PrintMailboxes(IEnumerable&lt;MailAddress&gt; addresses)\r\n{\r\n    List&lt;MailBox&gt; mailboxes = new List&lt;MailBox&gt;();\r\n    foreach (MailAddress address in addresses)\r\n    {\r\n        mailboxes.AddRange(address.GetMailboxes());\r\n    }\r\n    return string.Join(&quot;, &quot;, mailboxes.ConvertAll(\r\n        x =&gt; string.Format(&quot;'{0}' &lt;{1}&gt;&quot;, x.Name, x.Address)).ToArray());\r\n}\r\n<\/pre>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\n' VB.NET\r\nImports Limilabs.Mail.Headers\r\n\r\nPrivate Function PrintMailboxes(addresses As IEnumerable(Of MailAddress)) As String\r\n    Dim mailboxes As New List(Of MailBox)()\r\n    For Each address As MailAddress In addresses\r\n    \tmailboxes.AddRange(address.GetMailboxes())\r\n    Next\r\n    Return String.Join(&quot;, &quot;, mailboxes.ConvertAll( _\r\n        Function(x) String.Format(&quot;'{0}' &lt;{1}&gt;&quot;, x.Name, x.Address)).ToArray())\r\nEnd Function\r\n<\/pre>\n<h2>Handle groups and mailboxes<\/h2>\n<p>If you need to <strong>handle email groups differently<\/strong> than regular mailboxes, you need to use <em>is <\/em>operator:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ C#\r\n\r\nprivate string PrintAddresses(IEnumerable&lt;MailAddress&gt; addresses)\r\n{\r\n    List&lt;string&gt; parts = new List&lt;string&gt;();\r\n    foreach (MailAddress address in addresses)\r\n    {\r\n        if (address is MailGroup)\r\n        {\r\n            MailGroup group = (MailGroup)address;\r\n            parts.Add(string.Format(&quot;'{0}': ({1})&quot;,\r\n                group.Name,\r\n                PrintAddresses(group.Addresses))); \/\/ recursion\r\n        }\r\n        if (address is MailBox)\r\n        {\r\n            MailBox mailbox = (MailBox)address;\r\n            parts.Add(string.Format(&quot;'{0}' &lt;{1}&gt;&quot;,\r\n                mailbox.Name,\r\n                mailbox.Address));\r\n        }\r\n    }\r\n    return string.Join(&quot;, &quot;, parts.ToArray());\r\n}\r\n<\/pre>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\n' VB.NET\r\n\r\nPrivate Function PrintAddresses(addresses As IEnumerable(Of MailAddress)) As String\r\n    Dim parts As New List(Of String)()\r\n    For Each address As MailAddress In addresses\r\n        If TypeOf address Is MailGroup Then\r\n            Dim group As MailGroup = DirectCast(address, MailGroup) ' recursion\r\n            parts.Add(String.Format(&quot;'{0}': ({1})&quot;, _\r\n                group.Name, _\r\n                PrintAddresses(group.Addresses)))\r\n        End If\r\n        If TypeOf address Is MailBox Then\r\n            Dim mailbox As MailBox = DirectCast(address, MailBox)\r\n            parts.Add(String.Format(&quot;'{0}' &lt;{1}&gt;&quot;, _\r\n                mailbox.Name, _\r\n                mailbox.Address))\r\n        End If\r\n    Next\r\n    Return String.Join(&quot;, &quot;, parts.ToArray())\r\nEnd Function\r\n<\/pre>\n<h2>Check if address list contains email<\/h2>\n<p>Finally here&#8217;s a helper function, you can use when, you want to know, <strong>if specified email address is in the recipients list<\/strong>:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ C#\r\n\r\nif (ContainsEmail(email.To, &quot;pat@example.com&quot;))\r\n{\r\n    \/\/ ...\r\n}\r\n\r\nprivate static bool ContainsEmail(IEnumerable&lt;MailAddress&gt; list, string email)\r\n{\r\n    foreach (MailAddress address in list)\r\n    {\r\n        if (address.GetMailboxes().ConvertAll(x =&gt; x.Address).Contains(email))\r\n            return true;\r\n    }\r\n    return false;\r\n}\r\n\r\n\/\/ Linq version:\r\nprivate static bool ContainsEmail(IEnumerable&lt;MailAddress&gt; list, string email)\r\n{\r\n    return list.Any(address =&gt; address.GetMailboxes().ConvertAll(\r\n        x =&gt; x.Address).Contains(email));\r\n}\r\n<\/pre>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\n' VB.NET\r\n\r\nIf ContainsEmail(email.&#x5B;To], &quot;pat@example.com&quot;) Then\r\n    ' ...\r\nEnd If\r\n\r\nPrivate Shared Function ContainsEmail(list As IEnumerable(Of MailAddress), email As String) As Boolean\r\n    For Each address As MailAddress In list\r\n        If address.GetMailboxes().ConvertAll(Function(x) x.Address).Contains(email) Then\r\n            Return True\r\n        End If\r\n    Next\r\n    Return False\r\nEnd Function\r\n\r\n' Linq version:\r\nPrivate Shared Function ContainsEmail(list As IEnumerable(Of MailAddress), email As String) As Boolean\r\n    Return list.Any(Function(address) address.GetMailboxes().ConvertAll( _\r\n        Function(x) x.Address).Contains(email))\r\nEnd Function\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>IMail To, Cc, Bcc and ReplyTo properties are of IList&lt;MailAddress&gt; type (that is IList Of MailAddress in VB.NET). The reason for this, is to handle not only regular mailboxes but also email groups. In those collections you can find two kinds of objects: MailBox &#8211; which represents single mailbox (e.g. &#8220;John&#8221; &lt;john@example.org&gt;), MailGroup &#8211; which [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[15,33,57],"class_list":["post-2009","post","type-post","status-publish","format-standard","hentry","category-mail-dll","tag-c","tag-email-component","tag-vb-net"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.limilabs.com\/blog\/wp-json\/wp\/v2\/posts\/2009"}],"collection":[{"href":"https:\/\/www.limilabs.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.limilabs.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.limilabs.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.limilabs.com\/blog\/wp-json\/wp\/v2\/comments?post=2009"}],"version-history":[{"count":9,"href":"https:\/\/www.limilabs.com\/blog\/wp-json\/wp\/v2\/posts\/2009\/revisions"}],"predecessor-version":[{"id":2615,"href":"https:\/\/www.limilabs.com\/blog\/wp-json\/wp\/v2\/posts\/2009\/revisions\/2615"}],"wp:attachment":[{"href":"https:\/\/www.limilabs.com\/blog\/wp-json\/wp\/v2\/media?parent=2009"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.limilabs.com\/blog\/wp-json\/wp\/v2\/categories?post=2009"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.limilabs.com\/blog\/wp-json\/wp\/v2\/tags?post=2009"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}