Skip to main content
Email Password   helpLost your password?

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.

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
GeneralI tried to execute this code, it is giving an error "does not contain a definition for 'SenderEmailAddress'" Pin
Member 3979793
20:29 24 Jun '09  
QuestionMicrosoft.Outlook11 missing Pin
disire
23:21 8 Dec '08  
QuestionHow can we do this in Asp.Net Pin
SKP24
5:13 25 Mar '08  
Generalconvert "X.400/X.500 e-mail adress" into "Smtp e-mail adress" Pin
jackyontherock
6:11 10 Aug '07  
GeneralExtracting/Importing [modified] Pin
ClaudeX
23:57 6 Jun '07  
GeneralOutlook Namespace missing Pin
MarkChimes2
14:17 2 Feb '07  
GeneralRe: Outlook Namespace missing Pin
MarkChimes2
14:53 2 Feb '07  
GeneralExisting Outlook window closes ! Pin
ccangaroo
4:29 24 Aug '06  
GeneralA bug Pin
nadav74
10:38 1 Jul '06  
GeneralRe: A bug [modified] Pin
robocato
2:19 31 Aug '06  
GeneralPlease Help Pin
Ashisvadada
18:36 14 Jun '06  
GeneralProblem ??? Pin
Pascal Groulx
13:06 16 May '06  
GeneralgoUsing this code with Exchange Pin
DeborahK
10:18 28 Mar '06  
GeneralDrag & Drop outlook contacts Pin
NewbieDude
21:22 16 Mar '06  
GeneralProblem Pin
pro_86
12:59 18 Feb '06  
GeneralHow about processing any PST? Pin
Matt Philmon
7:35 14 Feb '06  
GeneralBUG inside OutlookItemBuilder class and resolution. Pin
Preky
22:51 6 Jul '05  
GeneralAlways return 1 item Pin
sksandz
2:08 8 Apr '05  
GeneralRe: Always return 1 item Pin
CtrAltDel
11:22 30 Apr '05  
GeneralRe: Always return 1 item Pin
eyop@eyop.co.kr
23:09 14 Sep '05  
GeneralRe: Always return 1 item Pin
Member 3306402
7:58 1 Jan '08  
GeneralNullReferenceException when running the code Pin
pvsunil
1:32 8 Apr '05  
Generalexporting e-mails of additional mailbox Pin
MagicGirL83
17:24 30 Mar '05  
Generaldisplay the exported e-mails on a web page Pin
MagicGirL83
14:38 30 Mar '05  
GeneralMS Outlook FAXMaker Pin
Fayeeg
0:41 2 Feb '05  


Last Updated 19 Feb 2004 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009