1
votes

I am in the process of writing an app that will use the Outlook API to copy Calendar Items from a shared calendar to my personal calendar. Here is what I have so far...

using Outlook = Microsoft.Office.Interop.Outlook;

public Outlook.Items GetPublicEntries(string calendar)
    {
        Microsoft.Office.Interop.Outlook.Items CalendarFolderItems = null;
        Outlook.Application oApp;
        oApp = new Outlook.Application();
        Outlook.NameSpace oNS = oApp.GetNamespace("MAPI");
        //oNS.Logon(Missing.Value, Missing.Value, true, true);

        Outlook.Recipient oRecip = (Outlook.Recipient)oNS.CreateRecipient(calendar);
        Outlook.MAPIFolder usersCalendarFolder = (Outlook.MAPIFolder)oNS.GetSharedDefaultFolder(oRecip, Outlook.OlDefaultFolders.olFolderCalendar);
        CalendarFolderItems = usersCalendarFolder.Items;
        return CalendarFolderItems;
    }



    static void Main(string[] args)
    {
        String[] Cals = { "Appointments","Deadlines","Hearings"};

        foreach (string cal in Cals)
        {
            CalendarItems calobj = new CalendarItems();
            Outlook.Items calobjs = calobj.GetPublicEntries(cal);

            foreach (Microsoft.Office.Interop.Outlook.AppointmentItem item in calobjs)
            {
                try
                {
                    Console.WriteLine(item.Subject + " -> " + item.Start.ToLongDateString() + " - " + item.GlobalAppointmentID);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            Console.ReadKey();
        }
    }

I am able to return a list of items from the three calendars, but now I need to copy them to my personal calendar and that is where I am stuck. Anyone know how to go about doing this?

Thanks!

Tony

1

1 Answers

0
votes

Outlook will not let you copy directly to a specified folder (unlike AppointmentItem.Move() which takes a MAPIFolder object as a parameter) - use AppointmentItem.Copy, followed by AppointmentItem.Move:

AppointmentItem copiedItem = Item.Copy();
AppointmentItem newItem = copiedItem.Move(YourDestinationFolder);
newItem.Save();

Beware that Outlook will wipe out the global appointment id when you call Copy() - this means message updates, even if they come directly to your Inbox, will not find the appointment.

You can avoid the intermediary step if you use Redemption - its RDOAppointmentItem (derived from the RDOMail object) lets you pass the target folder when calling CopyTo().