ICalendar (ICS) - 只有 VEVENT 组件适用于 outlook/googleCalendar
ICalendar (ICS) - only VEVENT components works good with outlook/googleCalendar
我在生成 Icalendar 文件 (*.ICS) 时遇到了一些问题
我正在使用库 Ical.NET 和 c# 语言。
代码很简单,例如这是VEVENT:
public override void HandleComponent(Ical.Net.Calendar root, CalendarData data)
{
var icalEvent = new Ical.Net.Event();
icalEvent.Start = new CalDateTime(data.Poczatek);
icalEvent.End = new CalDateTime(data.Koniec);
icalEvent.Location = data.Lokalizacja;
icalEvent.Description = data.Opis;
icalEvent.Summary = data.Nazwa;
root.Events.Add(icalEvent);
}
VJOURNEY 和 VTODO 有非常相似的代码 <-- 首先我创建组件,然后将它添加到日历对象。
然后我从这段代码生成了文件:
var serializer = new CalendarSerializer(calendar);
var icsContent = serializer.SerializeToString();
return icsContent;
ics 文件的结构如下所示:
BEGIN:VCALENDAR
PRODID:-//github.com/rianjs/ical.net//NONSGML ical.net 2.2//EN
VERSION:2.0
BEGIN:VJOURNAL
ATTENDEE;CN=a;RSVP=TRUE;ROLE=REQ-PARTICIPANT:mailto:a@wp.pl
ATTENDEE;CN=a2;RSVP=TRUE;ROLE=REQ-PARTICIPANT:mailto:a2@wp.pl
DESCRIPTION:trele morele
DTSTAMP:20180913T072413Z
DTSTART:20180912T130700
ORGANIZER;CN=Administrator:mailto:Administrator@wp.pl
SEQUENCE:1
SUMMARY:qwerty22
UID:97032fa5-f554-4f10-9c4d-4fdda38148c7
END:VJOURNAL
END:VCALENDAR
正如规范所说:https://www.kanzaki.com/docs/ical/vjournal.html
问题:
Outlook 2016 和 GoogleCalender 都只能正确处理 ICalendar 文件上的 VEVENT 组件。当我在 GoogleCalendar 中导入 VJOURNAL 或 VTODO 时,它响应说他没有看到任何事件......
难道我做错了什么?
我还在创建 VJOURNAL 的地方粘贴了代码
public class CalendarJournalComponent : CalendarComponents
{
public override CalendarComponentType SupportedComponent => CalendarComponentType.Journal;
public override void HandleComponent(Ical.Net.Calendar root, CalendarData data)
{
var journal = new Journal();
journal.Start = new CalDateTime(data.Poczatek);
journal.Description = data.Opis;
journal.Summary = data.Nazwa;
if (data.Prowadzacy.Any())
{
var prowadzacy = data.Prowadzacy.FirstOrDefault();
journal.Organizer = new Organizer() { CommonName = prowadzacy.Value, Value = emailUri(prowadzacy.Key)};
}
journal.Attendees = new List<IAttendee>();
foreach(var uczesnik in data.Uczestnicy)
{
journal.Attendees.Add(new Attendee() { CommonName = uczesnik.Value, Rsvp = true, Value = emailUri(uczesnik.Key), Role = "REQ-PARTICIPANT" });
}
root.Journals.Add(journal);
}
private Func<string, Uri> emailUri = x => new Uri(String.Format("mailto:{0}", x));
}
和 VTODO 组件:
public class CalendarTodoComponent : CalendarComponents
{
public override CalendarComponentType SupportedComponent => CalendarComponentType.ToDo;
public override void HandleComponent(Ical.Net.Calendar root, CalendarData data)
{
var todo = new Todo();
todo.Start = new CalDateTime(data.Poczatek);
todo.Description = data.Opis;
todo.Summary = data.Nazwa;
todo.Location = data.Lokalizacja;
root.Todos.Add(todo);
}
}
您的代码很可能没问题。但是您需要问问自己,通过尝试在 Google Calendar 中导入那些 VJOURNAL 和 VTODO,您真正期望做什么?
截止到今天,Google 日历真的只支持 events/meetings:
- 不支持VJOURNAL。事实上,支持VJOURNAL的软件真的很少。从它的定义 (https://www.rfc-editor.org/rfc/rfc5545#section-3.6.3) 可以看出它可以被视为博客条目的祖先。
- 也不支持VTODO。您能找到的最接近的是 Gmail,它具有任务列表的概念。
我在生成 Icalendar 文件 (*.ICS) 时遇到了一些问题 我正在使用库 Ical.NET 和 c# 语言。
代码很简单,例如这是VEVENT:
public override void HandleComponent(Ical.Net.Calendar root, CalendarData data)
{
var icalEvent = new Ical.Net.Event();
icalEvent.Start = new CalDateTime(data.Poczatek);
icalEvent.End = new CalDateTime(data.Koniec);
icalEvent.Location = data.Lokalizacja;
icalEvent.Description = data.Opis;
icalEvent.Summary = data.Nazwa;
root.Events.Add(icalEvent);
}
VJOURNEY 和 VTODO 有非常相似的代码 <-- 首先我创建组件,然后将它添加到日历对象。
然后我从这段代码生成了文件:
var serializer = new CalendarSerializer(calendar);
var icsContent = serializer.SerializeToString();
return icsContent;
ics 文件的结构如下所示:
BEGIN:VCALENDAR
PRODID:-//github.com/rianjs/ical.net//NONSGML ical.net 2.2//EN
VERSION:2.0
BEGIN:VJOURNAL
ATTENDEE;CN=a;RSVP=TRUE;ROLE=REQ-PARTICIPANT:mailto:a@wp.pl
ATTENDEE;CN=a2;RSVP=TRUE;ROLE=REQ-PARTICIPANT:mailto:a2@wp.pl
DESCRIPTION:trele morele
DTSTAMP:20180913T072413Z
DTSTART:20180912T130700
ORGANIZER;CN=Administrator:mailto:Administrator@wp.pl
SEQUENCE:1
SUMMARY:qwerty22
UID:97032fa5-f554-4f10-9c4d-4fdda38148c7
END:VJOURNAL
END:VCALENDAR
正如规范所说:https://www.kanzaki.com/docs/ical/vjournal.html
问题:
Outlook 2016 和 GoogleCalender 都只能正确处理 ICalendar 文件上的 VEVENT 组件。当我在 GoogleCalendar 中导入 VJOURNAL 或 VTODO 时,它响应说他没有看到任何事件...... 难道我做错了什么?
我还在创建 VJOURNAL 的地方粘贴了代码
public class CalendarJournalComponent : CalendarComponents
{
public override CalendarComponentType SupportedComponent => CalendarComponentType.Journal;
public override void HandleComponent(Ical.Net.Calendar root, CalendarData data)
{
var journal = new Journal();
journal.Start = new CalDateTime(data.Poczatek);
journal.Description = data.Opis;
journal.Summary = data.Nazwa;
if (data.Prowadzacy.Any())
{
var prowadzacy = data.Prowadzacy.FirstOrDefault();
journal.Organizer = new Organizer() { CommonName = prowadzacy.Value, Value = emailUri(prowadzacy.Key)};
}
journal.Attendees = new List<IAttendee>();
foreach(var uczesnik in data.Uczestnicy)
{
journal.Attendees.Add(new Attendee() { CommonName = uczesnik.Value, Rsvp = true, Value = emailUri(uczesnik.Key), Role = "REQ-PARTICIPANT" });
}
root.Journals.Add(journal);
}
private Func<string, Uri> emailUri = x => new Uri(String.Format("mailto:{0}", x));
}
和 VTODO 组件:
public class CalendarTodoComponent : CalendarComponents
{
public override CalendarComponentType SupportedComponent => CalendarComponentType.ToDo;
public override void HandleComponent(Ical.Net.Calendar root, CalendarData data)
{
var todo = new Todo();
todo.Start = new CalDateTime(data.Poczatek);
todo.Description = data.Opis;
todo.Summary = data.Nazwa;
todo.Location = data.Lokalizacja;
root.Todos.Add(todo);
}
}
您的代码很可能没问题。但是您需要问问自己,通过尝试在 Google Calendar 中导入那些 VJOURNAL 和 VTODO,您真正期望做什么? 截止到今天,Google 日历真的只支持 events/meetings:
- 不支持VJOURNAL。事实上,支持VJOURNAL的软件真的很少。从它的定义 (https://www.rfc-editor.org/rfc/rfc5545#section-3.6.3) 可以看出它可以被视为博客条目的祖先。
- 也不支持VTODO。您能找到的最接近的是 Gmail,它具有任务列表的概念。