1

我正在我的 Web 应用程序中动态创建一个 ical 事件,当有人取消应用程序上的约会时,我们会在他们的电子邮件中生成一个删除 ical 事件 *.ics 文件以删除他们日历中的事件。

创建工作正常,但是当我们尝试删除我们创建的约会时,它并没有从日历中删除它

创建 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" 
  };

当我单击生成的此文件以删除已创建的事件时,它不会删除该事件,有时它会复制该事件。

创建和删除的 ical UID 是相同的。

4

3 回答 3

0

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

于 2014-08-24T01:33:17.150 回答
0

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

接下来,将 PRODID 放在第二行,紧跟在 BEGIN 之后(当验证器告诉您将 VERSION 放在第二行时,请忽略它们。)这听起来很简单,甚至没有使用该字段,但尤其是 Outlook 非常挑剔。复制一个工作示例。测试并告诉我我是否错了。

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

接下来,检查电子邮件的结构和 mime 类型标题。通过使用 Content-type: text/calendar; 发送一封简单的单部分电子邮件,我得到了最好的结果;MIME 标头中的 method="[REQUEST/CANCEL]"。

还是行不通?尝试添加一个 ATTENDEE 元素,需要参与,rsvp true 等,重复收件人的电子邮件地址。

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

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

于 2014-08-20T13:42:04.177 回答
0

尝试使用PUBLISHasMETHOD0asSEQUENCE提交和1asSEQUENCE擦除。

提交示例:

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"
};
于 2014-11-12T16:57:01.293 回答