使用ical4j添加会议组织者后如何让指定参会者可取消会议
问题描述
我正在使用ical4j发送带日历附件的邮件,参考相关开发文档成功添加了会议组织者,添加代码如下:
event.getProperties().add(new Organizer("mailto:bob@example.com"));
但目前遇到的问题是:所有添加到日历的参会者都没有取消事件的权限。如果不使用ical4j,直接在Outlook Online中手动创建日历预约,就可以正常取消事件,效果如下图:

但作为组织者收到ical4j生成的带日历附件的邮件时,仅提供「接受、拒绝、暂定」三个选项,效果如下图:

请问该如何配置,才能让指定的会议参会者拥有取消会议的权限?
11月15日更新
根据网友建议调整后,程序生成的日历事件如下,但仍然无法取消事件:
BEGIN:VCALENDAR PRODID:-//Events Calendar//iCal4j 3.0.1//EN CALSCALE:GREGORIAN METHOD:REQUEST BEGIN:VEVENT DTSTAMP:20211115T144506Z DTSTART;TZID=America/New_York:20211215T110000 DTEND;TZID=America/New_York:20211215T114500 SUMMARY:ABC123 School TZID:America/New_York LOCATION:Virtual UID:153ab747-bbd2-4964-9112-9fa0d29ed306 STATUS:CONFIRMED ORGANIZER;ROLE=CHAIR:mailto:dev1@example.com ATTENDEE;ROLE=REQ-PARTICIPANT:mailto:dev2@example.com ATTENDEE;ROLE=REQ-PARTICIPANT:mailto:dev1@gmail.com END:VEVENT END:VCALENDAR
另外我在Outlook Online中手动生成了一个事件并转发到雅虎账户,获取到的正常日历附件内容如下:
BEGIN:VCALENDAR METHOD:REQUEST PRODID:Microsoft Exchange Server 2010 VERSION:2.0 BEGIN:VTIMEZONE TZID:Eastern Standard Time BEGIN:STANDARD DTSTART:16010101T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11 END:STANDARD BEGIN:DAYLIGHT DTSTART:16010101T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3 END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT ORGANIZER;CN="dev1":mailto:dev1@example.com ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=dev2 g:mailto:dev2@yahoo.com ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN="dev3":mailto:dev3@example.com DESCRIPTION;LANGUAGE=en-US:\n\n\n________________________________________\n From: dev1 <dev1@example.com>\nSent: Monday\, November 15\, 2021 8:52:23 AM (UTC-05:00) Eastern Time (US & Canada)\nTo: dev3\; dev1\, \nSubject: test\, please ignore it.\nWhen: Monday\, November 22\, 2021 10:30 AM-11:00 AM.\nWhere:\n\ntest\n\n______________________________________________________________________\nMicrosoft Teams meeting\nJoin on your computer or mobile app\nClick here to join the ..... cdd5fc5d11c&threadId=19_meeting_OGYzZjAdddxMjYtYYy00ZDE4LWE0NjctZjY4OTA0ZG I0ZTQ4@thread.v2&messageId=0&language=en-US>\n______________________________________________________________________\nUID:040000008200E00074C5B7101A82E00800000000933C540328DAD701000000000000000 0100000001771BBC5CAD45B499CBF167EE077185B SUMMARY;LANGUAGE=en-US:FW: another test for GRD\, please ignore it. DTSTART;TZID=Eastern Standard Time:20211122T103000 DTEND;TZID=Eastern Standard Time:20211122T110000 CLASS:PUBLIC PRIORITY:5 DTSTAMP:20211115T135223Z TRANSP:OPAQUE STATUS:CONFIRMED SEQUENCE:0 LOCATION;LANGUAGE=en-US: X-MICROSOFT-CDO-APPT-SEQUENCE:0 X-MICROSOFT-CDO-OWNERAPPTID:2119924365 X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY X-MICROSOFT-CDO-ALLDAYEVENT:FALSE X-MICROSOFT-CDO-IMPORTANCE:1 X-MICROSOFT-CDO-INSTTYPE:0 X-MICROSOFT-ONLINEMEETINGINFORMATION:{"OnlineMeetingChannelId":null\,"OnlineMeetingProvider":3} X-MICROSOFT-ONLINEMEETINGTOLLNUMBER:+1 571-429-6038 X-MICROSOFT-ONLINEMEETINGCONFERENCEID:475654328 X-MICROSOFT-SKYPETEAMSMEETINGURL:https://teams.microsoft.com/l/meetup-join/19%3ameeting_OGYzZjAxMjYtYzFlYy00ZDE4LWE0NjctZjY4OTA0ZGI0ZTQ4%40thread.v2/0?context=%7b%22Tid%22%3a989b5e2ddda-14e4-4efe-93b7-8cdd5fc5d11c%22%2c%22Oid%22%3a%2256f6a1be-b722-47fd-b69c-5950f281818f%22%7d X-MICROSOFT-SCHEDULINGSERVICEUPDATEURL:https://api.scheduler.teams.microsoft.com/teams/989b5e2a-14e4-4efe-9ddd5fsasdfc5d11c/56f6a1be-b722-47fd-b69c-5950f281818f/19_meeting_OGYzZjddYtYzFl4Ysa00ZDE4LWE0NjctZjY4OTA0ZGI0ZTQ4@thread.v2/0 X-MICROSOFT-SKYPETEAMSPROPERTIES:{"cid":"19:meeting_OGYzZjAxMjYtYzFlYy00ZDE4LWE0NjctZjY4OTA0ZGI0ZTQ4@thread.v2"\,"rid":0\,"mid":0\,"uid":null\,"private":true\,"type":0} X-MICROSOFT-ONLINEMEETINGCONFLINK:conf:sip:dev1@example.com\;gruu\;opaque=app:conf:focus:id:teams:2:0!19:meeting_OGYzZxAxMjYtdasYzFlYy00Z4LWE0NjctZjY4OTA0ZGI0ZTQ4-thread.v2!56f6a1beb72247fdb69c5818dasdfsadf!989b5e2a14e44efe93b78cdd5fc5d11c X-MICROSOFT-DONOTFORWARDMEETING:FALSE X-MICROSOFT-DISALLOW-COUNTER:FALSE X-MICROSOFT-LOCATIONS:[] BEGIN:VALARM DESCRIPTION:REMINDER TRIGGER;RELATED=START:-PT15M ACTION:DISPLAY END:VALARM END:VEVENT END:VCALENDAR
解决方案
你的问题根源是Outlook等邮件客户端识别会议所有者权限,需要同时满足iCalendar标准配置和微软专有扩展规则,按以下步骤调整即可:
- 补充Organizer字段的完整属性
你当前的Organizer只有ROLE=CHAIR参数,需要补充CN(显示名)参数,和Outlook生成的格式对齐:
Organizer organizer = new Organizer("mailto:dev1@example.com"); organizer.getParameters().add(CN.ORGANIZER_CN, "dev1"); event.getProperties().add(organizer);
- 添加SEQUENCE字段
你当前生成的ics缺少SEQUENCE属性,这个属性是iCalendar标准中用于标记事件版本的必填字段,Outlook需要通过这个字段识别事件更新、取消操作的有效性:
event.getProperties().add(new Sequence(0));
- 补充CLASS权限控制字段
默认添加CLASS:PUBLIC属性,明确事件的公开权限,避免客户端默认按私有事件限制操作权限:
event.getProperties().add(Clazz.PUBLIC);
- 针对需要授予取消权限的参会者,修改ATTENDEE的ROLE参数
如果要给指定参会者取消会议的权限,将其ROLE从REQ-PARTICIPANT改为CHAIR即可,iCalendar标准中CHAIR角色默认拥有会议的管理权限:
Attendee delegate = new Attendee("mailto:dev2@example.com"); delegate.getParameters().add(Role.CHAIR); delegate.getParameters().add(PartStat.NEEDS_ACTION); delegate.getParameters().add(Rsvp.TRUE); event.getProperties().add(delegate);
- 邮件头配置补充
发送带日历附件的邮件时,需要将对应附件的Content-Type设置为text/calendar; method=REQUEST,不要作为普通的ics附件发送,否则Outlook不会识别为会议邀请,自然不会提供管理操作选项。
调整后重新生成的ics文件,在Outlook中就可以正常显示取消、修改等管理选项了。
内容的提问来源于stack exchange,提问作者curious1
相关产品推荐
相关产品推荐

