In previous section, I introduced how to parse winmail.dat. In this section, I will introduce how to parse email body and attachment, then convert email to a HTML page and display it using Web browser in VB.NET.
After the email was converted to HTML page, you can browse it with web browser. You can get everything in the HTML page such as From, To, Cc, Subject, Date, Attachments and Embedded images.
Note
Remarks: All of examples in this section are based on first section: A simple VB.NET project. To compile and run the following example codes successfully, please click here to learn how to create the test project and add reference to your project.
The following example codes demonstrate how to use EAGetMail POP3 component to convert email to HTML page.
Note
To get the full sample projects, please refer to Samples section.
Imports System.Collections
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.IO
Imports EAGetMail 'imports EAGetMail namespace
Module Module1
    Private Function _formatHtmlTag(ByVal src As String) As String
        src = src.Replace(">", ">")
        src = src.Replace("<", "<")
        Return src
    End Function
    Private Function _formatAddresses(ByVal addresses As MailAddress(), ByVal prefix As String) As String
        If addresses.Length = 0 Then
            Return ""
        End If
        Dim buffer As StringBuilder = New StringBuilder()
        buffer.Append(String.Format("<b>{0}:</b> ", prefix))
        For i As Integer = 0 To addresses.Length - 1
            buffer.Append(_formatHtmlTag(addresses(i).ToString()))
            If i < addresses.Length - 1 Then
                buffer.Append("; ")
            End If
        Next
        buffer.Append("<br>")
        Return buffer.ToString()
    End Function
    ' We generate a html + attachment folder for every email, once the html is create,
    ' next time we don't need to parse the email again.
    Private Sub _GenerateHtmlForEmail(ByVal emlFile As String, ByVal htmlFile As String, ByVal attachmentFolder As String)
        Dim mail As Mail = New Mail("TryIt")
        mail.Load(emlFile, False)
        If mail.IsEncrypted Then
            Try
                ' This email is encrypted, we decrypt it by user default certificate.
                ' you can also use specified certificate like this
                ' cert = new Certificate()
                ' cert.Load("c:\test.pfx", "pfxpassword", Certificate.CertificateKeyLocation.CRYPT_USER_KEYSET)
                ' mail = mail.Decrypt(cert)
                mail = mail.Decrypt(Nothing)
            Catch ep As Exception
                Console.WriteLine(ep.Message)
            End Try
        End If
        If mail.IsSigned Then
            Try
                ' This email is digital signed.
                Dim signerCertificate As Certificate = mail.VerifySignature()
                Console.WriteLine("This email contains a valid digital signature.")
            Catch ep As Exception
                Console.WriteLine(ep.Message)
            End Try
        End If
        ' Decode winmail.dat (Outlook TNEF Stream) automatically.
        ' also convert RTF body to HTML body automatically
        mail.DecodeTNEF()
        Dim html As String = mail.HtmlBody
        Dim header As StringBuilder = New StringBuilder()
        header.Append("<font face=""Courier New,Arial"" size=2>")
        header.Append("<b>From:</b> " & _formatHtmlTag(mail.From.ToString()) & "<br>")
        header.Append(_formatAddresses(mail.[To], "To"))
        header.Append(_formatAddresses(mail.Cc, "Cc"))
        header.Append(String.Format("<b>Subject:</b>{0}<br>" & vbCrLf, _formatHtmlTag(mail.Subject)))
        Dim attachments As Attachment() = mail.Attachments
        If attachments.Length > 0 Then
            If Not Directory.Exists(attachmentFolder) Then
                Directory.CreateDirectory(attachmentFolder)
            End If
            header.Append("<b>Attachments:</b> ")
            For i As Integer = 0 To attachments.Length - 1
                Dim attachment As Attachment = attachments(i)
                Dim attachmentName As String = String.Format("{0}\{1}", attachmentFolder, attachment.Name)
                attachment.SaveAs(attachmentName, True)
                header.Append(String.Format("<a href=""{0}"" target=""_blank"">{1}</a> ", attachmentName, attachment.Name))
                If attachment.ContentID.Length > 0 Then
                    ' Show embedded image.
                    html = html.Replace("cid:" & attachment.ContentID, attachmentName)
                End If
            Next
        End If
        ' Change original meta header encoding to utf-8
        Dim reg As Regex = New Regex("(<meta[^>]*charset[ " & vbTab & "]*=[ " & vbTab & """]*)([^<> " & vbCrLf & """]*)", RegexOptions.Multiline Or RegexOptions.IgnoreCase)
        html = reg.Replace(html, "$1utf-8")
        If Not reg.IsMatch(html) Then
            header.Insert(0, "<meta HTTP-EQUIV=""Content-Type"" Content=""text/html; charset=utf-8"">")
        End If
        html = header.ToString() & "<hr>" & html
        Using stream As FileStream = New FileStream(htmlFile, FileMode.Create, FileAccess.Write, FileShare.None)
            Dim buffer As Byte() = Encoding.UTF8.GetBytes(html)
            stream.Write(buffer, 0, buffer.Length)
            stream.Close()
        End Using
    End Sub
    Sub ConvertMailToHtml(ByVal fileName As String)
        Try
            Dim pos As Integer = fileName.LastIndexOf(".")
            Dim attachmentFolder As String = fileName.Substring(0, pos)
            Dim htmlFile As String = fileName.Substring(0, pos) & ".htm"
            If Not File.Exists(htmlFile) Then
                ' We haven't generate the html for this email, generate it now.
                _GenerateHtmlForEmail(fileName, htmlFile, attachmentFolder)
            End If
            Console.WriteLine("Please open {0} to browse your email", htmlFile)
        Catch ep As Exception
            Console.WriteLine(ep.Message)
        End Try
    End Sub
    Sub Main()
        Try
            ConvertMailToHtml("c:\my folder\test.eml")
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try
    End Sub
End Module
In EAGetMail installer, there are many samples demonstrate how to use Web browser control to display the email, I suggest that you download it and have a try
 
Next Section
At next section I will introduce how to parse Non-delivery report.
Appendix
Comments
If you have any comments or questions about above example codes, please click here to add your comments.