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