如何通过Icalendar gem获取RSVP按钮

jam*_*mby 1 ruby icalendar ruby-on-rails

所以我在我的ruby项目中得到了Icalendar宝石.我试图在邀请中获得Yes/No/Maybe的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
Run Code Online (Sandbox Code Playgroud)

我读过人们需要将它设置为METHOD:REQUEST,但我不确定在那里做什么.我还读到你需要设置与会者,但是如果你有警报,你似乎只能设置与会者?

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

Jor*_*ing 8

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

  1. 阅读RFC-2445,它定义了iCal格式.看起来像讨论ATTENDEE属性的4.8.4.1节和讨论RSVP参数的4.2.17将是特别感兴趣的.

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

在上面评论中链接到页面有三个提示.

第一个提示

我尝试添加此属性:
calendar.custom_property("METHOD", "REQUEST").[1]

从我认为应该是的文档append_custom_property.

打开邀请某人通过Google日历发送给我的邀请,我发现这一行:

METHOD:REQUEST
Run Code Online (Sandbox Code Playgroud)

所以这似乎是合法的.

第二个提示

我猜你需要添加一个ATTENDEE属性,RSVP=TRUE并将电子邮件设置为Outlook或Yahoo链接到其用户的同一封邮件.[2]

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

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

我没有阅读整个RFC,但我认为它会像这样崩溃:

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

看看append_custom_property我们看到它检查是否value是一个Icalendar::Value对象的源,如果没有,它会创建一个对象Icalendar::Values::Text.new(value).由于除了值之外我们还有参数,让我们在这里查看一下构造函数.我们看到它可以采取第二个参数,即params哈希.

现在,我没有测试过,但建议,我认为你可以建立像上面的代码类似于下面的一行:

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)
Run Code Online (Sandbox Code Playgroud)

编辑:在Icalendar 2.x中,您似乎也可以这样做:

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

所述CalAddress类是的一个子类的Uri,这只是通过运行给定值URI.parse,并且append_attendee似乎是一个快捷方式append_custom_property("ATTENDEE", ...).

我不确定是否所有这些参数都是实际需要的,但您可以通过阅读RFC了解每个参数.

第三个提示

要使其在所有邮件客户端中运行,我必须做的是将其作为多部分/替代消息发送,其中ical作为替代视图而不是作为附件.[3]

果然,在Gmail中做"显示原创"我看到我收到的邀请电子邮件是一部多部分电子邮件,其中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
...
Run Code Online (Sandbox Code Playgroud)

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

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

QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vR29vZ2xlIEluYy8vR29vZ2xlIENhbGVuZGFyIDcw
...
Run Code Online (Sandbox Code Playgroud)

第二部分,你已经有了,谢谢mail.attachments.在第一部分,你只需要创建一个新的Mail::Part与正确的content_type,并把它添加到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)
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的一切.再一次,我没有测试过这个,我不确定它会解决你的问题,但希望它会给你一些想法.

我认为最重要的是查看电子邮件的来源(如果您使用Gmail,"显示原始"位于"回复"按钮旁边的下拉菜单中),并邀请并查看它们是如何构建的,同样看看.ics附件,看看它们是否与你正在生成的相匹配.

祝好运!


根据Icalendar将params散列转换为iCal参数的方式判断,我认为你也可以使用符号键,如下所示:

attendee_params = { cutype:   "INDIVIDUAL",
                    role:     "REQ-PARTICIPANT",
                    partstat: "NEEDS-ACTION",
                    rsvp:     "TRUE",
                    cn:       "Firstname Lastname",
                    x_num_guests: "0" }
Run Code Online (Sandbox Code Playgroud)

  • 这里有很多信息:似乎我的主要问题是附件的mime_type需要是'text/calendar'.你添加的大多数其他东西对它没有任何影响.还通过执行`ical.append_custom_property('METHOD',REQUEST')`并删除`ical.publish`将'METHOD'添加为'REQUEST'.对于我的与会者,我只添加了''ROLE'=>'REQ-PARTICIPANT'并留下了所有其余的(并且有'CN').谢谢你的帮助!我会把它标记为正确. (2认同)