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
Really its very helpful. Though it was in VB.net, it helped a lot.
Thanx.
-I khan
This sample is also available in C#. Plese see the Available downloads section.