When an Outlook user composes and sends a message using either Rich Text Format or HTML Format, Outlook automagically generates a file, winmail.dat, and attaches it to the end of the email. The winmail.dat contains the rich text body and original attachments. EAGetMail provides the TNEF parser to decode the winmail.dat. With this feature, you application has the highly compatibility with the outlook email.
Example
[Visual Basic, C#] The following example demonstrates how to decode the winmail.dat attachment. To get the full samples of EAGetMail, please refer to Samples section.
[Visual Basic] Dim oMail As New Mail("TryIt") oMail.Load("c:\test.eml", False) Dim atts() As Attachment = oMail.Attachments Dim tempFolder As String = "c:\temp" Dim count As Integer = atts.Length If (Not System.IO.Directory.Exists(tempFolder)) Then System.IO.Directory.CreateDirectory(tempFolder) End If For i As Integer = 0 To count - 1 Dim att As Attachment = atts(i) 'this attachment is in OUTLOOK RTF format (TNEF), decode it here. If (String.Compare(att.Name, "winmail.dat") = 0) Then Dim tatts() As Attachment Try tatts = Mail.ParseTNEF(att.Content, True) Dim y As Integer = tatts.Length For x As Integer = 0 To y - 1 Dim tatt As Attachment = tatts(x) Dim tattname As String = String.Format("{0}\{1}", tempFolder, tatt.Name) tatt.SaveAs(tattname, True) Next Catch ep As Exception MessageBox.Show(ep.Message) End Try Else Dim attname As String = String.Format("{0}\{1}", tempFolder, att.Name) att.SaveAs(attname, True) End If Next
[C#] Mail oMail = new Mail("TryIt"); oMail.Load("c:\\test.eml", false); Attachment [] atts = oMail.Attachments; int count = atts.Length; string tempFolder = "c:\\temp"; if(!System.IO.Directory.Exists(tempFolder)) System.IO.Directory.CreateDirectory(tempFolder); for(int i = 0; i < count; i++) { Attachment att = atts[i]; //this attachment is in OUTLOOK RTF format (TNEF), decode it here. if(String.Compare(att.Name, "winmail.dat") == 0) { Attachment[] tatts = null; try { tatts = Mail.ParseTNEF(att.Content, true); } catch(Exception ep) { MessageBox.Show(ep.Message); continue; } int y = tatts.Length; for(int x = 0; x < y; x++) { Attachment tatt = tatts[x]; string tattname = String.Format("{0}\\{1}", tempFolder, tatt.Name); tatt.SaveAs(tattname , true); } continue; } string attname = String.Format("{0}\\{1}", tempFolder, att.Name); att.SaveAs(attname , true); }
Parse TNEF (winmail.dat) by DecodeTNEF method
In EAGetMail 4.5, a new method named DecodeTNEF is introduced. It is easier to parse TNEF attachment. Please have a look at the following example codes:
[Visual Basic - Parse Attachment] Imports EAGetMail Public Sub ParseAttachment() Dim oMail As New Mail("TryIt") oMail.Load("c:\test.eml", False) ' Decode winmail.dat (TNEF) automatically oMail.DecodeTNEF() Dim atts() As Attachment = oMail.Attachments Dim tempFolder As String = "c:\temp" Dim count As Integer = atts.Length If (Not System.IO.Directory.Exists(tempFolder)) Then System.IO.Directory.CreateDirectory(tempFolder) End If For i As Integer = 0 To count - 1 Dim att As Attachment = atts(i) Dim attname As String = String.Format("{0}\{1}", tempFolder, att.Name) att.SaveAs(attname, True) Next End Sub
[C# - Parse Attachment] using System; using System.Collections; using EAGetMail; public void ParseAttachment() { Mail oMail = new Mail("TryIt"); oMail.Load("c:\\test.eml", false); // Decode winmail.dat (TNEF) automatically oMail.DecodeTNEF(); Attachment [] atts = oMail.Attachments; int count = atts.Length; string tempFolder = "c:\\temp"; if(!System.IO.Directory.Exists(tempFolder)) System.IO.Directory.CreateDirectory(tempFolder); for(int i = 0; i < count; i++) { Attachment att = atts[i]; string attname = String.Format("{0}\\{1}", tempFolder, att.Name); att.SaveAs(attname , true); } }
[C++ - Parse Attachment] using namespace System; using namespace EAGetMail; Void ParseAttachment() { Mail ^oMail = gcnew Mail("TryIt"); oMail->Load("c:\\test.eml", false); // Decode winmail.dat (TNEF) automatically oMail->DecodeTNEF(); array<Attachment^> ^atts= oMail->Attachments; int count = atts->Length; String^ tempFolder = "c:\\temp"; if(!System::IO::Directory::Exists(tempFolder)) System::IO::Directory::CreateDirectory(tempFolder); for(int i = 0; i < count; i++) { Attachment ^att = atts[i]; String ^attname = String::Format("{0}\\{1}", tempFolder, att->Name); att->SaveAs(attname, true); } }
[JScript - Parse Attachment] function ParseAttachment() { var oMail:Mail = new Mail("TryIt"); oMail.Load("c:\\test.eml", false); // Decode winmail.dat (TNEF) automatically oMail.DecodeTNEF(); var atts:Attachment[] = oMail.Attachments; var count:int = atts.Length; var tempFolder:String = "c:\\temp"; if(!System.IO.Directory.Exists(tempFolder)) System.IO.Directory.CreateDirectory(tempFolder); for(var i:int = 0; i < count; i++) { var att:Attachment = atts[i]; var attname:String = String.Format("{0}\\{1}", tempFolder, att.Name); att.SaveAs(attname , true); } }
See Also
Using EAGetMail POP3 and IMAP4 Component
User Authentication and SSL Connection
Enable TLS 1.2 on Windows XP/2003/2008/7/2008 R2
Using Gmail IMAP4 OAUTH
Using Gmail/GSuite Service Account + IMAP4 OAUTH
Using Office365 EWS OAUTH
Using Office365 EWS OAUTH in Background Service
Using Hotmail IMAP4 OAUTH
Digital Signature and E-mail Encryption/Decryption
Unique Identifier (UIDL) in POP3 and IMAP4 protocol
Parse Bounced Email (delivery-report)
EAGetMail Namespace References
EAGetMail POP3 and IMAP4 Component Samples
Online Tutorials
Parse winmail.dat (TNEF/MAPI) in C# - Tutorial
Parse winmail.dat (TNEF/MAPI) in VB.NET - Tutorial
Parse winmail.dat (TNEF/MAPI) in C++/CLI - Tutorial