I'm sending a meeting request using the [SMTPClient] class with the VCalendar format.
However, I'm facing the following issues:
- The meeting request is not sent to the organizer.
- The meeting request request is received as an attachment to a plain mail.
- When opened and accepted by the attendee, no reply is sent to the organizer.
Below is the VCalendar format that I'm using:
public static MailMessage CreateMeetingRequestToAll(DateTime dtStart, DateTime dtEnd, string strSubject, string strSummary,
string strLocation, string strOrganizerName, string strOrganizerEmail, MailAddressCollection reqAttendeeList, string UID, SPListItem item, string domainName, bool isToOrganizer)
{
MailMessage mmMessage = new MailMessage();
System.Net.Mime.ContentType typeText = new System.Net.Mime.ContentType("text/plain");
System.Net.Mime.ContentType typeHTML = new System.Net.Mime.ContentType("text/html");
System.Net.Mime.ContentType typeCalendar = new System.Net.Mime.ContentType("text/calendar");
typeCalendar.Parameters.Add("Content-class", "urn:content-classes:calendarmessage");
typeCalendar.Parameters.Add("Content-Type", "text/calendar");
typeCalendar.Parameters.Add("method", "REQUEST");
typeCalendar.Parameters.Add("name", "meeting.ics");
typeCalendar.Parameters.Add("Content-Transfer-Encoding", "8bit");
string strBodyText = "Type:Single Meeting\r\nOrganizer: {0}\r\nStart Time:{1}\r\nEnd Time:{2}\r\nTime Zone:{3}\r\nLocation: {4}\r\n\r\n*~*~*~*~*~*~*~*~*~*\r\n\r\n{5}";
strBodyText = string.Format(strBodyText, strOrganizerName, dtStart.ToLongDateString() + " " + dtStart.ToLongTimeString(),
dtEnd.ToLongDateString() + " " + dtEnd.ToLongTimeString(), System.TimeZone.CurrentTimeZone.StandardName,
strLocation, strSummary);
AlternateView viewText = AlternateView.CreateAlternateViewFromString(strBodyText, typeText);
mmMessage.AlternateViews.Add(viewText);
string strBodyHTML = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\r\n<HTML>\r\n<HEAD>\r\n<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\r\n<META NAME=\"Generator\" CONTENT=\"MS Exchange Server version 6.5.7652.24\">\r\n<TITLE>{0}</TITLE>\r\n</HEAD>\r\n<BODY>\r\n<!-- Converted from text/plain format -->\r\n<P><FONT SIZE=2>Type:Single Meeting<BR>\r\nOrganizer:{1}<BR>\r\nStart Time:{2}<BR>\r\nEnd Time:{3}<BR>\r\nTime Zone:{4}<BR>\r\nLocation:{5}<BR>\r\n<BR>\r\n*~*~*~*~*~*~*~*~*~*<BR>\r\n<BR>\r\n{6}<BR>\r\n</FONT>\r\n</P>\r\n\r\n</BODY>\r\n</HTML>";
strBodyHTML = string.Format(strBodyHTML, strSummary, strOrganizerName, dtStart.ToLongDateString() + " " + dtStart.ToLongTimeString(),
dtEnd.ToLongDateString() + " " + dtEnd.ToLongTimeString(), System.TimeZone.CurrentTimeZone.StandardName,
strLocation, strSummary);
AlternateView viewHTML = AlternateView.CreateAlternateViewFromString(strBodyHTML, typeHTML);
mmMessage.AlternateViews.Add(viewHTML);
string strCalDateFormat = "yyyyMMddTHHmmssZ";
StringBuilder strBodyCalendar = new StringBuilder();
strBodyCalendar.AppendLine("BEGIN:VCALENDAR");
strBodyCalendar.AppendLine("PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN");
strBodyCalendar.AppendLine("VERSION:2.0");
strBodyCalendar.AppendLine("METHOD:REQUEST");
strBodyCalendar.AppendLine("BEGIN:VEVENT");
foreach (MailAddress attendee in reqAttendeeList)
{
mmMessage.To.Add(attendee);
strBodyCalendar.AppendFormat("ATTENDEE;CN={0};ROLE=REQ-PARTICIPANT;EXPECT=REQUIRE;RSVP=TRUE:MAILTO:{1}\r\n", attendee.DisplayName, attendee.Address);
}
strBodyCalendar.AppendFormat("ORGANIZER:MAILTO:{0}\r\n", strOrganizerEmail);
strBodyCalendar.AppendFormat("DTSTART:{0}\r\n", dtStart.ToUniversalTime().ToString(strCalDateFormat));
strBodyCalendar.AppendFormat("DTEND:{0}\r\n", dtEnd.ToUniversalTime().ToString(strCalDateFormat));
strBodyCalendar.AppendFormat("LOCATION:{0}\r\n", strLocation);
strBodyCalendar.AppendFormat("TRANSP:OPAQUE\r\n");
strBodyCalendar.AppendFormat("SEQUENCE:0\r\n");
strBodyCalendar.AppendFormat("UID:{0}\r\n", UID);
strBodyCalendar.AppendFormat("DTSTAMP:{0}\r\n", DateTime.Now.ToUniversalTime().ToString(strCalDateFormat));
strBodyCalendar.AppendFormat("DESCRIPTION:{0}\r\n", strSummary);
strBodyCalendar.AppendFormat("SUMMARY:{0}\r\n", strSubject);
strBodyCalendar.AppendLine("PRIORITY:5");
strBodyCalendar.AppendLine("X-MICROSOFT-CDO-IMPORTANCE:1");
strBodyCalendar.AppendLine("CLASS:PUBLIC");
strBodyCalendar.AppendLine("BEGIN:VALARM");
strBodyCalendar.AppendLine("TRIGGER:-PT15M");
strBodyCalendar.AppendLine("ACTION:DISPLAY");
strBodyCalendar.AppendLine("DESCRIPTION:Reminder");
strBodyCalendar.AppendLine("END:VALARM");
strBodyCalendar.AppendLine("END:VEVENT");
strBodyCalendar.AppendLine("END:VCALENDAR");
AlternateView viewCalendar = AlternateView.CreateAlternateViewFromString(strBodyCalendar.ToString(), typeCalendar);
mmMessage.AlternateViews.Add(viewCalendar);
mmMessage.From = new MailAddress(strOrganizerEmail);
mmMessage.Subject = strSubject;
FillAttachmentCollection(ref mmMessage, item);
return mmMessage;
}