gpt4 book ai didi

ruby-on-rails - 如何通过 Icalendar gem 获取 RSVP 按钮

转载 作者:太空宇宙 更新时间:2023-11-03 17:10:21 25 4
gpt4 key购买 nike

所以我在我的 ruby​​ 项目中得到了 Icalendar gem。我试图在邀请中获得“是/否/也许”的 RSVP 按钮,但每当它被发送时,我只会收到“添加到日历”。

想知道我还需要什么:

def make_ical_appointment(start_time, end_time, uid, email_one, email_two)
ical = Icalendar::Calendar.new
ical.timezone.tzid = "UTC"

e = Icalendar::Event.new
e.dtstart = start_time
e.dtend = end_time
e.organizer = %W(mailto:#{email_one} mailto#{email_two})
e.uid = uid

ical.add_event(e)
ical.publish

mail.attachments['appointment.ics'] = { mime_type: 'application/ics', content: ical.to_ical }
end

我读到人们需要将其设置为 METHOD:REQUEST,但我不确定在哪里设置。我也看到需要设置出席者,但是好像只有闹钟才能设置出席者?

只是想让它看起来像一个普通的邀请。

最佳答案

要解决您的问题,您需要做两件事:

  1. Read RFC-2445 ,它定义了 iCal 格式。讨论 ATTENDEE 属性的 4.8.4.1 节和讨论 RSVP 参数的 4.2.17 节看起来特别有趣。

  2. 查看您收到的在各种电子邮件客户端中正确显示的电子邮件和 .ics 文件。

page I linked to在我上面的评论中有三个提示。

第一个提示

I tried adding this property:
calendar.custom_property("METHOD", "REQUEST").[1]

根据文档,我认为这应该是 append_custom_property .

打开某人从 Google 日历发给我的邀请,我发现了这一行:

METHOD:REQUEST

所以这似乎是合法的。

第二个提示

I would guess that you need to add an ATTENDEE property with RSVP=TRUE and the email set to the same email that Outlook or Yahoo link to their users.[2]

在同一个邀请中我发现了这个:

ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
TRUE;CN=Firstname Lastname;X-NUM-GUESTS=0:mailto:jordan@example.com

我没有阅读完整的 RFC,但我认为它是这样分解的:

  • ATTENDEE属性名称
  • 第一个 ; 和第一个 : 之间的所有内容都是参数。它们中的每一个都记录在 RFC 中,我不知道它们是否都是必需的,但我们可以在那里看到 RSVP=TRUE 参数。
  • 第一个 : 之后的所有内容,即 mailto:jordan@example.com

查看 append_custom_property 的来源我们看到它检查 value 是否是一个 Icalendar::Value 对象,如果不是,它会创建一个 Icalendar::Values::Text.new(value )。由于我们除了值之外还有参数,让我们检查一下构造函数 here .我们看到它可以接受第二个参数,这是一个 params Hash。

现在,我还没有测试过它,但这对我来说表明您可以使用类似以下的代码来构建与上面类似的代码行:

attendee_params = { "CUTYPE"   => "INDIVIDUAL",
"ROLE" => "REQ-PARTICIPANT",
"PARTSTAT" => "NEEDS-ACTION",
"RSVP" => "TRUE",
"CN" => "Firstname Lastname",
"X-NUM-GUESTS" => "0" }

attendee_value = Icalendar::Values::Text.new("MAILTO:jordan@example.com", attendee_params)
ical.append_custom_property("ATTENDEE", attendee_value)

编辑:在 Icalendar 2.x 中,您似乎还可以:

attendee_value = Icalendar::Values::CalAddress.new("MAILTO:jordan@example.com", attendee_params)
ical.append_attendee(attendee_value)

CalAddress类是 Uri 的子类,它只是通过 URI.parse 运行给定的值,而 append_attendee 似乎是 append_custom_property("ATTENDEE", ...).

我不确定是否所有这些参数都是必需的,但您可以通过阅读 RFC 了解它们中的每一个。

第三个提示

What I had to do to make it work in all mail clients was to send it as a multipart/alternative message with the ical as an alternative view instead of as an attachment.[3]

果然,在 Gmail 中执行“Show Original”我看到我收到的邀请邮件是一个多部分的邮件,有一个 text/calendar 部分:

--047d7b0721581f7baa050a6c3dc0
Content-Type: text/calendar; charset=UTF-8; method=REQUEST
Content-Transfer-Encoding: 7bit

BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
...

...和一个 application/ics 附件部分:

--047d7b0721581f7bae050a6c3dc2
Content-Type: application/ics; name="invite.ics"
Content-Disposition: attachment; filename="invite.ics"
Content-Transfer-Encoding: base64

QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vR29vZ2xlIEluYy8vR29vZ2xlIENhbGVuZGFyIDcw
...

感谢 mail.attachments,您已经有了第二部分。对于第一部分,您只需使用正确的 content_type 创建一个新的 Mail::Part 并将其添加到 mail.parts,这将看起来像这样:

ical_part = Mail::Part.new do
content_type "text/calendar; charset=UTF-8; method=REQUEST"
body ical.to_ical
end
mail.add_part(ical_part)

这就是我的全部。同样,我没有测试过这些,我不确定它会解决你的问题,但希望它能给你一些想法。

我认为,最重要的是查看带有邀请的电子邮件来源(如果您使用 Gmail,“显示原件”位于“回复”按钮旁边的下拉菜单下),并查看它们如何“重新构建,同样查看 .ics 附件,看看它们是否与您生成的内容匹配。

祝你好运!


根据 the way Icalendar transforms the params hash into iCal parameters 判断,我想你也可以使用符号键,就像这样:

attendee_params = { cutype:   "INDIVIDUAL",
role: "REQ-PARTICIPANT",
partstat: "NEEDS-ACTION",
rsvp: "TRUE",
cn: "Firstname Lastname",
x_num_guests: "0" }

关于ruby-on-rails - 如何通过 Icalendar gem 获取 RSVP 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27514552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com