tags:

views:

41

answers:

2

I'm working on an application that's supposed to take a link to an email from Outlook and store it in a database.

I've been looking at the Microsoft.Office.Interop.Outlook API but I can't find something that could be used for this.

Any thoughts?

+2  A: 

There is no such thing as a link to an email in Outlook.

I suppose that you'd like to store something like shortcut in a text format which can be used later to find/open an email in Outlook. If you plan to use Outlook Interop API for that, you can use EntryID of the MailItem object that represent your email. It's a unique ID of the item, but it can be changed if item is moved somewhere else in the folder structure.

Nenad
+2  A: 

You could save the email as a .msg file and then save that into the database as a byte array instead?

Otherwise there are ways to programmtically access a mailbox or outlook .pst file, you would then have to write an interface that lets them select the email to save, and then save the email in parts (subject, to, from etc.) separately in to the database.

To access a mailbox on the Exchange server (Exchange 2007+) you can do it using the Exchange Web Services Managed API 1.0. EWS API and you can download it from here

It makes it really simple to access and retrieve emails etc as pre Exchange 2007 it was a pain and involved parsing a lot of XML or using CDOEXM.

Heres an example of how to use it:

You first need to create an Exchange service. Add a reference to the EWS and add the using line below.

using Microsoft.Exchange.WebServices.Data;
...
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.AutodiscoverUrl( "[email protected]" );

Once the service is up and running you can then use it to query the mailbox:

FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox,
       new ItemView());

This will return all the emails in the Inbox. You can then view details of the email using its properties. i.e. item.Subject;

If the emails are in a .pst file however, you will need to use the Outlook API or I recommend PST.NET (although you do have to but a license) as it makes it a lot easier.

Heres an example of using PST.NET:

using System;
using Independentsoft.Pst;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            PstFile file = new PstFile("c:\\testfolder\\Outlook.pst");

            using (file)
            {
                Folder inbox = file.MailboxRoot.GetFolder("Inbox");

                if (inbox != null)
                {
                    ItemCollection items = inbox.GetItems();

                    for (int m = 0; m < items.Count; m++)
                    {
                        if (items[m] is Message)
                        {
                            Message message = (Message)items[m];

                            Console.WriteLine("Id: " + message.Id);
                            Console.WriteLine("Subject: " + message.Subject);
                            Console.WriteLine("DisplayTo: " + message.DisplayTo);
                            Console.WriteLine("DisplayCc: " + message.DisplayCc);
                            Console.WriteLine("SenderName: " + message.SenderName);
                            Console.WriteLine("SenderEmailAddress: " + message.SenderEmailAddress);
                            Console.WriteLine("----------------------------------------------------------------");
                        }
                    }
                }
            }

            Console.WriteLine("Press ENTER to exit.");
            Console.Read();
        }
    }
}
w69rdy
I would love some code samples!
Zolomon
No problem, what version of Exchange are you using?
w69rdy
We're using 2007 I believe.
Zolomon