所以我的ruby项目中有Icalendar宝石我正试图在邀请上获得Yes/No/Maybe的RSVP按钮,但每当它被发送时,我只得到一个“Add to Calendar”。
想知道我还需要什么:

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,但我不确定在那里做什么我也读到你需要设置与会者,但似乎你只能设置与会者,如果你有警报?
只是想让它看起来像一个普通的邀请。

最佳答案

你需要做两件事来解决你的问题:
Read RFC-2445,定义了iCal格式看起来第4.8.4.1节讨论了ATTENDEE属性,第4.2.17节讨论了RSVP参数,这将引起特别的兴趣。
查看您收到的电子邮件和.ics文件,它们在各种电子邮件客户端中正确显示。
我在上面评论中的page I linked to有三个提示。
第一个暗示
我尝试添加此属性:calendar.custom_property("METHOD", "REQUEST")[1]
从医生那里我想应该是append_custom_property
打开一个从谷歌日历发送给我的邀请,我发现这行:

METHOD:REQUEST

所以这似乎是合法的。
第二个暗示
我想您需要添加一个ATTENDEE属性,并将电子邮件设置为Outlook或Yahoo链接到用户的同一电子邮件。[2]
在同一个邀请中,我发现:
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
 TRUE;CN=Firstname Lastname;X-NUM-GUESTS=0:mailto:[email protected]

我没有读过整个RFC,但我认为它会像这样崩溃:
RSVP=TRUE是属性名。
第一个ATTENDEE和第一个;之间的所有内容都是参数。它们中的每一个都记录在rfc中,我不知道它们是否都是必需的,但是我们可以在那里看到:参数。
第一个RSVP=TRUE之后的所有内容,即:是值
查看mailto:[email protected]的源代码,我们可以看到它检查append_custom_property是否是一个value对象,如果不是,则创建一个带有Icalendar::Value的对象。由于除了值之外还有参数,让我们检查一下构造函数here我们看到它可能需要第二个参数,即Icalendar::Values::Text.new(value)散列。
现在,我还没有测试过它,但这对我意味着,您可以用如下代码构建一条类似于上述内容的行:
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:[email protected]", attendee_params)
ical.append_custom_property("ATTENDEE", attendee_value)

编辑:在iCalendar 2.x中,您还可以执行以下操作:
attendee_value = Icalendar::Values::CalAddress.new("MAILTO:[email protected]", attendee_params)
ical.append_attendee(attendee_value)

CalAddress类是Uri的一个子类,它只是通过params来运行给定值,URI.parse似乎是append_attendee的快捷方式。
我不确定是否所有这些参数都是实际需要的,但是您可以通过阅读rfc来了解每个参数是什么。
第三个暗示
要使它在所有邮件客户机中工作,我必须做的是将它作为多部分/可选邮件发送,并将ical作为可选视图而不是附件。[3]
当然,在gmail中做“show original”的时候,我看到我收到的邀请邮件是一封多部分的邮件,有一个append_custom_property("ATTENDEE", ...)部分:
--047d7b0721581f7baa050a6c3dc0
Content-Type: text/calendar; charset=UTF-8; method=REQUEST
Content-Transfer-Encoding: 7bit

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

…和附件部分:
--047d7b0721581f7bae050a6c3dc2
Content-Type: application/ics; name="invite.ics"
Content-Disposition: attachment; filename="invite.ics"
Content-Transfer-Encoding: base64

QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vR29vZ2xlIEluYy8vR29vZ2xlIENhbGVuZGFyIDcw
...

感谢text/calendar,你已经有了第二部分。对于第一部分,您只需使用正确的application/ics创建一个新的mail.attachments,并将其添加到Mail::Part,如下所示:
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,回复按钮旁边的下拉菜单中有“ShowOriginal”字样)和邀请,查看它们是如何构造的,同样,查看.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/

10-09 04:05