I have some code, referenced below which creates a MailMessage which is really a meeting request because when it shows up in my Outlook I can accept/decline like with any other meeting request. This is great. However, now I am trying to add attachments to the MailMessage using the code commented below, when I do this, it successfully adds the attachment however when the email is received in Outlook it is no longer a meeting request I can accept/decline, instead it's just an email with the meeting information inside of it and the attachment attached. How do I programmatically attach the attachment while at the same time keeping the meeting request functionality? Or if this is the incorrect newsgroup, please point me to the correct one? Thanks
public static MailMessage CreateMeetingRequest(DateTime start, DateTime end, string subject, string summary, string location, string organizerName, string organizerEmail, MailAddressCollection attendeeList, Attachment attachedFile, string fileName) { MailMessage msg = new MailMessage();
//add the attachment to the appointment, when added it shows up as a regular email and not the expected appointment like I thought it would if (attachedFile != null) { msg.Attachments.Add(attachedFile); }
// Set up the different mime types contained in the message System.Net.Mime.ContentType textType = new System.Net.Mime.ContentType("text/plain"); System.Net.Mime.ContentType HTMLType = new System.Net.Mime.ContentType("text/html"); System.Net.Mime.ContentType calendarType = new System.Net.Mime.ContentType("text/calendar");
// Add parameters to the calendar header calendarType.Parameters.Add("method", "REQUEST"); calendarType.Parameters.Add("name", "meeting.ics");
// create the Body in text format string bodyText = "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}"; bodyText = string.Format(bodyText, organizerName, start.ToLongDateString() + " " + start.ToLongTimeString(), end.ToLongDateString() + " " + end.ToLongTimeString(), System.TimeZone.CurrentTimeZone.StandardName, location, summary); AlternateView textView = AlternateView.CreateAlternateViewFromString(bodyText, textType); LinkedResource lr = new LinkedResource(fileName); textView.LinkedResources.Add(lr); msg.AlternateViews.Add(textView);
//create the Body in HTML format string bodyHTML = "<!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>"; bodyHTML = string.Format(bodyHTML, summary, organizerName, start.ToLongDateString() + " " + start.ToLongTimeString(), end.ToLongDateString() + " " + end.ToLongTimeString(), System.TimeZone.CurrentTimeZone.StandardName, location, summary); AlternateView HTMLView = AlternateView.CreateAlternateViewFromString(bodyHTML, HTMLType); HTMLView.LinkedResources.Add(lr); msg.AlternateViews.Add(HTMLView);
//create the Body in VCALENDAR format string calDateFormat = "yyyyMMddTHHmmssZ"; string bodyCalendar = "BEGIN:VCALENDAR\r\nMETHOD:REQUEST\r\nPRODID:Microsoft CDO for Microsoft Exchange\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:(GMT-06.00) Central Time (US & Canada)\r\nX-MICROSOFT-CDO-TZID:11\r\nBEGIN:STANDARD\r\nDTSTART:16010101T020000\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nRRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nDTSTART:16010101T020000\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nRRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTAMP:{8}\r\nDTSTART:{0}\r\nSUMMARY:{7}\r\nUID:{5}\r\nATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"{9}\":MAILTO:{9}\r\nACTION;RSVP=TRUE;CN=\"{4}\":MAILTO:{4}\r\nORGANIZER;CN=\"{3}\":mailto:{4}\r\nLOCATION:{2}\r\nDTEND:{1}\r\nDESCRIPTION:{7}\\N\r\nSEQUENCE:1\r\nPRIORITY:5\r\nCLASS:\r\nCREATED:{8}\r\nLAST-MODIFIED:{8}\r\nSTATUS:CONFIRMED\r\nTRANSP:OPAQUE\r\nX-MICROSOFT-CDO-BUSYSTATUS:BUSY\r\nX-MICROSOFT-CDO-INSTTYPE:0\r\nX-MICROSOFT-CDO-INTENDEDSTATUS:BUSY\r\nX-MICROSOFT-CDO-ALLDAYEVENT:FALSE\r\nX-MICROSOFT-CDO-IMPORTANCE:1\r\nX-MICROSOFT-CDO-OWNERAPPTID:-1\r\nX-MICROSOFT-CDO-ATTENDEE-CRITICAL-CHANGE:{8}\r\nX-MICROSOFT-CDO-OWNER-CRITICAL-CHANGE:{8}\r\nBEGIN:VALARM\r\nACTION:DISPLAY\r\nDESCRIPTION:REMINDER\r\nTRIGGER;RELATED=START:-PT00H15M00S\r\nEND:VALARM\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"; bodyCalendar = string.Format(bodyCalendar, start.ToUniversalTime().ToString(calDateFormat), end.ToUniversalTime().ToString(calDateFormat), location, organizerName, organizerEmail, Guid.NewGuid().ToString("B"), summary, subject, DateTime.Now.ToUniversalTime().ToString(calDateFormat), attendeeList); AlternateView calendarView = AlternateView.CreateAlternateViewFromString(bodyCalendar, calendarType); calendarView.TransferEncoding = System.Net.Mime.TransferEncoding.SevenBit; calendarView.LinkedResources.Add(lr); msg.AlternateViews.Add(calendarView);
// Adress the message msg.From = new MailAddress(organizerEmail); foreach (MailAddress attendee in attendeeList) { msg.To.Add(attendee); }
msg.Subject = subject; return msg; }
|
|