我正在使用节点包ical-generator
生成.ics日历邀请,并通过mandrill在电子邮件中发送附件。
.ics日历邀请包含特定时间和日期的一个事件的信息。
示例生成的文件:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//sebbo.net//ical-generator//EN
METHOD:REQUEST
NAME: xxxx Events
X-WR-CALNAME: xxxxx
BEGIN:VEVENT
UID:5wzd@xxx.com
SEQUENCE:0
DTSTAMP:20180318T202459Z
DTSTART:20180330T230000Z
DTEND:20180330T230000Z
SUMMARY:test
LOCATION:test
DESCRIPTION:test
ORGANIZER;CN="info":mailto:info@xxxx.com
END:VEVENT
END:VCALENDAR
现在,用户收到日历邀请作为电子邮件中的附件,并且如果他们打开附件并点击“添加到日历”(在Outlook中),则可以将事件添加到他们的日历中。
我需要做出哪些更改才能使日历邀请由邮件客户端自动解析并添加到用户的日历中(类似功能可在来自meetup和eventbrite等网站的电子邮件确认中找到)。
我不确定我是否拥有有关电子邮件客户端,日历系统或.ics文件如何工作的上下文知识,以获得如何解决此问题的框架
非常感谢任何有关资源的建议或指示!谢谢!
答案 0 :(得分:2)
为了自动添加事件,您需要考虑三点:
电子邮件标题
为了让电子邮件客户端正确解析附加的 .ics 文件,您应该将调度方法和 MIME 信息添加到电子邮件标题中。这由 iCalendar Message-Based Interoperability Protocol (RFC 2447) 指定。
因此,您的标题应包含 Content-Type, Content-Transfer-Encoding 和 Content-Disposition 如下例所示:
Content-Type: text/calendar; charset=utf-8; method=REQUEST; name=invite.ics'
Content-Transfer-Encoding: Base64
Content-Disposition: attachment; filename=invite.ics
iCalendar 方法
在 MIME 消息实体中使用时,“METHOD”的值必须与 Content-Type“method”的值相同。这只能在 iCalendar 对象中出现一次。该字段的值由 iCalendar Transport-Independent Interoperability Protocol (iTIP) (RFC 5546) 定义。 要请求召开会议,该值应为 "REQUEST"。
METHOD:REQUEST
参加者信息“VEVENT”日历组件
此属性是特定“参加者”相对于事件的状态。它用于安排日程,由每个与会者的“ATTENDEE”属性中的“PARTSTAT”参数定义。
ATTENDEE;PARTSTAT=ACCEPTED;CN="Jane
Doe";EMAIL=jdoe@gmail.com:MAILTO:jdoe@gmailcom
以下是最小 .ics 文件的示例:
BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
UID:<unique-id>@<site>.com
DTSTAMP:20210605T073803Z
DTSTART;TZID=America/Guayaquil:20210614T030000
DTEND;TZID=America/Guayaquil:20210614T040000
SUMMARY:My Event
ORGANIZER;CN="Juan Perez":mailto:jperez@organizer.com
ATTENDEE;PARTSTAT=ACCEPTED;CN="Jane
Doe";EMAIL=jdoe@gmail.com:MAILTO:jdoe@gmailcom
URL;VALUE=URI:https://<site>.com/event/5960492994476830083
END:VEVENT
END:VCALENDAR
有关详细信息,please take a look at my gist。
答案 1 :(得分:0)
您可以做的最好的事情是确保ics文件设置良好,文本/日历标题等。
提供系统不能强制用户设备如何处理文件,它完全在接收器及其设备设置的控制之内。 例如,我将我的Windows PC设置为在文本编辑器中打开ics文件,而我的iphone将尝试添加到日历(icloud one),但我实际上使用谷歌日历。 Gmail曾经不会自动添加邀请,除非他们被发送到gmail地址,而我使用其他域名进行个人/家庭与工作,这些都归于gmail。我不确定这是否还是个问题。我不希望自动添加。
根据您开发的系统类型,您可能需要考虑让收件人只订阅一次个人网址,而不是一直发送个人邀请。如果订阅,则将自动显示未来的事件/类等。当系统这样做时,我喜欢它,但它们往往不喜欢它。 EG:单独注册的课程。
答案 2 :(得分:0)
要使此功能正常运行,您需要做两件事:
1)电子邮件中附件的正确编码,请参阅以下电子邮件标题:
Content-Disposition: attachment;
filename=meeting.ics
Content-class: urn:content-classes:calendarmessage
Content-Type: text/calendar;
name="meeting.ics";
component="VEVENT"
Content-Transfer-Encoding: 7bit
2)ics文件的正确格式。如果您使用PHP生成ICS文件,则应使用icalendar.org
提供的库尝试使用此事件来测试是否正常工作,并使用上述站点中提供的验证器。
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//ZContent.net//ZapCalLib 1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
SUMMARY:Simple Event
DTSTART:20200101T120000
DTEND:20200101T130000
UID:2020-02-12-11-02-23@demo.icalendar.org
DTSTAMP:20200212T100223
Description:This is a simple event\, using the Zap Calendar PHP library. Vi
sit http://icalendar.org to validate icalendar files.
END:VEVENT
END:VCALENDAR