您需要做两件事来解决您的问题:
Read RFC-2445,定义 iCal 格式。看起来,讨论 ATTENDEE 属性的第 4.8.4.1 节和讨论 RSVP 参数的第 4.2.17 节将特别有趣。
查看您收到的在各种电子邮件客户端中正确显示的电子邮件和 .ics 文件。
我上面评论中的page I linked to 有三个提示。
第一个提示
我尝试添加此属性:
calendar.custom_property("METHOD", "REQUEST").[1]
从文档中我认为应该是append_custom_property。
打开某人从 Google 日历发送给我的邀请,我发现了这一行:
METHOD:REQUEST
所以这似乎是合法的。
第二个提示
我猜你需要添加一个带有RSVP=TRUE 的ATTENDEE 属性,并将电子邮件设置为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
我没有阅读整个 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 了解每个参数的含义。
第三个提示
要让它在所有邮件客户端中工作,我必须做的是将它作为多部分/替代消息发送,其中 ical 作为替代视图而不是附件。[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" }