问题背景:
自定义一个服务,预约一场会议,然后再取消这场会议,把取消会议的信息以附件的形式发送给office 365邮箱。ics文件内容如下:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//WebCalendar-ics-v2.0.0
METHOD:CANCEL
BEGIN:VEVENT
UID:88605518-0000552265
DTSTAMP:20220302T030731Z
DTSTART:20220305T030000Z
DTEND:20220305T040000Z
CREATED:20220302T030725Z
LAST-MODIFIED:20220302T030725Z
ORGANIZER;RSVP=FALSE;X-PRODUCTSTATUS=0;CN="蜜蜂":MAILTO:notify@quanshimeeting.com
PRIORITY:1
SEQUENCE:1646190451
STATUS:CANCELLED
SUMMARY:会议取消:测试office 365收不到...
ATTENDEE;RSVP=FALSE;X-PRODUCTSTATUS=0;ROLE=CHAIR;PARTSTAT=NEEDS-ACTION;CN="peng.pan@mtsv1.com":MAILTO:peng.pan@mtsv1.com
ATTENDEE;RSVP=FALSE;X-PRODUCTSTATUS=0;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;CN="ezreal_pan@outlook.com":MAILTO:ezreal_pan@outlook.com
ATTENDEE;RSVP=FALSE;X-PRODUCTSTATUS=0;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;CN="ezreal_pan@sina.com":MAILTO:ezreal_pan@sina.com
ATTENDEE;RSVP=FALSE;X-PRODUCTSTATUS=0;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;CN="peng.pan@quanshi.com":MAILTO:peng.pan@quanshi.com
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
X-ALT-DESC;FMTTYPE=text/html:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">\n<html xmlns="http://www.w3.org/1999/xhtml">\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n<title></title>\n</head>\n<body>\nphp1111_009 \n安排的会议已取消,\n提醒您注意. <br>\n●主题: \n测试office 365收不到取消的会议1 <br>\n●时间(GMT+8): \n2022/03/05 11:00~12:00 <br>\n<br>\n全时客服中国\n 400-810-1919\n 香港 +852 3060 2634\n 邮箱 service@quanshi.com <br>\n<br>\n此邮件为系统邮件,\n请勿回复 <br>\n<br>\n----------------------------------------------------------------------------------<br>\n<br>\nThe meeting php1111_009 scheduled has been canceled. \nPlease be noted. <br>\n●Theme: \n测试office 365收不到取消的会议1 <br>\n●Time(GMT+8): \n2022/03/05 11:00~12:00 <br>\n<br>\nG-Net service:\n Mainland 400-810-1919\n HK +852 3060 2634\n Email\n service@quanshi.com<br>\n<br>\nThis is system ema
il. \nPlease don't reply <br>\n<br>\n</body>\n</html>
然而,这场取消的会议在office 365的日历中无法显示。
排查过程:
1.通过手动添加outlook日历,能正常添加。手动添加到office 365的日历,发现报错。
开始怀疑的是生成的ics文件有问题,icalendar协议在outlook和office 365的日历中不兼容。
找了一圈没有找到问题的原因。中途还试图咨询了微软官方的人员,依然没有得到问题的答案。
2.注册一个office 365账号,利用office 365自带的预约会议的功能,预约一场会议,然后再取消。发现生成的ics文件和我们日程服务中生成的取消会议的ics文件没有什么区别。
解决方案 :
给office365发送ics附件,需要设置Content-Type: text/calendar; charset="utf-8"; method=CANCEL(这里的method不是指的ics文件中的method)。意味着,office 365做了强制校验,邀请的邮件icalendar附件赋的Content-Type的method需要是REQUEST,日历中才会显示邀请的会议,取消的邮件icalendar附件赋的Content-Type的的method需要是CANCEL,日历中才会显示取消的会议。
因此在发邮件时需要注意设置method: