Click here to Skip to main content
Licence 
First Posted 22 Nov 2003
Views 234,024
Bookmarked 153 times

.NET Connector for Microsoft Outlook

By | 19 Feb 2004 | Article
Export Microsoft Outlook data using XML DataSets and the Outlook COM Object Library.

Introduction

The Microsoft Outlook Connector is written in C# using the .NET 1.1 Framework. It attempts to abstract the data access with Microsoft Outlook and visual components using the data. Data from your Microsoft Outlook application can be exported to an XML file by simply checking the folder options and clicking Export. The source provides a simple example of mapping the COM object properties to a XML-friendly DataSet that could be used in any .NET application.

Background

This component for exporting Outlook objects stemmed from a couple years passively looking for a sync between my database and Outlook. I somehow stumbled on a VBA article on it (http://www.devasp.com/search/res/r9981.html) and decided to make a C# app to do the same.

Using the code

The primary function of the DataExportForm retrieves information from the user's Microsoft Outlook application via a custom connector which translates the Interop COM objects into basic DataSets. We should all be aware of how handy DataSets can be so lets look at how our form gets the information for the datagrid.

private DataSet getCheckedItemSet()
{
    DataSet ds = new DataSet();
    OutlookConnector outlook = new OutlookConnector();

    // setup progress bars and process selected folders
    pgFolderProgress.Value = 0;
    outlook.ItemProcessed += new OutlookItemProcessed(outlook_ItemProcessed);
    pgFolderProgress.Maximum = lstExportObjects.CheckedItems.Count;
    foreach (ListViewItem obj in lstExportObjects.CheckedItems)
    {
        pgFolderProgress.Value++;
        pgItemProgress.Value = 0;

        switch (obj.Index) 
        {
            case 0:
                pgItemProgress.Maximum = outlook.getFolderCount(
                    Outlook.OlDefaultFolders.olFolderCalendar);
                ds.Merge(outlook.getCalendarDataSet());
                break;
            case 1:
                pgItemProgress.Maximum = outlook.getFolderCount(
                    Outlook.OlDefaultFolders.olFolderContacts);
                ds.Merge(outlook.getContactDataSet());
                break;
            case 2:
                pgItemProgress.Maximum = outlook.getFolderCount(
                    Outlook.OlDefaultFolders.olFolderInbox);
                ds.Merge(outlook.getInboxDataSet());
                break;
            case 3:
                pgItemProgress.Maximum = outlook.getFolderCount(
                    Outlook.OlDefaultFolders.olFolderNotes);
                ds.Merge(outlook.getNoteDataSet());
                break;
            case 4:
                pgItemProgress.Maximum = outlook.getFolderCount(
                    Outlook.OlDefaultFolders.olFolderTasks);
                ds.Merge(outlook.getTaskDataSet());
                break;
            default:
                Debug.WriteLine("Unsupported Export: " + obj.Index);
                break;
        }
    }
    outlook.Dispose();
    return ds;
}

Now how exactly does the OutlookConnector get it? You'll have to download the source to see the finer details of handling the Interop connection. Rest assured that it implements the IDisposable interface and works through MAPI to retrieve Outlook folder information. All of the Outlook connectivity is handled on instantiation which makes retrieval pretty easy, as seen here in the OutlookConnector.getContactDataSet() method.

/// <summary>
/// Retrieves a list of all the Outlook Contacts.
/// </summary>
/// <returns>Contact Items DataSet</returns>
public DataSet getContactDataSet()
{
    Outlook.ContactItem item;
    DataSet rv = new DataSet();
    rv.DataSetName = "Contacts";
    rv.Tables.Add("Contact");
    rv.Tables[0].Columns.Add("FirstName");
    rv.Tables[0].Columns.Add("LastName");
    rv.Tables[0].Columns.Add("CompanyName");
    rv.Tables[0].Columns.Add("Email");
    rv.Tables[0].Columns.Add("HomePhone");
    rv.Tables[0].Columns.Add("WorkPhone");

    try
    {
        objFolder = objNamespace.GetDefaultFolder(
            Outlook.OlDefaultFolders.olFolderContacts);
        Debug.WriteLine(objFolder.Items.Count + " Contacts found.");
        foreach (System.Object _item in objFolder.Items) 
        {
            item = (Outlook.ContactItem) _item;
            rv.Tables[0].Rows.Add(new object[] {
                item.FirstName,
                item.LastName,
                item.CompanyName,
                item.Email1Address,
                item.HomeTelephoneNumber,
                item.BusinessTelephoneNumber
            });
            this.ItemProcessed();
        }
        Debug.WriteLine(rv.Tables[0].Rows.Count + " Contacts exported.");
    }
    catch (System.Exception e)
    {
        Console.WriteLine(e);
    }
    return rv;
}

Points of Interest

If your system does not have Microsoft Office Outlook 2003 you may have to change the References used by the "OutlookConnector" project. That is to say, if you received a build error described as "The type of namespace name 'Outlook' could not be found", you probably don't have Office 2003. Simply expand the project references, remove the afflicted items, and add the COM Library appropriate for your system. If someone has a dynamic way to handle this, I'd be curious to see you've done.

History

I wanted to limit this project to a single evening so it currently uses untyped DataSets. The real advantage of this application would come from using strong types and hooking in some DataAdapter(s) to really try to sync with some other system. I will probably end up tying in a MySQL data adapter in the coming weeks as time permits but if someone starts/finishes before I get to it, please let me know.

Version 1.1

Connector looping was switched to an incrementing localized integer since Office 10 does not implement a GetEnumerator() method. We have to use our own counter in a for loop instead. Also, here are some details on fixing your References between Office versions.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Mathias Taylor

Web Developer

United States United States

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionHow about processing any PST? PinmemberMatt Philmon6:35 14 Feb '06  
GeneralBUG inside OutlookItemBuilder class and resolution. PinmemberPreky21:51 6 Jul '05  
GeneralAlways return 1 item Pinmembersksandz1:08 8 Apr '05  
GeneralRe: Always return 1 item PinmemberCtrAltDel10:22 30 Apr '05  
GeneralRe: Always return 1 item Pinmembereyop@eyop.co.kr22:09 14 Sep '05  
GeneralRe: Always return 1 item PinmemberMember 33064026:58 1 Jan '08  
GeneralNullReferenceException when running the code Pinmemberpvsunil0:32 8 Apr '05  
I tried to execute the getting calendar items and contracts items from the code and i am always getting only the first record. In debug mode i have inserted a a string variable to get the exception and the exception you can see in this screenshot. Frown | :( http://www.guidant-cor.com/tempfiles/exceptionscreen.jpg
 
Can anybody help me with this. Please reply as when is the cause of the error.
Generalexporting e-mails of additional mailbox PinsussMagicGirL8316:24 30 Mar '05  
Generaldisplay the exported e-mails on a web page PinsussMagicGirL8313:38 30 Mar '05  
GeneralMS Outlook FAXMaker PinmemberFayeeg23:41 1 Feb '05  
Questionhow can i disbled prompt:A program is trying to access e-mail addresses you have stored in outlook Pinmembernazli4:18 17 Jan '05  
AnswerRe: how can i disbled prompt:A program is trying to access e-mail addresses you have stored in outlook PinmemberMathias Taylor17:32 8 Feb '05  
Generalexport error Pinmembertelynor22:53 24 Nov '04  
GeneralUpdated/Current Source Available at SourceForge PinsussMathias Taylor19:33 15 Nov '04  
GeneralRe: Updated/Current Source Available at SourceForge Pinmemberdude_401212:52 22 Dec '04  
GeneralRe: Updated/Current Source Available at SourceForge PinmemberMathias Taylor2:29 6 Feb '05  
GeneralCustomizing the Outlook 2003 New Message Form PinmemberGanesh Agrawal10:57 15 Oct '04  
GeneralgetAttachments Pinmembernazli21:42 3 Oct '04  
GeneralRe: getAttachments PinmemberPrakash Kalakoti1:27 7 Jun '05  
GeneralRe: getAttachments Pinmemberbhavna81623:08 23 Jan '07  
GeneralMailItem.SenderEmailAddress does not exist! Pinmembermiagao3:41 13 Sep '04  
GeneralOutlook2000 problem with GetEnumerator Pinmembermiagao5:23 7 Sep '04  
GeneralRe: Outlook2000 problem with GetEnumerator PinmemberNicholas Cardi5:48 7 Sep '04  
GeneralRe: Outlook2000 problem with GetEnumerator Pinmembermiagao3:37 13 Sep '04  
GeneralRe: Outlook2000 problem with GetEnumerator Pinmembertelynor2:01 25 Nov '04  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120528.1 | Last Updated 20 Feb 2004
Article Copyright 2003 by Mathias Taylor
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid