【问题标题】:iCal calendar events no longer cancelling after outlook updateOutlook 更新后 iCal 日历事件不再取消
【发布时间】:2019-09-04 10:23:14
【问题描述】:

我有一个系统可以生成电子邮件,包括嵌入式 iCalendar 事件,这些事件会发送给相关人员。 事件是从任务创建的。 可以编辑任务,从而更新会议时间等。 该任务也可以通过取消来取消,这将再次更新会议。 一年多来,这一切都运行良好。 但是大约 6 周前更新了办公室,包括对 Outlook 的一个非常明显的更新(现在会议/活动请求的显示方式大不相同,因此 Outlook 团队在该领域进行了一些重要的工作) - 问题是这个更新破坏了 iCalendar 事件取消。 初次会议仍然可以正常工作,编辑也是如此。但是当取消而不是嵌入 iCalendar 事件时,我现在只得到一个标题为:“不支持的日历 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--

更新事件:

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

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

[test] testing iCal - updated


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

<b>Delivery 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 - updated</p>


--b1_23a19fb87bb01c1c2ae6e3fede170549
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
CATEGORIES:Louis Marchant
LAST-MODIFIED:20190902T152651
UID:d7f4bed92a83499c81392678cd655aeb
DTSTAMP:20190902T152651
DTSTART;TZID="Europe/London":20190907T090000
DTEND;TZID="Europe/London":20190907T170000
TRANSP:OPAQUE
SEQUENCE:2
SUMMARY:"test event"
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_23a19fb87bb01c1c2ae6e3fede170549--

取消事件 - 不再起作用的事件:

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

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

Meeting Cancelled


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

Meeting Cancelled


--b1_87ddce1a469e89e0c0caa7b0a82efd5e
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:CANCEL
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
CATEGORIES:Louis Marchant
LAST-MODIFIED:20190902T152921
UID:d7f4bed92a83499c81392678cd655aeb
DTSTAMP:20190902T152921
DTSTART;TZID="Europe/London":20190907T090000
DTEND;TZID="Europe/London":20190907T170000
TRANSP:OPAQUE
SEQUENCE:2
SUMMARY:"Louis Marchant - Offsite - 2 Circles Communication Limited 602"
LOCATION:
STATUS:CANCELLED
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_87ddce1a469e89e0c0caa7b0a82efd5e--

任何见解都会有所帮助,因为我的想法很新鲜。虽然我怀疑它可能只是不再可能,尽管我显然希望不是这样。

【问题讨论】:

    标签: outlook phpmailer icalendar


    【解决方案1】:

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

    另一个问题与iCal events other than REQUEST 相关,特别是在 Outlook 中。这个问题在你的例子中很明显:

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

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

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

    【讨论】:

    • 因此,按照您的链接,我对我的 PHPMailer 副本进行了粗略的编辑,以检测 iCal 方法是否被取消,并相应地更改标题方法。 Outlook 现在可以正确地将其检测为有效的会议取消。
    • 虽然看起来它仍然不像以前那样 100%,因为用户必须接受才能删除会议,而以前的 Outlook 只是这样做了。这对用户自己来说很好,但我们也有一个共享日历,它的邮箱不受监控,所以不太好,因为他们仍然不会从中删除。但至少相关用户应该知道他们自己的日历中的取消。简而言之,与没有取消相比有了很大的改进 - 并且在短期内可行,但仍不是 100% 理想。
    【解决方案2】:

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

    我得到了解决方案。这对我有用。

    问题:

    $mail->addCustomHeader('Content-type',"text/calendar; name=event.ics; method=REQUEST; charset=UTF-8;");
    

    将方法类型从 REQUEST 更改为 CANCEL

    分辨率:

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

    【讨论】:

    • 不幸的是 Outlook 刚刚再次更新,现在所有请求(不仅仅是取消)都像上面一样失败。所以我无法测试取消,因为我无法再创建初始请求。但一旦我找到解决这个新问题的方法,我会牢记这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多