iCal日历事件在outlook更新后不再取消

iCal日历事件在outlook更新后不再取消,outlook,phpmailer,icalendar,Outlook,Phpmailer,Icalendar,我有一个系统可以生成电子邮件,包括嵌入式iCalendar事件,并发送给相关人员。 事件是从任务创建的。 可以编辑任务,从而更新会议时间等。 还可以通过取消任务来取消任务,从而再次更新会议。 一年多以来,这一切都运转良好。 但大约6周前,office进行了更新,包括对outlook的一次非常引人注目的更新(现在会议/事件请求的显示方式大不相同,因此outlook团队在该领域进行了一些重要的工作)-问题是此更新破坏了iCalendar事件取消。 最初的会议仍然可以正常工作,编辑也是如此。但是当取消

我有一个系统可以生成电子邮件,包括嵌入式iCalendar事件,并发送给相关人员。 事件是从任务创建的。 可以编辑任务,从而更新会议时间等。 还可以通过取消任务来取消任务,从而再次更新会议。 一年多以来,这一切都运转良好。 但大约6周前,office进行了更新,包括对outlook的一次非常引人注目的更新(现在会议/事件请求的显示方式大不相同,因此outlook团队在该领域进行了一些重要的工作)-问题是此更新破坏了iCalendar事件取消。 最初的会议仍然可以正常工作,编辑也是如此。但是当取消而不是嵌入式iCalendar事件时,我现在只得到一个标题为“not supported calendar message.ics”的附件

我正在使用PHPMailer发送电子邮件,并使用此库提供的ical功能将生成的iCalendar事件附加到电子邮件

我已经尽力调试了,这并不容易,因为他们似乎已经删除了查看完整电子邮件源的任何方式。 然而,我试图简化iCalendar事件,使其完全赤裸裸,没有运气。 因此,我已指示PHPMailer转储完整的电子邮件。出于调试目的-输出如下:

事件创建:

Content-Type: multipart/alternative;
        boundary="b1_ee3827bf9d86f19f6cb13cbcbc05bb33"
Content-Transfer-Encoding: 8bit^M
^M
This is a multi-part message in MIME format.

--b1_ee3827bf9d86f19f6cb13cbcbc05bb33
Content-Type: text/plain; charset=us-ascii

[test] testing iCal


--b1_ee3827bf9d86f19f6cb13cbcbc05bb33
Content-Type: text/html; charset=us-ascii

Details:</b></u><br /><i>Off-Site</i><br /><u><b>Technical Contact Name:</b></u> Test User<br /><u><b>Technical Contact Number:</b></u> 12345<br /><u><b>Technical Contact e-mail:</b></u> anothertest@test.com<br /><u><b>Work to be done:</b></u><br /><p>[test] testing iCal</p>


--b1_ee3827bf9d86f19f6cb13cbcbc05bb33
Content-Type: text/calendar; method=REQUEST; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VTIMEZONE
TZID:Europe/London
BEGIN:STANDARD
DTSTART:20091101T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
TZOFFSETFROM:+0100
TZOFFSETTO:+0000
TZNAME:GMT
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:20090301T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
TZOFFSETFROM:+0000
TZOFFSETTO:+0100
TZNAME:BST
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
LAST-MODIFIED:20190902T151649
UID:d7f4bed92a83499c81392678cd655aeb
DTSTAMP:20190902T151649
DTSTART;TZID="Europe/London":20190906T090000
DTEND;TZID="Europe/London":20190906T170000
TRANSP:OPAQUE
SEQUENCE:0
SUMMARY:"test task"
LOCATION:
STATUS:CONFIRMED
ORGANIZER;CN="xxxx@xxxx.com":MAILTO:xxxx@xxxx.com
ATTENDEE;CN="xxxx@xxxx.com";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED;MAILTO:xxxx@xxxx.com
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MS-OLK-CONFTYPE:0
CLASS:PUBLIC
PRIORITY:5
END:VEVENT
END:VCALENDAR



--b1_ee3827bf9d86f19f6cb13cbcbc05bb33--

任何见解都会有帮助,因为我还没有想法。尽管我怀疑这可能不再可能,但我显然希望情况并非如此。

