Outlook 如何通过SendGrid发送.ics日历邀请,以便在电子邮件客户端中呈现?

Outlook 如何通过SendGrid发送.ics日历邀请,以便在电子邮件客户端中呈现?,outlook,gmail,sendgrid,icalendar,sendgrid-api-v3,Outlook,Gmail,Sendgrid,Icalendar,Sendgrid Api V3,我正试图通过SendGrid(从节点服务器)发送.ics日历邀请,以便它在Outlook或Gmail等客户端中呈现为实际邀请(带有接受/拒绝按钮),而不仅仅是附件文件 我花了好几天的时间研究这个问题(几十个Stackoverflow问题,Sendgrid的GitHub发布线程,Sendgrid文档,源等等) 然而,似乎没有答案(或者我遗漏了什么?) 到目前为止,我发现附件的内容类型在这里非常重要,尤其是method=REQUEST部分。甚至如此 尽管在这方面有很多问题,但出于某种原因,大多数问

我正试图通过SendGrid(从节点服务器)发送
.ics
日历邀请,以便它在Outlook或Gmail等客户端中呈现为实际邀请(带有接受/拒绝按钮),而不仅仅是附件文件

我花了好几天的时间研究这个问题(几十个Stackoverflow问题,Sendgrid的GitHub发布线程,Sendgrid文档,源等等)

然而,似乎没有答案(或者我遗漏了什么?)


到目前为止,我发现附件的
内容类型
在这里非常重要,尤其是
method=REQUEST
部分。甚至如此

尽管在这方面有很多问题,但出于某种原因,大多数问题仍然没有答案


以下是我如何设置我的
附件
对象:

const SendGrid=require(“@SendGrid/mail”);
常量附件={
文件名:“invite.ics”,
名称:“invite.ics”,
内容:Buffer.from(data.toString('base64'),
处置:'附件',
contentId:uuid(),
类型:“应用程序/ics”
};
SendGrid.send({
附件:[附件],
模板ID,
发件人:{
电子邮件:config.emailSender,
名称:config.emailName,
},
致:user.email,
dynamicTemplateData:{
休息
用户,
},
标题:{

“List Unsubscribe”:“好的,经过大量的尝试和错误,我终于让它工作了。我希望代码能对其他人有所帮助

因此,首先,我所做的是从iCalendar发送一个实际的活动邀请,并收到这个
.ics
邀请(它实际上在Outlook和Gmail中都得到了呈现)。我查看了这个文件与我生成的文件的不同之处,发现了一件奇怪的事情:

让这一切顺利进行的关键是

魔术弦

是的,完全是随机的,奇怪的魔法弦

下面我发布了对我有用的
.ics
文件内容

TOTTALLY-RANDOM-MAGIC-STRING
-是一个完全随机字符串的占位符,如UUID或您的组织电子邮件或其他任何内容

关键是:在Outlook和Gmail文件中使用这些字符串可以正确地呈现邀请,如果没有这些字符串,请不要这样做。奇怪,但可以正常工作

我在文档或RFC中找不到任何有意义的东西,所以我想现在称这些神奇的字符串是安全的

第一个魔术字符串是
TOTTALLY-RANDOM-magic-STRING@imip.me.com

第二个魔术字符串是
/TOTTALLY-RANDOM-magic-string/principal/

BEGIN:VCALENDAR
PRODID:-//Organisation//Organisation App//EN
METHOD:REQUEST
VERSION:2.0
BEGIN:VEVENT
DTEND:20210427T160000Z
ORGANIZER;CN=Organization Name;EMAIL=admin@organisation.com:mailto:TOTTALLY-RANDOM-MAGIC-STRING@imip.me.com
UID:D670DA52-3E7F-4F61-97E2-CB8878954504
DTSTAMP:20210419T181455Z
LOCATION:virtual.event.location.com
DESCRIPTION:description
URL;VALUE=URI:http://organization.com/invite
SEQUENCE:0
SUMMARY:my summary
LAST-MODIFIED:20210419T181455Z
DTSTART:20210427T150000Z
CREATED:20210419T181455Z
ATTENDEE;CUTYPE=INDIVIDUAL;EMAIL=my.email1@gmail.com:mailto:my.email1@gmail.com
ATTENDEE;CUTYPE=INDIVIDUAL;EMAIL=my.email2@gmail.com:mailto:my.email2@gmail.com
ATTENDEE;CN=Organisation Name;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED;ROLE=CHAIR;EMAIL=admin@organisation.com:/TOTTALLY-RANDOM-MAGIC-STRING/principal/
END:VEVENT
END:VCALENDAR
以及守则:

const SendGrid=require(“@SendGrid/mail”);
常量附件={
文件名:“invite.ics”,
名称:“invite.ics”,
内容:Buffer.from(data.toString('base64'),
处置:'附件',
contentId:uuid(),
键入:“文本/日历;方法=请求”,
};
等待SendGrid.send({
附件:[附件],
模板ID,
发件人:{
电子邮件:config.emailSender,
名称:config.emailName,
},
致:user.email,
dynamicTemplateData:模板数据
});
我希望这能为那些试图让
.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

BEGIN:VCALENDAR
PRODID:-//Organisation//Organisation App//EN
METHOD:REQUEST
VERSION:2.0
BEGIN:VEVENT
DTEND:20210427T160000Z
ORGANIZER;CN=Organization Name;EMAIL=admin@organisation.com:mailto:TOTTALLY-RANDOM-MAGIC-STRING@imip.me.com
UID:D670DA52-3E7F-4F61-97E2-CB8878954504
DTSTAMP:20210419T181455Z
LOCATION:virtual.event.location.com
DESCRIPTION:description
URL;VALUE=URI:http://organization.com/invite
SEQUENCE:0
SUMMARY:my summary
LAST-MODIFIED:20210419T181455Z
DTSTART:20210427T150000Z
CREATED:20210419T181455Z
ATTENDEE;CUTYPE=INDIVIDUAL;EMAIL=my.email1@gmail.com:mailto:my.email1@gmail.com
ATTENDEE;CUTYPE=INDIVIDUAL;EMAIL=my.email2@gmail.com:mailto:my.email2@gmail.com
ATTENDEE;CN=Organisation Name;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED;ROLE=CHAIR;EMAIL=admin@organisation.com:/TOTTALLY-RANDOM-MAGIC-STRING/principal/
END:VEVENT
END:VCALENDAR