.ics
日历邀请,以便在Outlook或Gmail等客户端中呈现为实际邀请(带有接受/拒绝按钮),而不仅仅是作为附件文件。我已经花了好几天的时间研究这个问题(阅读了数十篇Stackoverflow问题,RFC-5545,RFC-2446,iCalendar Specification Excerpts,Sendgrid的GitHub问题线程:1,2,3,SendGrid文档,来源等)。
然而,似乎就是没有一个答案(或者我漏掉了什么?)。
到目前为止,我发现附件的
Content-Type
非常重要,特别是method=REQUEST
部分。甚至文件中属性的顺序也很重要。尽管在SO上有很多问题,但由于某些原因,大多数问题仍然没有得到解答。
以下是我设置attachment
对象的步骤:
const SendGrid = require("@sendgrid/mail");
const attachment = {
filename: 'invite.ics',
name: 'invite.ics',
content: Buffer.from(data).toString('base64'),
disposition: 'attachment',
contentId: uuid(),
type: 'application/ics'
};
SendGrid.send({
attachments: [attachment],
templateId,
from: {
email: config.emailSender,
name: config.emailName,
},
to: user.email,
dynamicTemplateData: {
...rest,
user,
},
headers: {
'List-Unsubscribe': `<mailto:unsubscribe.link`,
},
});
关于type
属性,我尝试了以下几种变体:
1. type: 'text/calendar; method=REQUEST'
2. type: 'application/ics'
3. type: 'text/calendar;method=REQUEST;name=\"invite.ics\"'
4. type: 'text/calendar; method=REQUEST; charset=UTF-8; component=vevent'
5. type: 'text/calendar'
然而,除了"text/calendar"和"application/ics"之外,没有任何东西起作用(它们之间似乎没有任何区别)。
根据SendGrid文档,"Content-Type"是一个保留头,因此无法通过"headers"属性或其他方式设置它。
"disposition: 'inline'"选项也根本不起作用(只有"disposition: 'attachment'")。
以下是我生成的.ics
文件的样式:
BEGIN:VCALENDAR
PRODID:-//Organization//Organization App//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20210426T160000Z
DTEND:20210426T170000Z
DTSTAMP:20210418T134622Z
ORGANIZER;CN=John Smith:MAILTO:john.smith+test1@gmail.com
UID:dcfd5905-be85-4c8f-8a27-475b0ec67d8b
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=John Smith;X-NUM-GUESTS=0:MAILTO:john.smith+test1@gmail.com
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=John Test;X-NUM-GUESTS=0:MAILTO:john.smith+test2@gmail.com
CREATED:20210418T134622Z
DESCRIPTION:my description
LAST-MODIFIED:20210418T134622Z
LOCATION:https://location.url
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:my summary
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
这个文件是完全有效的,并且在iCalendar中可以无缝打开。
但为什么在Outlook或Gmail中不显示呢?
目前,将事件添加到日历的唯一方法是单击附件上的“下载”按钮invite.ics,然后打开它,只有在此之后才会打开日历应用程序并确认邀请。
PS:我所说的“渲染”.ics
邀请是指Outlook或Gmail自动识别.ics
附件,并像下面的图像一样显示它(很抱歉,红线):
如果有任何区别的话,我正在使用@sendgrid/mail
v6.3.1
你能帮我解决问题吗?我做错了什么吗?
如何让电子邮件客户端识别我的.ics
文件,并允许用户在电子邮件客户端中接受/拒绝这些邀请,而无需手动下载文件并打开它?