- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我在我的 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,但我不确定在哪里设置。我也看到需要设置出席者,但是好像只有闹钟才能设置出席者?
只是想让它看起来像一个普通的邀请。
最佳答案
要解决您的问题,您需要做两件事:
Read RFC-2445 ,它定义了 iCal 格式。讨论 ATTENDEE 属性的 4.8.4.1 节和讨论 RSVP 参数的 4.2.17 节看起来特别有趣。
查看您收到的在各种电子邮件客户端中正确显示的电子邮件和 .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 withRSVP=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/
以下是一个非常简单的ruby服务器。 require 'socket' local_socket = Socket.new(:INET, :STREAM) local_addr = Socket.
我正在使用 OS X(使用 bash),并且是 unix 的新手。我想知道是否可以修改一些文件以便运行 ruby 程序,我不需要“ruby file.rb”,而是可以运行“ruby.rb”。 有理
我在用 Ruby 替换字符串时遇到一些问题。 我的原文:人之所为不如兽之所为。 我想替换为:==What== human does is not like ==what== animal does.
我想在一个循环中从 Ruby 脚本做这样的事情: 写一个文件a.rb(每次迭代都会改变) 执行系统(ruby 'a.rb') a.rb 将带有结果的字符串写入文件“results” a.rb 完成并且
我的问题是尝试创建一个本地服务器,以便我可以理解由我的新团队开发的应用程序。我的问题是我使用的是 Ruby 2.3.3,而 Gemfile 需要 2.3.1。我无法编辑 Gemfile,因为我被告知很
我有一个使用 GLI 框架用 Ruby 编写的命令行实用程序。我想在我的主目录中配置我的命令行实用程序,使用 Ruby 本身作为 DSL 来处理它(类似于 Gemfile 或 Rakefile)。 我
我的 Rails 应用 Controller 中有这段代码: def delete object = model.datamapper_class.first(:sourced_id =>
我正在寻找的解析器应该: 对 Ruby 解析友好, 规则设计优雅, 产生用户友好的解析错误, 用户文档的数量应该比计算器示例多, UPD:允许在编写语法时省略可选的空格。 快速解析不是一个重要的特性。
我刚开始使用 Ruby,听说有一种“Ruby 方式”编码。除了 Ruby on Rails 之外,还有哪些项目适合学习并被认可且设计良好? 最佳答案 Prawn被明确地创建为不仅是一个该死的好 PDF
我知道之前有人问过类似的问题,但是我该如何构建一个无需在前面输入“ruby”就可以在终端中运行的 Ruby 文件呢? 这里的最终目标是创建一个命令行工具包类型的东西。现在,为了执行我希望用户能够执行的
例如哈希a是{:name=>'mike',:age=>27,:gender=>'male'}哈希 b 是 {:name=>'mike'} 我想知道是否有更好的方法来判断 b 哈希是否在 a 哈希内,而
我是一名决定学习 Ruby 和 Ruby on Rails 的 ASP.NET MVC 开发人员。我已经有所了解并在 RoR 上创建了一个网站。在 ASP.NET MVC 上开发,我一直使用三层架构:
最近我看到 Gary Bernhardt 展示了他用来在 vim 中执行 Ruby 代码的 vim 快捷方式。捷径是 :map ,t :w\|:!ruby %. 似乎这个方法总是执行系统 Rub
在为 this question about Blue Ruby 选择的答案中,查克说: All of the current Ruby implementations are compiled to
我有一个 Ruby 数组 > list = Request.find_all_by_artist("Metallica").map(&:song) => ["Nothing else Matters"
我在四舍五入时遇到问题。我有一个 float ,我想将其四舍五入到小数点后的百分之一。但是,我只能使用 .round ,它基本上将它变成一个 int,意思是 2.34.round # => 2. 有没
我使用 ruby on rails 编写了一个小型 Web 应用程序,它的主要目的是上传、存储和显示来自 xml(文件最多几 MB)文件的结果。运行大约 2 个月后,我注意到 mongrel 进程
我们如何用 Ruby 转换像这样的字符串: 𝑙𝑎𝑡𝑜𝑟𝑟𝑒 收件人: Latorre 最佳答案 s = "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" => "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" s.u
通过 ruby monk 时,他们偶尔会从左侧字段中抛出一段语法不熟悉的代码: def compute(xyz) return nil unless xyz xyz.map {|a,
不确定我做错了什么,但我似乎弄错了。 问题是,给你一串空格分隔的数字,你必须返回最大和最小的数字。 注意:所有数字都是有效的 Int32,不需要验证它们。输入字符串中始终至少有一个数字。输出字符串必须
我是一名优秀的程序员,十分优秀!