Mail.ParseTNEF Method

Parses the winmail.dat (TNEF attachment).

[Visual Basic 6.0]
Public Function ParseTNEF( _
    data As Variant, _
    IncludeRTFBody As Boolean 
) As Variant
[Visual C++]
public: HRESULT ParseTNEF(
    VARIANT data,
    VARIANT_BOOL IncludeRTFBody,
    VARIANT* pVal


The binary data of winmail.dat
If this parameter is false, the return value (array) doesn't contain the RTF body; If this parameter is true, the return value (array) contains the RTF body as an attachment.

Return Value

A Attachment array containing all files in winmail.dat(TNEF).


[Visual Basic 6.0, Visual C++] The following example demonstrates how to deal with the winmail.dat attachment. To get the full samples of EAGetMail, please refer to Samples section.

[Visual Basic 6.0]
Private Sub ParseTNEF()
On Error GoTo ErrorHandle
    Dim oMail As New EAGetMailObjLib.Mail
    Dim oTools As New EAGetMailObjLib.Tools
    oMail.LicenseCode = "TryIt"
    oMail.LoadFile "c:\test.eml", False
    Dim tempFolder As String
    tempFolder = "c:\temp"
    Dim i, Count
    Dim atts
    atts = oMail.Attachments
    i = LBound(atts)
    Count = UBound(atts)
    If (Count >= i) Then
        If Not oTools.ExistFile(tempFolder) Then
            oTools.CreateFolder (tempFolder)
        End If
        For i = LBound(atts) To Count
            Dim att As Attachment
            Set att = atts(i)
            'this attachment is in OUTLOOK RTF format, decode it here.
            If LCase(att.Name) = "winmail.dat" Then
                Dim tatts
                tatts = oMail.ParseTNEF(att.Content, True)
                For x = LBound(tatts) To UBound(tatts)
                        Dim tatt As Attachment
                        Set tatt = tatts(x)
                        Dim tattname As String
                        tattname = tempFolder & "\" & tatt.Name
                        tatt.SaveAs tattname, True
                Dim attname
                attname = tempFolder & "\" & att.Name
                att.SaveAs attname, True
            End If
    End If
    Exit Sub
    MsgBox Err.Description

End Sub

[Visual C++] //if you do not use MFC, please add this line to support CString type. #include <atlstr.h> #include "eagetmailobj.tlh" using namespace EAGetMailObjLib; void ParseTNEF() { IMailPtr oMail = NULL; CString tempFolder = _T("c:\\temp"); try { oMail.CreateInstance(__uuidof(EAGetMailObjLib::Mail)); oMail->LicenseCode = _T("TryIt"); oMail->LoadFile(_T("c:\\test.eml"), VARIANT_FALSE); LONG UBound = 0, LBound = 0; _variant_t atts = oMail->Attachments; SAFEARRAY *psa = atts.parray; SafeArrayGetLBound(psa, 1, &LBound); SafeArrayGetUBound(psa, 1, &UBound); INT count = UBound-LBound+1; ::CreateDirectory(tempFolder.GetString(), NULL); for(long i = LBound; i <= UBound; i++) { _variant_t vtAtt; SafeArrayGetElement(psa, &i, &vtAtt); IAttachmentPtr pAtt; vtAtt.pdispVal->QueryInterface(__uuidof(IAttachment), (void**)&pAtt); CString name = (TCHAR*)pAtt->Name; //this attachment is in OUTLOOK RTF format, decode it here. if(name.CompareNoCase(_T("winmail.dat")) == 0) { //this attachment is in OUTLOOK RTF format, decode it here. _variant_t tatts; try { tatts = oMail->ParseTNEF(pAtt->Content, VARIANT_TRUE); } catch(_com_error &ep) { MessageBox(NULL, (TCHAR*)ep.Description(), NULL, MB_OK); continue; } long XLBound = 0, XUBound = 0; SAFEARRAY* tpsa = tatts.parray; SafeArrayGetLBound(tpsa, 1, &XLBound); SafeArrayGetUBound(tpsa, 1, &XUBound); for(long x = XLBound; x <= XUBound; x++) { _variant_t vttAtt; SafeArrayGetElement(tpsa, &x, &vttAtt); IAttachmentPtr ptAtt; vttAtt.pdispVal->QueryInterface(__uuidof(IAttachment), (void**)&ptAtt); CString tattname = tempFolder; tattname.Append(_T("\\")); tattname.Append((TCHAR*)ptAtt->Name); ptAtt->SaveAs(tattname.GetString(), VARIANT_TRUE); } continue; } CString attname = tempFolder; attname.Append(_T("\\")); attname.Append((TCHAR*)pAtt->Name); pAtt->SaveAs(attname.GetString(), VARIANT_TRUE); } } catch(_com_error &ep) { MessageBox(NULL, (TCHAR*)ep.Description(), _T("Error"), MB_OK); } }


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.
If you just want to decode winmail.dat in current mail instance, please use Mail.DecodeTNEF Method instead of ParseTNEF method.

See Also

Mail.DecodeTNEF Method