Recently some of the IMail interface address properties changed its types. The reason for this was to handle email groups nicely.
Now To, Cc, Bcc and ReplyTo are of IList<MailAddress> type (That is IList Of MailAddress in VB.NET).
In those collections you can find two kinds of objectes:
- MailBox class which represents single mailbox,
- MailGroup class which represents group of email addresses.
Here’s the simplest code that prints only mailboxes:
// C#
using Lesnikowski.Mail.Headers;
private string PrintMailboxes(IEnumerable<MailAddress> addresses)
{
List<string> parts = new List<string>();
foreach (MailBox mailbox in addresses.OfType<MailBox>())
{
parts.Add(string.Format("{0} <{1}>",
mailbox.Name,
mailbox.Address));
}
return string.Join(", ", parts.ToArray());
}
' VB.NET
Imports Lesnikowski.Mail.Headers
Private Function PrintMailboxes(addresses As IEnumerable(Of MailAddress)) As String
Dim parts As New List(Of String)()
For Each mailbox As MailBox In addresses.OfType(Of MailBox)()
parts.Add(String.Format("{0} <{1}>", _
mailbox.Name, _
mailbox.Address))
Next
Return String.Join(", ", parts.ToArray())
End Function
Here’s a slightly more complicated version that handles groups also:
// C#
using Lesnikowski.Mail.Headers;
private string PrintAllAddresses(IEnumerable<MailAddress> addresses)
{
List<string> parts = new List<string>();
foreach (MailAddress address in addresses)
{
if (address is MailGroup)
{
MailGroup group = (MailGroup)address;
parts.Add(string.Format("{0} ({1})",
group.Name,
PrintAllAddresses(group.Addresses))); // recursion
}
if (address is MailBox)
{
MailBox mailbox = (MailBox)address;
parts.Add(string.Format("{0} <{1}>",
mailbox.Name,
mailbox.Address));
}
}
return string.Join(", ", parts.ToArray());
}
' VB.NET
Imports Lesnikowski.Mail.Headers
Private Function PrintAllAddresses(addresses As IEnumerable(Of MailAddress)) As String
Dim parts As New List(Of String)()
For Each address As MailAddress In addresses
If TypeOf address Is MailGroup Then
Dim group As MailGroup = DirectCast(address, MailGroup)
parts.Add(String.Format("{0} ({1})", _
group.Name, _
PrintAllAddresses(group.Addresses))) ' note the recursion
End If
If TypeOf address Is MailBox Then
Dim mailbox As MailBox = DirectCast(address, MailBox)
parts.Add(String.Format("{0} <{1}>", _
mailbox.Name, _
mailbox.Address))
End If
Next
Return String.Join(", ", parts.ToArray())
End Function