Sending Outlook meeting requests without Outlook?

Solution 1:

The way to send a meeting request to Outlook (and have it recognized) goes like this:

  • prepare an iCalendar file, be sure to set these additional properties, as Outlook needs them:
    • UID
    • SEQUENCE
    • CREATED
    • LAST-MODIFIED
    • DTSTAMP
  • prepare a multipart/alternative mail:
    • Part 1: text/html (or whatever you like) - this is displayed to "ordinary" mail readers or as a fall-back and contains a summary of the event in human readable form
    • Part 2: text/calendar; method=REQUEST, holds the contents of the ics file (the header method parameter must match the method in the ics). Watch out for the correct text encoding, declaring a charset header parameter won't hurt.
    • Part 3: Optionally, attach the .ics file itself, so ordinary mail readers can offer the user something to click on. Outlook does not really require the attachment because it just reads the text/calendar part.
  • Send the mail to an outlook user. If you got everything right the mail shows up as a meeting request, complete with attendance buttons and automatic entry in the users calendar upon accept.
  • Set up something that processes the responses (they go to the meeting organizer). I have not yet been able to get automatic attendee tracking to work with an Exchange mailbox because the event won't exist in the organizers calendar. Outlook needs the UIDs and SEQUENCES to match it's expectations, but with a UID you made up this will hardly work.

For help on the details and peculiarities of the ics file format, be sure to visit the iCalendar Specification Excerpts by Masahide Kanzaki. They are a light in the dark, much better than gnawing your way through RFC 2445. But then again, maybe a handy library exists for .NET.

Solution 2:

See the DDay.iCal C# library on sourceforge:
http://sourceforge.net/projects/dday-ical/

Then read this codeproject article:
http://www.codeproject.com/Articles/17980/Adding-iCalendar-Support-to-Your-Program-Part-1

And read this:
Export event with C# to iCalendar and vCalendar format

Solution 3:

iCalendar is a great general-purpose solution, and the DDay.iCal library is a great way to do this from .NET, but I believe Exchange Web Services (EWS) are a better solution in the context of the original question (Exchange, C#/.NET).

And if you're using a .NET language such as C#, you should use the EWS Managed API wrapper which greatly simplifies working with EWS.

From the docs, here's how to use the EWS Managed API to create a meeting and send the request to invitees:

// Create the appointment.
Appointment appointment = new Appointment(service);

// Set properties on the appointment. Add two required attendees and one optional attendee.
appointment.Subject = "Status Meeting";
appointment.Body = "The purpose of this meeting is to discuss status.";
appointment.Start = new DateTime(2009, 3, 1, 9, 0, 0);
appointment.End = appointment.Start.AddHours(2);
appointment.Location = "Conf Room";
appointment.RequiredAttendees.Add("[email protected]");
appointment.RequiredAttendees.Add("[email protected]");
appointment.OptionalAttendees.Add("[email protected]");

// Send the meeting request to all attendees and save a copy in the Sent Items folder.
appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy);