public static void LoadCalendarInfo(this MailMessageData mail, MimeMessage message, ILog log = null) { if (!message.BodyParts.Any()) { return; } log = log ?? new NullLog(); try { var calendarParts = message.BodyParts.Where(p => p.ContentType.IsMimeType("text", "calendar")).ToList(); if (!calendarParts.Any()) { return; } log.DebugFormat("LoadCalendarInfo found {0} calendars", calendarParts.Count); foreach (var calendarPart in calendarParts) { var p = calendarPart as TextPart; if (p == null) { continue; } var ics = p.Text; var calendar = MailUtil.ParseValidCalendar(ics, log); if (calendar == null) { continue; } if (calendar.Events[0].Organizer == null && calendar.Method.Equals(Defines.ICAL_REPLY, StringComparison.OrdinalIgnoreCase)) { // Fix reply organizer (Outlook style of Reply) var toAddress = message.To.Mailboxes.FirstOrDefault(); if (toAddress != null) { calendar.Events[0].Organizer = new Ical.Net.DataTypes.Organizer("mailto:" + toAddress.Address) { CommonName = string.IsNullOrEmpty(toAddress.Name) ? toAddress.Address : toAddress.Name }; ics = MailUtil.SerializeCalendar(calendar); } } mail.CalendarUid = calendar.Events[0].Uid; mail.CalendarId = -1; mail.CalendarEventIcs = ics; mail.CalendarEventCharset = string.IsNullOrEmpty(p.ContentType.Charset) ? Encoding.UTF8.HeaderName : p.ContentType.Charset; mail.CalendarEventMimeType = p.ContentType.MimeType; log.DebugFormat("Calendar UID: {0} Method: {1} ics: {2}", mail.CalendarUid, calendar.Method, mail.CalendarEventIcs); var calendarExists = message.Attachments .Any( attach => { var subType = attach.ContentType.MediaSubtype.ToLower().Trim(); if (string.IsNullOrEmpty(subType) || (!subType.Equals("ics") && !subType.Equals("ical") && !subType.Equals("ifb") && !subType.Equals("icalendar") && !subType.Equals("calendar"))) { return(false); } var icsTextPart = attach as TextPart; string icsAttach; if (icsTextPart != null) { icsAttach = icsTextPart.Text; } else { using (var stream = new MemoryStream()) { p.Content.DecodeTo(stream); var bytes = stream.ToArray(); var encoding = MailUtil.GetEncoding(p.ContentType.Charset); icsAttach = encoding.GetString(bytes); } } var cal = MailUtil.ParseValidCalendar(icsAttach, log); if (cal == null) { return(false); } return(mail.CalendarUid == cal.Events[0].Uid); }); if (calendarExists) { log.Debug("Calendar exists as attachment"); continue; } if (calendarPart.ContentDisposition == null) { calendarPart.ContentDisposition = new ContentDisposition(); } if (string.IsNullOrEmpty(calendarPart.ContentDisposition.FileName)) { calendarPart.ContentDisposition.FileName = calendar.Method == Defines.ICAL_REQUEST ? "invite.ics" : calendar.Method == Defines.ICAL_REPLY ? "reply.ics" : "cancel.ics"; } mail.LoadAttachments(new List <MimeEntity> { calendarPart }, true); } } catch (Exception ex) { log.ErrorFormat("LoadCalendarInfo() \r\n Exception: \r\n{0}\r\n", ex.ToString()); } }
private void LoadCalendarInfo(MimeMessage message) { if (!message.BodyParts.Any()) { return; } try { var calendarParts = message.BodyParts.Where(p => p.ContentType.IsMimeType("text", "calendar")).ToList(); if (!calendarParts.Any()) { return; } foreach (var calendarPart in calendarParts) { var p = calendarPart as TextPart; if (p == null) { continue; } var ics = p.Text; var calendar = MailUtil.ParseValidCalendar(ics); if (calendar == null) { return; } if (calendar.Events[0].Organizer == null && calendar.Method.Equals("REPLY", StringComparison.OrdinalIgnoreCase)) { // Fix reply organizer (Outlook style of Reply) var toAddress = message.To.Mailboxes.FirstOrDefault(); if (toAddress != null) { calendar.Events[0].Organizer = new Organizer("mailto:" + toAddress.Address) { CommonName = string.IsNullOrEmpty(toAddress.Name) ? toAddress.Address : toAddress.Name }; ics = MailUtil.SerializeCalendar(calendar); } } CalendarUid = calendar.Events[0].UID; CalendarId = -1; CalendarEventIcs = ics; CalendarEventCharset = string.IsNullOrEmpty(p.ContentType.Charset) ? Encoding.UTF8.HeaderName : p.ContentType.Charset; CalendarEventMimeType = p.ContentType.MimeType; var calendarExists = message.Attachments .Any( attach => { var subType = attach.ContentType.MediaSubtype.ToLower().Trim(); if (string.IsNullOrEmpty(subType) || (!subType.Equals("ics") && !subType.Equals("ical") && !subType.Equals("ifb") && !subType.Equals("icalendar") && !subType.Equals("calendar"))) { return(false); } var icsTextPart = attach as TextPart; string icsAttach; if (icsTextPart != null) { icsAttach = icsTextPart.Text; } else { using (var stream = new MemoryStream()) { p.ContentObject.DecodeTo(stream); var bytes = stream.ToArray(); var encoding = MailUtil.GetEncoding(p.ContentType.Charset); icsAttach = encoding.GetString(bytes); } } var cal = MailUtil.ParseValidCalendar(icsAttach); if (cal == null) { return(false); } return(CalendarUid == cal.Events[0].UID); }); if (calendarExists) { continue; } if (calendarPart.ContentDisposition == null) { calendarPart.ContentDisposition = new ContentDisposition(); } if (string.IsNullOrEmpty(calendarPart.ContentDisposition.FileName)) { calendarPart.ContentDisposition.FileName = calendar.Method == "REQUEST" ? "invite.ics" : calendar.Method == "REPLY" ? "reply.ics" : "cancel.ics"; } LoadAttachments(new List <MimeEntity> { calendarPart }); } } catch { // Ignore } }