删除Ical事件无效

本文关键字:无效 事件 Ical 删除 | 更新日期: 2023-09-27 18:17:31

我在我的web应用程序中动态创建一个ical事件,当有人取消应用程序上的约会时,我们正在生成一个delete ical事件*。我将文件发送到他们的电子邮件中,以便从日历中删除该事件。

创建工作完美,但当我们试图删除我们创建的约会时,它不会从日历中删除它

创建Ical事件代码:

 string[] contents = { 
      "BEGIN:VCALENDAR",
      "VERSION:2.0",
      "PRODID:-//dev.com//iCal//EN",
      "X-WR-CALNAME:development",
      "X-WR-RELCALID:928C8448-048A-4aa2-BE27-A920773AF3DC",
      "X-FUNAMBOL-ALLDAY:0",
      "METHOD:REQUEST",
      "BEGIN:VEVENT",
      "UID:" + Args.EventUID, 
      "SEQUENCE:1",
      "DTSTART:" + Args.EventStartTime.ToUniversalTime().ToString("yyyyMMdd''THHmmss''Z"), 
      "DTEND:" +  Args.EventEndTime.ToUniversalTime().ToString("yyyyMMdd''THHmmss''Z"), 
      "LOCATION: " + Args.EventLocation, 
      "ORGANIZER: test@outlook.com",
      "DESCRIPTION;ENCODING=ESCAPED-CHAR:" + Args.EventName,
      "SUMMARY:" + Args.EventDescription, 
      "STATUS:CONFIRMED",
      "TRANSP:OPAQUE",
      "PRIORITY:" + Args.EventPriority.ToString(), 
      "END:VEVENT", 
      "END:VCALENDAR" 
 }; 

在iphone/android/outlook上创建一个完美的事件

删除事件部分:

    string[] contents = { 
      "BEGIN:VCALENDAR",
      "VERSION:2.0",
      "METHOD:CANCEL",
      "X-WR-CALNAME:development",
      "X-WR-RELCALID:928C8448-048A-4aa2-BE27-A920773AF3DC",
      "PRODID:-//dev.com//iCal//EN",
      "X-FUNAMBOL-ALLDAY:0",
      "BEGIN:VEVENT",                                
      "UID:" + Args.EventUID,
      "SEQUENCE:2",
      "DTSTART:" + Args.EventStartTime.ToUniversalTime().ToString("yyyyMMdd''THHmmss''Z"), 
      "DTEND:" +  Args.EventEndTime.ToUniversalTime().ToString("yyyyMMdd''THHmmss''Z"), 
      "LOCATION: " + Args.EventLocation, 
      "DESCRIPTION;ENCODING=ESCAPED-CHAR:" + Args.EventName,
      "SUMMARY:" + Args.EventDescription, 
      "ORGANIZER: test@outlook.com",
      "PRIORITY:" + Args.EventPriority.ToString(), 
      "STATUS:CANCELLED",
      "TRANSP:OPAQUE",
      "END:VEVENT", 
      "END:VCALENDAR" 
  };

当我点击这个生成的文件来删除已经创建的事件时,它不会删除事件,有时它会复制事件。

创建和删除时的UID相同。

删除Ical事件无效

首先,仔细检查UID。我知道你说它们是一样的,但是检查一下!空白?案例?

接下来,将PRODID放在第二行,就在BEGIN之后(当验证器告诉您将VERSION放在第二行时,忽略它)。这听起来微不足道,该字段甚至没有被使用,但Outlook特别挑剔。复制一个工作示例。测试一下,如果我错了,告诉我。

下一步,SEQUENCE从0开始索引。客户端可能会将SEQUENCE:1解释为更新,并且想知道原始邀请在哪里。

接下来,检查电子邮件的结构和mime类型标题。我通过发送内容类型为:文本/日历的简单的单部分电子邮件获得了最好的效果;method="[REQUEST/CANCEL]"

仍然不能工作?尝试添加一个ATTENDEE元素,要求参与,rsvp true等,重复收件人的电子邮件地址。

还是问题吗?使用在线Icalendar验证器检查输出,但也要准确地复制一个工作示例。通过gmail和/或outlook给自己发送一个邀请,然后取消它。一切都很重要——消息的结构、Icalendar中字段的顺序、电子邮件的MIME标头。发送到GMail可以让你看到收到的确切内容,通过GMail显示原始选项。

我注意到你没有做包装。Ical行限制为75个字符,不多,溢出行必须以空格开头。验证器会很快告诉您

差异也可能是日历应用程序是否"订阅"或"导入"ics文件?订阅的事件应该更新,导入的事件通常可能不会,因为用户可以更改它们-可能在日历应用程序之间有所不同。

尝试使用PUBLISH作为METHOD, 0作为SEQUENCE提交,1作为SEQUENCE擦除。

提交示例:

string[] contents = {
"BEGIN:VCALENDAR",
"VERSION:2.0",
"PRODID:-//site.domain//iCal//EN",
"METHOD:PUBLISH",
"BEGIN:VEVENT",
"UID:" + Args.EventUID,
"SEQUENCE:0",
"DTSTART:" + Args.EventStartTime.ToUniversalTime().ToString("yyyyMMdd''THHmmss''Z"),
"DTEND:" +  Args.EventEndTime.ToUniversalTime().ToString("yyyyMMdd''THHmmss''Z"),
"SUMMARY:" + Args.EventDescription,
"STATUS:CONFIRMED",
"END:VEVENT",
"END:VCALENDAR"
};

删除示例:

string[] contents = {
"BEGIN:VCALENDAR",
"VERSION:2.0",
"PRODID:-//site.domain//iCal//EN",
"METHOD:CANCEL",
"BEGIN:VEVENT",
"UID:" + Args.EventUID,
"SEQUENCE:1",
"DTSTART:" + Args.EventStartTime.ToUniversalTime().ToString("yyyyMMdd''THHmmss''Z"),
"DTEND:" +  Args.EventEndTime.ToUniversalTime().ToString("yyyyMMdd''THHmmss''Z"),
"SUMMARY:" + Args.EventDescription,
"STATUS:CANCELLED",
"END:VEVENT",
"END:VCALENDAR"
};