iCalendar 从重复周期中删除实例
本文关键字:删除 实例 周期 iCalendar | 更新日期: 2023-09-27 18:35:55
我正在使用 Icalendar 在用 C# 开发的门户上创建定期邀请。 正文包含所涉及的房间的信息。如果用户创建了包含 3 个房间的重复周期,持续 5 周,则会创建单个重复请求邀请。但是,如果用户在该重复周期中更新任何特定日期的房间信息,我会发送该天的单个邀请,但要从重复的单个邀请中删除该日期,我必须重新创建该 5 周的单个邀请,并在 EXDATE(排除)中使用特定日期。有没有办法实现这一点,以避免重新创建 5 周重复的单个邀请,并且该邀请中排除了特定日期。
我用于创建重复出现的单个邀请的代码示例。
str.AppendLine("BEGIN:VCALENDAR");
str.AppendLine("PRODID:-//Team Test");
str.AppendLine("VERSION:2.0");
str.AppendLine("METHOD:REQUEST");
str.AppendLine("BEGIN:VEVENT");
str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", utcStime)); //utcStime is UTC time
str.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", DateTime.UtcNow));
str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", utcEtime));////utcEtime is UTC time
str.AppendLine(string.Format("RRULE:FREQ=WEEKLY;COUNT=5"));
str.AppendLine("LOCATION: ");
str.AppendLine(string.Format("UID:{0}", "Test12345"));
str.AppendLine(string.Format("DESCRIPTION:{0}", msg.Body));
str.AppendLine(string.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", msg.Body));
str.AppendLine(string.Format("SUMMARY:{0}", msg.Subject));
str.AppendLine(string.Format("ORGANIZER:MAILTO:{0}", msg.From.Address));
for (int i = 0; i < msg.To.Count; i++)
{
str.AppendLine(string.Format("ATTENDEE;ROLE=REQ-PARTICIPANT;CN='"{0}'";RSVP=TRUE:mailto:{1}", msg.To[i].DisplayName, msg.To[i].Address));
}
str.AppendLine(string.Format("ATTENDEE;PARTSTAT=ACCEPTED;CN='"{0}'":mailto:{1}",
str.AppendLine("BEGIN:VALARM");
str.AppendLine("TRIGGER:-PT15M");
str.AppendLine("ACTION:DISPLAY");
str.AppendLine("DESCRIPTION:Reminder");
str.AppendLine("END:VALARM");
str.AppendLine("END:VEVENT");
str.AppendLine("END:VCALENDAR");
System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType("text/calendar");
ct.Parameters.Add("method", "REQUEST");
AlternateView avCal = AlternateView.CreateAlternateViewFromString(str.ToString(), ct);
msg.AlternateViews.Add(avCal);
sc.Send(msg); // sc is smtpclient i.e. SmtpClient sc = new SmtpClient();
您不必为此"异常"创建单独的事件。您只需重新发送您的请求(带有一个 SEQUENCE 属性),但它将包含 2 个 VEVENT 组件:
- 主 VEVENT 组件(使用 RRULE,无需 EXDATE)
- 一个额外的 VEVENT 组件,其定期 ID 对应于要修改的实例的 DTSTART。
另请参阅定期事件,如何存储它们?,其中提供了指向示例的指针。