Class: Net::IMAP::FetchStruct
- Inherits:
-
Struct
- Object
- Struct
- Net::IMAP::FetchStruct
- Defined in:
- lib/net/imap/fetch_data.rb
Overview
Net::IMAP::FetchStruct is the superclass for FetchData and UIDFetchData. Net::IMAP#fetch, Net::IMAP#uid_fetch, Net::IMAP#store, and Net::IMAP#uid_store all return arrays of FetchStruct objects.
Fetch attributes
See [IMAP4rev1 §7.4.2] and [IMAP4rev2 §7.5.2] for a full description of the standard fetch response data items, and Net::IMAP@Message+envelope+and+body+structure for other relevant RFCs.
Static fetch data items
Most message attributes are static, and must never change for a given (server, account, mailbox, UIDVALIDITY, UID) tuple.
The static fetch data items defined by both IMAP4rev1 and IMAP4rev2 are:
-
"UID"— See #uid. -
"BODY"— See #body. -
"BODY[#{section_spec}]","BODY[#{section_spec}]<#{offset}>"— See #message, #part, #header, #header_fields, #header_fields_not, #mime, and #text. -
"BODYSTRUCTURE"— See #bodystructure. -
"ENVELOPE"— See #envelope. -
"INTERNALDATE"— See #internaldate. -
"RFC822.SIZE"— See #rfc822_size.
IMAP4rev2 adds the additional fetch items from the BINARY extension [RFC3516]:
-
"BINARY[#{part}]","BINARY[#{part}]<#{offset}>"– See #binary. -
"BINARY.SIZE[#{part}]"– See #binary_size.
Several static message attributes in IMAP4rev1 are obsolete and been removed from IMAP4rev2:
-
"RFC822"— See #rfc822 or replace with"BODY[]"and #message. -
"RFC822.HEADER"— See #rfc822_header or replace with"BODY[HEADER]"and #header. -
"RFC822.TEXT"— See #rfc822_text or replace with"BODY[TEXT]"and #text.
Net::IMAP supports static attributes defined by the following extensions:
-
OBJECTID[RFC8474]-
"EMAILID"— See #emailid. -
"THREADID"— See #threadid.
-
-
X-GM-EXT-1[non-standard Gmail extension]-
"X-GM-MSGID"— unique message ID. Access via #attr. -
"X-GM-THRID"— Thread ID. Access via #attr.
-
- NOTE:
-
Additional static fields are defined in other IMAP extensions, but Net::IMAP can’t parse them yet.
Dynamic message attributes
Some message attributes can be dynamically changed, for example using the STORE command.
The only dynamic message attribute defined by IMAP4rev1 and IMAP4rev2 is:
-
"FLAGS"— See #flags.
Net::IMAP supports dynamic attributes defined by the following extensions:
-
CONDSTORE[RFC7162]:-
"MODSEQ"— See #modseq.
-
-
X-GM-EXT-1[non-standard Gmail extension]-
"X-GM-LABELS"— Gmail labels. Access via #attr.
-
- NOTE:
-
Additional dynamic fields are defined in other IMAP extensions, but Net::IMAP can’t parse them yet.
Implicitly setting \Seen and using PEEK
Unless the mailbox has been opened as read-only, fetching BODY[#{section}] or BINARY[#{section}] will implicitly set the \Seen flag. To avoid this, fetch using BODY.PEEK[#{section}] or BINARY.PEEK[#{section}] instead.
- NOTE:
-
The data will always be returned without the
".PEEK"suffix, asBODY[#{specifier}]orBINARY[#{section}].
Instance Method Summary collapse
-
#attr_upcase ⇒ Object
:call-seq: attr_upcase -> hash.
-
#binary(*part_nums, offset: nil) ⇒ Object
:call-seq: binary(*part_nums, offset: nil) -> string or nil.
-
#binary_size(*part_nums) ⇒ Object
:call-seq: binary_size(*part_nums) -> integer or nil.
-
#body ⇒ Object
:call-seq: body -> body structure or nil.
-
#bodystructure ⇒ Object
(also: #body_structure)
:call-seq: bodystructure -> BodyStructure struct or nil.
-
#emailid ⇒ Object
:call-seq: emailid -> string or nil.
-
#envelope ⇒ Object
:call-seq: envelope -> Envelope or nil.
-
#flags ⇒ Object
:call-seq: flags -> array of Symbols and Strings, or nil.
-
#header(*part_nums, fields: nil, except: nil, offset: nil) ⇒ Object
:call-seq: header(*part_nums, offset: nil) -> string or nil header(*part_nums, fields: names, offset: nil) -> string or nil header(*part_nums, except: names, offset: nil) -> string or nil.
-
#header_fields(first, *rest, part: [], offset: nil) ⇒ Object
:call-seq: header_fields(*names, part: [], offset: nil) -> string or nil.
-
#header_fields_not(first, *rest, part: [], offset: nil) ⇒ Object
:call-seq: header_fields_not(*names, part: [], offset: nil) -> string or nil.
-
#internaldate ⇒ Object
(also: #internal_date)
:call-seq: internaldate -> Time or nil.
-
#message(offset: nil) ⇒ Object
:call-seq: message(offset: bytes) -> string or nil.
-
#mime(part, *subparts, offset: nil) ⇒ Object
:call-seq: mime(*part_nums) -> string or nil mime(*part_nums, offset: bytes) -> string or nil.
-
#modseq ⇒ Object
:call-seq: modseq -> Integer or nil.
-
#part(index, *subparts, offset: nil) ⇒ Object
:call-seq: part(*part_nums, offset: bytes) -> string or nil.
-
#rfc822 ⇒ Object
:call-seq: rfc822 -> String or nil.
-
#rfc822_header ⇒ Object
:call-seq: rfc822_header -> String or nil.
-
#rfc822_size ⇒ Object
:call-seq: rfc822_size -> Integer or nil.
-
#rfc822_text ⇒ Object
:call-seq: rfc822_text -> String or nil.
-
#size ⇒ Object
Alias for: rfc822_size.
-
#text(*part, offset: nil) ⇒ Object
:call-seq: text(*part_nums) -> string or nil text(*part_nums, offset: bytes) -> string or nil.
-
#threadid ⇒ Object
:call-seq: threadid -> string or nil.
-
#uid ⇒ Object
:call-seq: uid -> Integer or nil.
Instance Method Details
#attr_upcase ⇒ Object
:call-seq: attr_upcase -> hash
A transformation of #attr, with all the keys converted to upper case.
Header field names are case-preserved but not case-sensitive, so this is used by #header_fields and #header_fields_not.
121 |
# File 'lib/net/imap/fetch_data.rb', line 121 def attr_upcase; attr.transform_keys(&:upcase) end |
#binary(*part_nums, offset: nil) ⇒ Object
:call-seq:
binary(*part_nums, offset: nil) -> string or nil
Returns the binary representation of a particular MIME part, which has already been decoded according to its Content-Transfer-Encoding.
See #part for a description of part_nums and offset.
This is the same as getting the value of "BINARY[#{part_nums.join(".")}]" or "BINARY[#{part_nums.join(".")}]<#{offset}>" from #attr.
The server must support either IMAP4rev2 or the BINARY extension [RFC3516].
See also: #binary_size, #mime
428 429 430 |
# File 'lib/net/imap/fetch_data.rb', line 428 def binary(*part_nums, offset: nil) attr[section_attr("BINARY", part_nums, offset: offset)] end |
#binary_size(*part_nums) ⇒ Object
:call-seq:
binary_size(*part_nums) -> integer or nil
Returns the decoded size of a particular MIME part (the size to expect in response to a BINARY fetch request).
See #part for a description of part_nums.
This is the same as getting the value of "BINARY.SIZE[#{part_nums.join(".")}]" from #attr.
The server must support either IMAP4rev2 or the BINARY extension [RFC3516].
See also: #binary, #mime
449 450 451 |
# File 'lib/net/imap/fetch_data.rb', line 449 def binary_size(*part_nums) attr[section_attr("BINARY.SIZE", part_nums)] end |
#body ⇒ Object
:call-seq:
body -> body structure or nil
Returns an alternate form of #bodystructure, without any extension data.
This is the same as getting the value for "BODY" from #attr.
- NOTE:
-
Use #message, #part, #header, #header_fields, #header_fields_not, #text, or #mime to retrieve
BODY[#{section_spec}]attributes.
133 |
# File 'lib/net/imap/fetch_data.rb', line 133 def body; attr["BODY"] end |
#bodystructure ⇒ Object Also known as: body_structure
:call-seq:
bodystructure -> BodyStructure struct or nil
A BodyStructure object that describes the message, if it was fetched.
This is the same as getting the value for "BODYSTRUCTURE" from #attr.
295 |
# File 'lib/net/imap/fetch_data.rb', line 295 def bodystructure; attr["BODYSTRUCTURE"] end |
#emailid ⇒ Object
:call-seq: emailid -> string or nil
An ObjectID that uniquely identifies the immutable content of a single message.
The server must return the same EMAILID for both the source and destination messages after a COPY or MOVE command. However, it is possible for different messages with the same EMAILID to have different mutable attributes, such as flags.
This is the same as getting the value for "EMAILID" from #attr.
The server must support the OBJECTID extension [RFC8474].
482 |
# File 'lib/net/imap/fetch_data.rb', line 482 def emailid; attr["EMAILID"] end |
#envelope ⇒ Object
:call-seq: envelope -> Envelope or nil
An Envelope object that describes the envelope structure of a message. See the documentation for Envelope for a description of the envelope structure attributes.
This is the same as getting the value for "ENVELOPE" from #attr.
307 |
# File 'lib/net/imap/fetch_data.rb', line 307 def envelope; attr["ENVELOPE"] end |
#flags ⇒ Object
:call-seq: flags -> array of Symbols and Strings, or nil
A array of flags that are set for this message. System flags are symbols that have been capitalized by String#capitalize. Keyword flags are strings and their case is not changed.
This is the same as getting the value for "FLAGS" from #attr.
- NOTE:
-
The
FLAGSfield is dynamic, and can change for a uniquely identified message.
320 |
# File 'lib/net/imap/fetch_data.rb', line 320 def flags; attr["FLAGS"] end |
#header(*part_nums, fields: nil, except: nil, offset: nil) ⇒ Object
:call-seq:
header(*part_nums, offset: nil) -> string or nil
header(*part_nums, fields: names, offset: nil) -> string or nil
header(*part_nums, except: names, offset: nil) -> string or nil
The [RFC5322] header of a message or of an encapsulated [MIME-IMT] MESSAGE/RFC822 or MESSAGE/GLOBAL message.
Headers can be parsed using the “mail” gem.
See #part for a description of part_nums and offset.
Without fields or except
This is the same as getting the value from #attr for one of:
-
BODY[HEADER] -
BODY[HEADER]<#{offset}> -
BODY[#{part_nums.join "."}.HEADER]" -
BODY[#{part_nums.join "."}.HEADER]<#{offset}>"
With fields
When fields is sent, returns a subset of the header which contains only the header fields that match one of the names in the list.
This is the same as getting the value from #attr_upcase for one of:
-
BODY[HEADER.FIELDS (#{names.join " "})] -
BODY[HEADER.FIELDS (#{names.join " "})]<#{offset}> -
BODY[#{part_nums.join "."}.HEADER.FIELDS (#{names.join " "})] -
BODY[#{part_nums.join "."}.HEADER.FIELDS (#{names.join " "})]<#{offset}>
See also: #header_fields
With except
When except is sent, returns a subset of the header which contains only the header fields that do not match one of the names in the list.
This is the same as getting the value from #attr_upcase for one of:
-
BODY[HEADER.FIELDS.NOT (#{names.join " "})] -
BODY[HEADER.FIELDS.NOT (#{names.join " "})]<#{offset}> -
BODY[#{part_nums.join "."}.HEADER.FIELDS.NOT (#{names.join " "})] -
BODY[#{part_nums.join "."}.HEADER.FIELDS.NOT (#{names.join " "})]<#{offset}>
See also: #header_fields_not
219 220 221 222 223 224 225 226 227 228 229 230 231 |
# File 'lib/net/imap/fetch_data.rb', line 219 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 |
#header_fields(first, *rest, part: [], offset: nil) ⇒ Object
:call-seq:
header_fields(*names, part: [], offset: nil) -> string or nil
The result from #header when called with fields: names.
237 238 239 |
# File 'lib/net/imap/fetch_data.rb', line 237 def header_fields(first, *rest, part: [], offset: nil) header(*part, fields: [first, *rest], offset: offset) end |
#header_fields_not(first, *rest, part: [], offset: nil) ⇒ Object
:call-seq:
header_fields_not(*names, part: [], offset: nil) -> string or nil
The result from #header when called with except: names.
245 246 247 |
# File 'lib/net/imap/fetch_data.rb', line 245 def header_fields_not(first, *rest, part: [], offset: nil) header(*part, except: [first, *rest], offset: offset) end |
#internaldate ⇒ Object Also known as: internal_date
:call-seq: internaldate -> Time or nil
The internal date and time of the message on the server. This is not the date and time in the [RFC5322] header, but rather a date and time which reflects when the message was received.
This is similar to getting the value for "INTERNALDATE" from #attr.
- NOTE:
-
attr["INTERNALDATE"]returns a string, and this method returns a Time object.
335 336 337 |
# File 'lib/net/imap/fetch_data.rb', line 335 def internaldate attr["INTERNALDATE"]&.then { IMAP.decode_time _1 } end |
#message(offset: nil) ⇒ Object
:call-seq:
(offset: bytes) -> string or nil
The RFC5322 expression of the entire message, as a string.
See #part for a description of offset.
RFC5322 messages can be parsed using the “mail” gem.
This is the same as getting the value for "BODY[]" or "BODY[]<#{offset}>" from #attr.
See also: #header, #text, and #mime.
149 |
# File 'lib/net/imap/fetch_data.rb', line 149 def (offset: nil) attr[body_section_attr(offset: offset)] end |
#mime(part, *subparts, offset: nil) ⇒ Object
:call-seq:
mime(*part_nums) -> string or nil
mime(*part_nums, offset: bytes) -> string or nil
The [MIME-IMB] header for a message part, if it was fetched.
See #part for a description of part_nums and offset.
This is the same as getting the value for "BODY[#{part_nums}.MIME]" or "BODY[#{part_nums}.MIME]<#{offset}>" from #attr.
See also: #message, #header, and #text.
263 264 265 |
# File 'lib/net/imap/fetch_data.rb', line 263 def mime(part, *subparts, offset: nil) attr[body_section_attr([part, *subparts], "MIME", offset: offset)] end |
#modseq ⇒ Object
:call-seq: modseq -> Integer or nil
The modification sequence number associated with this IMAP message.
This is the same as getting the value for "MODSEQ" from #attr.
The server must support the CONDSTORE extension [RFC7162].
- NOTE:
-
The
MODSEQfield is dynamic, and can change for a uniquely identified message.
465 |
# File 'lib/net/imap/fetch_data.rb', line 465 def modseq; attr["MODSEQ"] end |
#part(index, *subparts, offset: nil) ⇒ Object
:call-seq:
part(*part_nums, offset: bytes) -> string or nil
The string representation of a particular MIME part.
part_nums forms a path of MIME part numbers, counting up from 1, which may specify an arbitrarily nested part, similarly to Array#dig. Messages that don’t use MIME, or MIME messages that are not multipart and don’t hold an encapsulated message, only have part 1.
If a zero-based offset is given, the returned string is a substring of the entire contents, starting at that origin octet. This means that BODY[]<0> MAY be truncated, but BODY[] is never truncated.
This is the same as getting the value of "BODY[#{part_nums.join(".")}]" or "BODY[#{part_nums.join(".")}]<#{offset}>" from #attr.
See also: #message, #header, #text, and #mime.
171 172 173 |
# File 'lib/net/imap/fetch_data.rb', line 171 def part(index, *subparts, offset: nil) attr[body_section_attr([index, *subparts], offset: offset)] end |
#rfc822 ⇒ Object
:call-seq: rfc822 -> String or nil
Semantically equivalent to #message with no arguments.
This is the same as getting the value for "RFC822" from #attr.
- NOTE:
-
IMAP4rev2deprecatesRFC822.
349 |
# File 'lib/net/imap/fetch_data.rb', line 349 def rfc822; attr["RFC822"] end |
#rfc822_header ⇒ Object
:call-seq: rfc822_header -> String or nil
Semantically equivalent to #header, with no arguments.
This is the same as getting the value for "RFC822.HEADER" from #attr.
- NOTE:
-
IMAP4rev2deprecatesRFC822.HEADER.
386 |
# File 'lib/net/imap/fetch_data.rb', line 386 def rfc822_header; attr["RFC822.HEADER"] end |
#rfc822_size ⇒ Object
:call-seq: rfc822_size -> Integer or nil
A number expressing the [RFC5322] size of the message.
This is the same as getting the value for "RFC822.SIZE" from #attr.
- NOTE:
-
IMAP was originally developed for the older RFC822 standard, and as a consequence several fetch items in IMAP incorporate “RFC822” in their name. With the exception of
RFC822.SIZE, there are more modern replacements; for example, the modern version ofRFC822.HEADERisBODY.PEEK[HEADER]. In all cases, “RFC822” should be interpreted as a reference to the updated RFC5322 standard.
368 |
# File 'lib/net/imap/fetch_data.rb', line 368 def rfc822_size; attr["RFC822.SIZE"] end |
#rfc822_text ⇒ Object
:call-seq: rfc822_text -> String or nil
Semantically equivalent to #text, with no arguments.
This is the same as getting the value for "RFC822.TEXT" from #attr.
- NOTE:
-
IMAP4rev2deprecatesRFC822.TEXT.
397 |
# File 'lib/net/imap/fetch_data.rb', line 397 def rfc822_text; attr["RFC822.TEXT"] end |
#size ⇒ Object
Alias for: rfc822_size
375 |
# File 'lib/net/imap/fetch_data.rb', line 375 def size; rfc822_size end |
#text(*part, offset: nil) ⇒ Object
:call-seq:
text(*part_nums) -> string or nil
text(*part_nums, offset: bytes) -> string or nil
The text body of a message or a message part, if it was fetched, omitting the [RFC5322] header.
See #part for a description of part_nums and offset.
This is the same as getting the value from #attr for one of:
-
"BODY[TEXT]", -
"BODY[TEXT]<#{offset}>", -
"BODY[#{section}.TEXT]", or -
"BODY[#{section}.TEXT]<#{offset}>".
See also: #message, #header, and #mime.
284 285 286 |
# File 'lib/net/imap/fetch_data.rb', line 284 def text(*part, offset: nil) attr[body_section_attr(part, "TEXT", offset: offset)] end |
#threadid ⇒ Object
:call-seq: threadid -> string or nil
An ObjectID that uniquely identifies a set of messages that the server believes should be grouped together.
It is generally based on some combination of References, In-Reply-To, and Subject, but the exact implementation is left up to the server implementation. The server should return the same thread identifier for related messages, even if they are in different mailboxes.
This is the same as getting the value for "THREADID" from #attr.
The server must support the OBJECTID extension [RFC8474].
499 |
# File 'lib/net/imap/fetch_data.rb', line 499 def threadid; attr["THREADID"] end |
#uid ⇒ Object
:call-seq: uid -> Integer or nil
A number expressing the unique identifier of the message.
This is the same as getting the value for "UID" from #attr.
- NOTE:
-
For UIDFetchData, this returns the uniqueid at the beginning of the
UIDFETCHresponse, not the value from #attr.
408 |
# File 'lib/net/imap/fetch_data.rb', line 408 def uid; attr["UID"] end |