Dmitry Kostochko

HowTo: Exchange Data using the Outlook Attachments collection

Normally Outlook developers use the MailItem.UserProperties collection to send and receive some additional information with email messages. In this sample add-in for Microsoft Outlook, I suggest a slightly different approach – using the Attachments collection and such a powerful .NET feature as Serialization.

We will need a .NET class which we are going to serialize and send as attachment:

Public Class DataClass
    Public ID As String
    Public Name As String
    Public Discontinued As Boolean
    Public Count As Decimal
    Public [Date] As DateTime
End Class

In the OnClick event handler of a button located on a command bar or a ribbon tab of the Compose Inspector window, we create and initialize an instance of our class, serialize it and add to the Attachments collection:

Dim inspector As Outlook.Inspector = OutlookApp.ActiveInspector()
If inspector IsNot Nothing Then
    Try
        Dim item As Outlook.MailItem =
            DirectCast(inspector.CurrentItem, Outlook.MailItem)
        If item IsNot Nothing Then
            Try
                ' .NET object
                Dim obj As New DataClass()
                obj.ID = Guid.NewGuid().ToString()
                obj.Name = "My Name"
                obj.Discontinued = False
                obj.Count = 1000
                obj.[Date] = DateTime.Now
                ' serialization
                Dim TempFileTmp As String = Path.GetTempFileName()
                Dim TempFileXml As String = _
                    Path.ChangeExtension(TempFileTmp, "xml")
                If File.Exists(TempFileTmp) Then
                    File.Delete(TempFileTmp)
                End If
                Dim textWriter As TextWriter = New _
                    StreamWriter(TempFileXml)
                Dim serializer As New XmlSerializer(GetType(DataClass))
                serializer.Serialize(textWriter, obj)
                textWriter.Close()
                ' add to the Attachments collection
                item.Attachments.Add(TempFileXml, _
                    Outlook.OlAttachmentType.olByValue, _
                    Type.Missing, Type.Missing)
                File.Delete(TempFileXml)
            Finally
                Marshal.ReleaseComObject(item)
                item = Nothing
            End Try
        End If
    Finally
        Marshal.ReleaseComObject(inspector)
        inspector = Nothing
    End Try
End If

To display the received information, use an Advanced Outlook Form Region. In the ADXBeforeFormShow event handler, check if the current MailItem has any attachments, try to deserialize them, and in case the deserialization goes successfully, display the received data:

Dim success As Boolean = False
Dim inspector As Outlook.Inspector = _
    TryCast(InspectorObj, Outlook.Inspector)
If inspector IsNot Nothing Then
    Dim item As Outlook.MailItem =
        DirectCast(inspector.CurrentItem, Outlook.MailItem)
    If item IsNot Nothing Then
        Try
            If Not item.Sent Then
                Me.Visible = False
                Exit Sub
            End If
            If item.Attachments.Count > 0 Then
                For i As Integer = 1 To item.Attachments.Count
                    Dim TempFileTmp As String = Path.GetTempFileName()
                    Dim TempFileXml As String = _
                        Path.ChangeExtension(TempFileTmp, "xml")
                    If File.Exists(TempFileTmp) Then
                        File.Delete(TempFileTmp)
                    End If
                    item.Attachments.Item(i).SaveAsFile(TempFileXml)
                    Try
                        Dim newObj As AddinModule.DataClass
                        Dim fileStream As New _
                            FileStream(TempFileXml, FileMode.Open)
                        Try
                            Dim newSerialization As New _
                                XmlSerializer(_
                                    GetType(AddinModule.DataClass))
                            newObj = DirectCast(_
                                newSerialization.Deserialize(_
                                    fileStream), AddinModule.DataClass)
                            label1.Text = "ID = " & newObj.ID
                            label2.Text = "Name = " & newObj.Name
                            label3.Text = "Discontinued = " & _
                                newObj.Discontinued.ToString()
                            label4.Text = "Count = " & _
                                newObj.Count.ToString()
                            label5.Text = "Date = " & _
                                newObj.[Date].ToString()
                            success = True
                        Finally
                            fileStream.Close()
                        End Try
                    Catch
                        ' skip exception (serialization)
                    End Try
                    File.Delete(TempFileXml)
                    If success Then Exit For
                Next
            End If
            If Not success Then
                Me.Visible = False
                Exit Sub
            End If
        Finally
            Marshal.ReleaseComObject(item)
            item = Nothing
        End Try
    End If
End If

Here we are!

You may also be interested in:

How to program an Outlook COM add-in step-by-step

Available downloads:

This sample add-in was developed using Add-in Express 2008 for Microsoft Office and .net

C# sample Outlook add-in for VS 2005
VB.NET sample Outlook add-in for VS 2005

2 Comments

  • I Khan says:

    Really its very helpful. Though it was in VB.net, it helped a lot.
    Thanx.

    -I khan

  • Dmitry Kostochko (Add-in Express Team) says:

    This sample is also available in C#. Plese see the Available downloads section.

Post a comment

Have any questions? Ask us right now!