PHPMailer的iCal支持有一些局限性,有些局限性与它在不同客户机中的支持方式极不一致有关。讨论其中的一些问题

另一个问题涉及到,特别是在Outlook中。在您的示例中可以看到此问题:

Content-Type: text/calendar; method=REQUEST; charset=iso-8859-1

METHOD:CANCEL
请注意,这两个方法名称不匹配;这是因为PHPMailer目前只支持
请求
类型的消息,而且Outlook可能不喜欢这种不匹配。我在第二期中建议,PHPMailer可以扫描
iCal
属性中提供的iCal数据的内容,提取方法值,然后在用于该元素的content-type头中使用它


PHPMailer目前没有这样做,但是如果您想添加对它的支持并提交拉取请求,这将是非常受欢迎的。

PHPMailer的iCal支持有一些限制,有些限制与它在不同客户端中的支持方式极不一致有关。讨论其中的一些问题

另一个问题涉及到,特别是在Outlook中。在您的示例中可以看到此问题:

Content-Type: text/calendar; method=REQUEST; charset=iso-8859-1

METHOD:CANCEL
请注意,这两个方法名称不匹配;这是因为PHPMailer目前只支持
请求
类型的消息,而且Outlook可能不喜欢这种不匹配。我在第二期中建议,PHPMailer可以扫描
iCal
属性中提供的iCal数据的内容,提取方法值,然后在用于该元素的content-type头中使用它


PHPMailer目前没有这样做,但是如果您想添加对它的支持并提交请求,那将非常受欢迎。

在outlook更新之后,我也遇到了同样的问题。我能够成功创建事件,但当我尝试取消事件时,cal_事件并没有像以前那样嵌入到邮件中。而是使用不受支持的.ics附件发送邮件

我找到了解决办法。这对我有用

问题:

$mail->addCustomHeader('Content-type',"text/calendar; name=event.ics; method=REQUEST; charset=UTF-8;");
将方法类型从请求更改为取消

分辨率:

$mail->AddStringAttachment($ical, "event.ics", "7bit", "text/calendar; charset=utf-8; method=CANCEL");

在outlook更新之后,我也遇到了同样的问题。我能够成功创建事件,但当我尝试取消事件时,cal_事件并没有像以前那样嵌入到邮件中。而是使用不受支持的.ics附件发送邮件

我找到了解决办法。这对我有用

问题:

$mail->addCustomHeader('Content-type',"text/calendar; name=event.ics; method=REQUEST; charset=UTF-8;");
将方法类型从请求更改为取消

分辨率:

$mail->AddStringAttachment($ical, "event.ics", "7bit", "text/calendar; charset=utf-8; method=CANCEL");

因此,根据您的链接,我对我的PHPMailer副本进行了粗略编辑,以检测iCal方法是否为cancel,并相应地更改标题方法。Outlook现在可以正确地将其检测为有效的会议取消。尽管它似乎仍不像以前那样是100%,因为用户必须接受才能删除会议,而以前Outlook只是这样做。这对用户本身来说很好,但我们也有一个共享日历,它进入其中,邮箱不受监控,因此不太好,因为他们仍然不会从中删除。但至少相关用户应该知道从他们自己的日历取消。简而言之,与无取消相比有了巨大的改进——短期内可行,但仍然不是100%理想。因此,根据您的链接,我对我的PHPMailer副本进行了粗略编辑,以检测iCal方法是否为取消,并相应地更改标题方法。Outlook现在可以正确地将其检测为有效的会议取消。尽管它似乎仍不像以前那样是100%,因为用户必须接受才能删除会议,而以前Outlook只是这样做。这对用户本身来说很好,但我们也有一个共享日历,它进入其中,邮箱不受监控,因此不太好,因为他们仍然不会从中删除。但至少相关用户应该知道从他们自己的日历取消。简言之,与无取消相比有了巨大的改进——短期内是可行的,但仍然不是100%理想。不幸的是Outlook刚刚再次更新,现在所有请求(不仅仅是取消)都如上所述失败。因此,我无法测试取消,因为我无法再创建初始请求。但一旦我找到解决这个新问题的方法,我会记住这一点。不幸的是Outlook刚刚升级