email - 如何使用 ICS 文件在 Google 日历中添加/修改事件

标签 email google-calendar-api icalendar

我正在尝试创建一个 ICS 文件以通过电子邮件将事件添加到 Google 日历。最后,日历将从桌面应用程序发送给多个用户。理想情况下,如果事件发生变化,我希望能够修改日历(只是事件时间,我忽略了取消的事件)

这是我的 ICS 文件

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//MY COMPANY//Calendar//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
UID:shift-439-emp-128@mycompany.com
DTSTART:20180604T090000
DTEND:20180604T153000
DTSTAMP:20180519T081800
SUMMARY:Morning shfit
LOCATION:Morning Location
DESCRIPTION:Morning shift
END:VEVENT
BEGIN:VEVENT
UID:shift-446-emp-128@mycompany.com
DTSTART:20180605T153000
DTEND:20180605T233000
DTSTAMP:20180519T081800
SUMMARY:Night shift
LOCATION:
DESCRIPTION:Night
END:VEVENT
END:VCALENDAR

当我将该文件通过电子邮件发送到我的 gmail 帐户时,我可以看到一个“添加到 Google 日历”按钮,我可以使用该按钮将事件添加到我的主日历中。

现在,假设事件时间发生了变化。

问题 : 我怎样才能用新的时间创建一个新的 ICS 文件,以便在谷歌日历中修改现有的事件?

我将 UID 用于事件,以便 google 不会创建重复条目。但是,当我通过电子邮件发送第二个带有修改事件(带有 uid)的 ics 文件时,“添加到谷歌日历”按钮不会出现。如果我尝试从谷歌日历导入功能手动导入 ics 文件,则会收到此错误消息

Could not upload your events because you do not have sufficient access on the target calendar.



如果我每次设置不同的 UID,导入过程将起作用,但会创建重复条目。

我也尝试使用 REQUEST而不是 PUBLISH方法

谢谢

最佳答案

我能够使用以下方法与 Gmail 一起使用:

  • METHOD : 设置为 REQUEST
  • SEQUENCE : 设置为 0在第一次请求时,每次加 1
  • ATTENDEE : 通过电子邮件地址
  • 识别正在接收电子邮件的 Gmail 用户

    其他变化会产生不良影响:
  • 只看到两个事件中的一个
  • 不更新现有事件

  • Office 365 将 ICS 文件发送到可以更新的 Gmail,以便用于引用商业实现。您可以查看 Outlook 365 发送的请求,方法是在 Gmail 中使用“显示原始”来检索 base64 编码的日历正文。 Outlook 365 使用许多其他字段,因此检查起来很有指导意义。

    我在 Go 中有一个使用 SparkPost 的测试脚本,所以如果您有任何问题或想使用它,请告诉我。 SparkPost 有一个免费套餐,但您仍然需要配置您的出站发送域才能使用它。

    这是一个修改请求的示例。我只是增加 SEQUENCE并更改在 Gmail 中更新请求的时间。
    BEGIN:VCALENDAR
    VERSION:2.0
    PRODID:-//MY COMPANY//Calendar//EN
    CALSCALE:GREGORIAN
    METHOD:REQUEST
    BEGIN:VEVENT
    ATTENDEE;ROLE=REQ-PARTICIPANT;CN=example@gmail.com:MAILTO:example@gmail.com
    UID:shift-1807-emp-128@mycompany.com
    DTSTART:20180807T010000
    DTEND:20180807T020000
    DTSTAMP:20180601T033455
    SEQUENCE:0
    SUMMARY:Morning shift
    LOCATION:Morning Location
    DESCRIPTION:Morning shift
    END:VEVENT
    BEGIN:VEVENT
    ATTENDEE;ROLE=REQ-PARTICIPANT;CN=example@gmail.com:MAILTO:example@gmail.com
    UID:shift-1808-emp-128@mycompany.com
    DTSTART:20180807T130000
    DTEND:20180807T140000
    DTSTAMP:20180601T033455
    SEQUENCE:0
    SUMMARY:Night shift
    LOCATION:Night Location
    DESCRIPTION:Night
    END:VEVENT
    END:VCALENDAR
    

    值得注意的是,在单个 ICS 文件中发送多个事件时,有时 Gmail 需要一秒钟左右的时间才能在我的测试中以正确的时间显示这两个事件。

    关于email - 如何使用 ICS 文件在 Google 日历中添加/修改事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50422635/

    相关文章:

    android - 无法将事件添加到 android 中的日历

    java - 为群组中的所有用户分配 Google 日历访问权限 (Java)

    ruby-on-rails - 错误 : Import of a ics file

    icalendar - Icalendar 中的多次重复规则和异常规则

    PHP 邮件、抄送字段

    shell - 使用cron作业和Shell脚本发送邮件

    java - 无法通过 sengrid v3 api 发送电子邮件(java.io.IOException : Request returned status Code 401)

    email - 是否可以使用 OpenERP 实现电子邮件已读回执?

    google-calendar-api - 有没有办法以编程方式将ICS导入Google日历?

    icalendar - Webcal 和 WebDAV/CalDAV 有什么区别?