class Net::IMAP::FetchData
Net::IMAP::FetchData 表示 FETCH 响应的内容。Net::IMAP#fetch 和 Net::IMAP#uid_fetch 都返回一个 FetchData 对象数组。
获取属性¶ ↑
有关标准获取响应数据项的完整描述,请参阅 [IMAP4rev1 §7.4.2] 和 [IMAP4rev2 §7.5.2],以及 Net::IMAP 中的消息信封和主体结构 获取其他相关的 RFC。
静态获取数据项¶ ↑
大多数消息属性是静态的,对于给定的 (服务器、帐户、邮箱、UIDVALIDITY、UID) 元组,绝不能更改。
IMAP4rev1 和 IMAP4rev2 定义的静态获取数据项是
-
"UID"— 请参阅uid。 -
"BODY"— 请参阅body。 -
"BODY[#{section_spec}]","BODY[#{section_spec}]<#{offset}>"— 请参阅message,part,header,header_fields,header_fields_not,mime和text。 -
"BODYSTRUCTURE"— 请参阅bodystructure。 -
"ENVELOPE"— 请参阅envelope。 -
"INTERNALDATE"— 请参阅internaldate。 -
"RFC822.SIZE"— 请参阅rfc822_size。
IMAP4rev2 从 BINARY 扩展 [RFC3516] 添加了其他获取项
-
"BINARY[#{part}]","BINARY[#{part}]<#{offset}>"– 请参阅binary。 -
"BINARY.SIZE[#{part}]"– 请参阅binary_size。
IMAP4rev1 中的几个静态消息属性已过时,并已从 IMAP4rev2 中删除
-
"RFC822.HEADER"— 请参阅rfc822_header或替换为"BODY[HEADER]"和header。 -
"RFC822.TEXT"— 请参阅rfc822_text或替换为"BODY[TEXT]"和text。
Net::IMAP 支持以下扩展定义的静态属性
-
OBJECTID[RFC8474] -
X-GM-EXT-1[非标准的 Gmail 扩展]
- 注意
-
其他 IMAP 扩展中定义了其他静态字段,但
Net::IMAP尚无法解析它们。
动态消息属性¶ ↑
某些消息属性可以动态更改,例如使用 STORE 命令。
IMAP4rev1 和 IMAP4rev2 定义的唯一动态消息属性是
-
"FLAGS"— 请参阅flags。
Net::IMAP 支持以下扩展定义的动态属性
-
CONDSTORE[RFC7162]-
"MODSEQ"— 请参阅modseq。
-
-
X-GM-EXT-1[非标准的 Gmail 扩展]-
"X-GM-LABELS"— Gmail 标签。通过attr访问。
-
- 注意
-
其他 IMAP 扩展中定义了其他动态字段,但
Net::IMAP尚无法解析它们。
隐式设置 \Seen 和使用 PEEK¶ ↑
除非邮箱已作为只读打开,否则获取 BODY[#{section}] 或 BINARY[#{section}] 将隐式设置 \Seen 标志。为了避免这种情况,请改用 BODY.PEEK[#{section}] 或 BINARY.PEEK[#{section}] 进行获取。
请注意,数据将始终在没有 ".PEEK" 的情况下返回,即 BODY[#{specifier}] 或 BINARY[#{section}] 中。
公共实例方法
每个键指定一个消息属性,值是对应的数据项。标准数据项具有相应的访问器方法。每个属性类型的定义在其访问器上记录。
注意:
seqno不是消息属性。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 119
attr 的转换,所有键都转换为大写。
标头字段名称保留大小写,但不区分大小写,因此 header_fields 和 header_fields_not 会使用此方法。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 136 def attr_upcase; attr.transform_keys(&:upcase) end
返回特定 MIME 部分的二进制表示形式,该部分已根据其 Content-Transfer-Encoding 解码。
有关 part_nums 和 offset 的描述,请参阅 part。
这与从 attr 获取 "BINARY[#{part_nums.join(".")}]" 或 "BINARY[#{part_nums.join(".")}]<#{offset}>" 的值相同。
服务器必须支持 IMAP4rev2 或 BINARY 扩展 [RFC3516]。
另请参阅:binary_size, mime
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 430 def binary(*part_nums, offset: nil) attr[section_attr("BINARY", part_nums, offset: offset)] end
返回特定 MIME 部分的解码大小(在响应 BINARY 获取请求时预期的大小)。
有关 part_nums 的描述,请参阅 part。
这与从 attr 获取 "BINARY.SIZE[#{part_nums.join(".")}]" 的值相同。
服务器必须支持 IMAP4rev2 或 BINARY 扩展 [RFC3516]。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 451 def binary_size(*part_nums) attr[section_attr("BINARY.SIZE", part_nums)] end
返回 bodystructure 的另一种形式,不包含任何扩展数据。
这与从 attr 获取 "BODY" 的值相同。
- 注意
-
使用
message,part,header,header_fields,header_fields_not,text, 或mime来检索BODY[#{section_spec}]属性。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 148 def body; attr["BODY"] end
一个 BodyStructure 对象,用于描述消息(如果已获取)。
这与从 attr 获取 "BODYSTRUCTURE" 的值相同。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 310 def bodystructure; attr["BODYSTRUCTURE"] end
为此消息设置的标志数组。系统标志是由 String#capitalize 大写的符号。关键字标志是字符串,其大小写不会更改。
这与从 attr 获取 "FLAGS" 的值相同。
- 注意
-
FLAGS字段是动态的,并且对于唯一标识的消息可以更改。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 334 def flags; attr["FLAGS"] end
消息或封装的 [RFC5322] 标头 [MIME-IMT] MESSAGE/RFC822 或 MESSAGE/GLOBAL 消息。
可以使用“mail” gem 解析标头。
有关 part_nums 和 offset 的描述,请参阅 part。
没有 fields 或 except¶ ↑
这与从 attr 获取以下值之一相同
-
BODY[HEADER] -
BODY[HEADER]<#{offset}> -
BODY[#{part_nums.join "."}.HEADER]" -
BODY[#{part_nums.join "."}.HEADER]<#{offset}>"
使用 fields¶ ↑
当发送 fields 时,返回标头的一个子集,其中仅包含与列表中名称之一匹配的标头字段。
这与从 attr_upcase 获取以下值之一相同
-
正文[头部.字段 (#{names.join " "})] -
正文[头部.字段 (#{names.join " "})]<#{offset}> -
正文[#{part_nums.join "."}.头部.字段 (#{names.join " "})] -
正文[#{part_nums.join "."}.头部.字段 (#{names.join " "})]<#{offset}>
另请参阅:header_fields
使用 except¶ ↑
当发送 except 时,返回头部的子集,该子集仅包含与列表中名称不匹配的头部字段。
这与从 attr_upcase 获取以下值之一相同
-
正文[头部.字段.非 (#{names.join " "})] -
正文[头部.字段.非 (#{names.join " "})]<#{offset}> -
正文[#{part_nums.join "."}.头部.字段.非 (#{names.join " "})] -
正文[#{part_nums.join "."}.头部.字段.非 (#{names.join " "})]<#{offset}>
另请参阅:header_fields_not
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 234 def header(*part_nums, fields: nil, except: nil, offset: nil) fields && except and raise ArgumentError, "conflicting 'fields' and 'except' arguments" if fields text = "HEADER.FIELDS (%s)" % [fields.join(" ").upcase] attr_upcase[body_section_attr(part_nums, text, offset: offset)] elsif except text = "HEADER.FIELDS.NOT (%s)" % [except.join(" ").upcase] attr_upcase[body_section_attr(part_nums, text, offset: offset)] else attr[body_section_attr(part_nums, "HEADER", offset: offset)] end end
当使用 fields: names 调用时,从 header 获取的结果。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 252 def header_fields(first, *rest, part: [], offset: nil) header(*part, fields: [first, *rest], offset: offset) end
当使用 except: names 调用时,从 header 获取的结果。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 260 def header_fields_not(first, *rest, part: [], offset: nil) header(*part, except: [first, *rest], offset: offset) end
服务器上消息的内部日期和时间。这不是 [RFC5322] 头部中的日期和时间,而是反映消息接收时间的日期和时间。
这类似于从 attr 获取 "INTERNALDATE" 的值。
- 注意
-
attr["INTERNALDATE"]返回字符串,而此方法返回 Time 对象。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 349 def internaldate attr["INTERNALDATE"]&.then { IMAP.decode_time _1 } end
如果已获取,则为消息部分的 [MIME-IMB] 头部。
有关 part_nums 和 offset 的描述,请参阅 part。
这与从 attr 获取 "BODY[#{part_nums}.MIME]" 或 "BODY[#{part_nums}.MIME]<#{offset}>" 的值相同。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 278 def mime(part, *subparts, offset: nil) attr[body_section_attr([part, *subparts], "MIME", offset: offset)] end
特定 MIME 部分的字符串表示形式。
part_nums 形成 MIME 部分编号的路径,从 1 开始计数,这可以指定任意嵌套的部分,类似于 Array#dig。不使用 MIME 的消息,或不是多部分且不包含封装消息的 MIME 消息,仅具有部分 1。
如果给定了基于零的 offset,则返回的字符串是整个内容的子字符串,从该起始八位字节开始。这意味着 BODY[]<0> MAY 被截断,但 BODY[] 永远不会被截断。
这与从 attr 获取 "BODY[#{part_nums.join(".")}]" 或 "BODY[#{part_nums.join(".")}]<#{offset}>" 的值相同。
另请参阅:message,header,text,和 mime。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 186 def part(index, *subparts, offset: nil) attr[body_section_attr([index, *subparts], offset: offset)] end
表示消息的 [RFC5322] 大小的数字。
这与从 attr 获取 "RFC822.SIZE" 的值相同。
- 注意
-
IMAP 最初是为较旧的 RFC822 标准开发的,因此 IMAP 中的几个提取项在其名称中包含“RFC822”。 除了
RFC822.SIZE之外,还有更现代的替代品; 例如,RFC822.HEADER的现代版本是BODY.PEEK[HEADER]。 在所有情况下,“RFC822”都应解释为对更新的 RFC5322 标准的引用。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 381 def rfc822_size; attr["RFC822.SIZE"] end
消息序列号。
- 注意
-
这永远不是唯一标识符 (UID),即使对于
Net::IMAP#uid_fetch结果也是如此。 如果返回了 UID,则可以从uid中获取它。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 108
如果已提取,则为消息或消息部分的文本正文,省略了 [RFC5322] 头部。
有关 part_nums 和 offset 的描述,请参阅 part。
这与从 attr 获取以下值之一相同
-
"正文[文本]", -
"正文[文本]<#{offset}>", -
"正文[#{section}.文本]",或 -
"正文[#{section}.文本]<#{offset}>".
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 299 def text(*part, offset: nil) attr[body_section_attr(part, "TEXT", offset: offset)] end
表示消息唯一标识符的数字。
这与从 attr 获取 "UID" 的值相同。
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 410 def uid; attr["UID"] end
私有实例方法
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 505 def body_section_attr(...) section_attr("BODY", ...) end
# File net-imap-0.5.4/lib/net/imap/fetch_data.rb, line 507 def section_attr(attr, part = [], text = nil, offset: nil) spec = Array(part).flatten.map { Integer(_1) } spec << text if text spec = spec.join(".") if offset then "%s[%s]<%d>" % [attr, spec, Integer(offset)] else "%s[%s]" % [attr, spec] end end