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());
            }
        }
Example #2
0
        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
            }
        }