- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试发送 .ics
通过 SendGrid(来自 Node 服务器)日历邀请,以便它在 Outlook 或 Gmail 等客户端中呈现为实际邀请(带有接受/拒绝按钮),而不仅仅是作为附件文件。
我花了几天的时间研究这个(几十个 Stackoverflow 问题,RFC-5545,RFC-2446,iCalendar Specification Excerpts,Sendgrid 的 GitHub 问题线程:1,2,7Sendgrid 等 6 个来源)。
然而,这似乎没有答案(或者我错过了什么?)。
到目前为止我发现的是 Content-Type
因为附件在这里很重要,特别是,method=REQUEST
部分。甚至 3 .
尽管这里有很多关于 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'
(而且它们之间似乎没有任何区别)。
Content-Type
是根据 SendGrid 文档的保留 header ,因此无法通过
headers
以某种方式设置它属性(property)
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 中无缝打开。
invite.ics
上的“下载”。 ,然后打开它,只有在此之后日历应用程序才会打开,您可以确认邀请。
rendering
.ics
邀请是 Outlook 或 Gmail 自动识别时
.ics
附件并如下图所示显示(对不起红线):
@sendgrid/mail
v6.3.1
.ics
文件并允许用户在电子邮件客户端本身中接受/拒绝这些邀请,而无需手动下载文件并打开它?
最佳答案
好的,经过大量的反复试验,我终于得到了这个工作。我希望代码对其他人有帮助。
所以,首先,我所做的是从 iCalendar 发送一个实际的事件邀请并收到这个 .ics
邀请(实际上在 Outlook 和 Gmail 中都呈现了)。我查看了这个文件与我生成的文件有何不同,并发现了一件奇怪的事情:
让这个工作的关键是......
魔术弦
是的,完全随机的,奇怪的魔法弦。
下面我发布了 .ics
对我有用的文件内容。TOTTALLY-RANDOM-MAGIC-STRING
- 是一个完全随机的字符串的占位符,比如 uuids 或者你的组织电子邮件或其他任何东西。
关键是:在 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");
const attachment = {
filename: 'invite.ics',
name: 'invite.ics',
content: Buffer.from(data).toString('base64'),
disposition: 'attachment',
contentId: uuid(),
type: 'text/calendar; method=REQUEST',
};
await SendGrid.send({
attachments: [attachment],
templateId,
from: {
email: config.emailSender,
name: config.emailName,
},
to: user.email,
dynamicTemplateData: templateData
});
我希望这会为试图获得此内容的人们节省一些时间
.ics
东西工作。
关于outlook - 如何通过 SendGrid 发送 .ics 日历邀请,以便在电子邮件客户端中呈现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67149571/
如何防止我的仅 ICS 小部件出现在旧手机上,同时仍然保持我的应用程序向后兼容。目前,我的任务管理器在 froyo 及更高版本上运行,但我有一个 ICS 和更高版本的小部件,我只想向兼容用户显示。 最
我遇到一个问题,加载动画(5 个连续点从左向右移动)在 ICS 后设备中不起作用,但在 ICS 前设备中完美运行。我尝试在两者中复制调用动画的相同方法,但它似乎不起作用。 提前致谢, 阿曼尼·斯旺
我刚刚查看了 Ice Cream Sandwich 源代码,因为我正在尝试将 Holo 主题移植到所有 4.0 之前的设备。 我使用了很多有用的工具: 操作栏:ActionBarSherlock IC
我正在从 C# WPF 应用程序创建 ICS 文件并使用以下代码生成 ICS 文件。 StreamWriter writer; writer = new StreamWriter(filePath);
有没有办法在应用程序中的非 ICS android 手机上获得 android ICS 控件?例如,我已经看到 echofone 或其他一些使用 ICS 控件的应用程序,这些应用程序在低于 ICS (
我的应用创建了一个 ICS 文件,并将其作为 mimeType:@"text/calendar" 类型的电子邮件附件发送。 在 iOS6 中一切都运行完美。如果设备有 iOS7,电子邮件的附件 .IC
在我的应用程序中,我使用一些对话框来显示信息。我的应用程序的主题是 Theme.Light 从 2 年开始,这些对话框从一开始就一直是黑色的。 现在有了 ICS,Google 似乎只是改变了主意,将这
我们正在从 Java 代码生成一个 ICS 文件,并最初以 UTC 格式输入时间。 我们发现,在创建定期约会时,如果第一个日期和最后一个日期之间的 DST 发生变化,一些 session 会在正确时间
嗨,我刚刚发现了 ics 文件格式,我想知道是否可以在事件条目中包含一个或两个警报点,这些警报点将自动被拾取? 代码: BEGIN:VEVENT DTSTART;TZID=Europe/Amsterd
我正在使用 ASP.NET 创建一个 ics 文件,用于将假日导入 Outlook 2007 并尝试设置全天事件标志。这在多日假期中效果很好,但对于单日假期,它似乎没有注册,我只是得到了从午夜到午夜预
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Strange NetworkOnMainThreadException in Android app? Tryin
我制作了一个 ICS 提要,其中包含一长串事件。我的时区似乎不起作用。 在下面的示例中,您会看到我的事件应于 07:55:00 开始并于 09:30:00 结束。这就是我的日历中应该显示的内容。相反,
我们为我们的外联网开发了一个日历。每周我们都会为学校的所有师生更新下周的类(class)安排。这也会触发向选择该选项的用户发送每封电子邮件的 ICS 文件。 现在,几乎总是会发生最后一刻的更改,因此需
我正在为公司使用 JavaScript 开发 EPUB 阅读器,该应用程序在 Android 2.2 上运行良好,但当我在 ICS 和 HoneyCom 上尝试时,JavaScript 无法正常运行。
我有一项 Activity ,其中的 ListView 来自网络。在加载数据时,我想显示一个进度对话框而不是 ListView 。 我的布局: 我这样做是为了让进度条自行显示(
我熟悉android 2.2,一直在做手机开发,那么ICS平板开发该从何入手呢?我从 quick-google 学到的主要内容是,现在我必须将 fragment 用于多 Pane 布局,而不仅仅是 A
我试着读出所有现有的日历。我试过这里的例子: http://developer.android.com/guide/topics/providers/calendar-provider.html 但我
我正在尝试在模拟器上测试 ICS 的加密功能。 为了启用“加密电话”,我们运行“telnet localhost 5554”,然后运行“power capacity 100”。 在此之后,当我单击“加
我已设置 android:targetSdkVersion=15 并将 SDK 构建为 15,同时假设该应用程序将使用来自 ICS 的新的好日期选择器,而在 2.x 设备上它将使用旧的讨厌的日期选择器
我在我的 Skyrocket 设备和模拟器上的 Android ICS 浏览器中发现了一个奇怪的错误。基本上,我拥有的固定 header 几乎失去了所有样式(恢复为文本,尽管它看起来仍然是固定的)。当
我是一名优秀的程序员,十分优秀!