class Net::IMAP::FetchStruct
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 Message envelope and body structure at Net::IMAP 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"— Seeuid. -
"BODY"— Seebody. -
"BODY[#{section_spec}]","BODY[#{section_spec}]<#{offset}>"— Seemessage,part,header,header_fields,header_fields_not,mime, andtext. -
"BODYSTRUCTURE"— Seebodystructure. -
"ENVELOPE"— Seeenvelope. -
"INTERNALDATE"— Seeinternaldate. -
"RFC822.SIZE"— Seerfc822_size.
IMAP4rev2 adds the additional fetch items from the BINARY extension [RFC3516]:
-
"BINARY[#{part}]","BINARY[#{part}]<#{offset}>"– Seebinary. -
"BINARY.SIZE[#{part}]"– Seebinary_size.
Several static message attributes in IMAP4rev1 are obsolete and been removed from IMAP4rev2:
-
"RFC822.HEADER"— Seerfc822_headeror replace with"BODY[HEADER]"andheader. -
"RFC822.TEXT"— Seerfc822_textor replace with"BODY[TEXT]"andtext.
Net::IMAP supports static attributes defined by the following extensions:
-
OBJECTID[RFC8474] -
X-GM-EXT-1[non-standard Gmail extension]
- NOTE:
-
Additional static fields are defined in other IMAP extensions, but
Net::IMAPcan’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"— Seeflags.
Net::IMAP supports dynamic attributes defined by the following extensions:
-
CONDSTORE[RFC7162]:-
"MODSEQ"— Seemodseq.
-
-
X-GM-EXT-1[non-standard Gmail extension]-
"X-GM-LABELS"— Gmail labels. Access viaattr.
-
- NOTE:
-
Additional dynamic fields are defined in other IMAP extensions, but
Net::IMAPcan’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}].
Public Instance Methods
Source
# File lib/net/imap/fetch_data.rb, line 107
Each key specifies a message attribute, and the value is the corresponding data item. Standard data items have corresponding accessor methods. The definitions of each attribute type is documented on its accessor.
Source
# File lib/net/imap/fetch_data.rb, line 121 def attr_upcase; attr.transform_keys(&:upcase) end
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.
Source
# File lib/net/imap/fetch_data.rb, line 428 def binary(*part_nums, offset: nil) attr[section_attr("BINARY", part_nums, offset: offset)] end
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
Source
# File lib/net/imap/fetch_data.rb, line 449 def binary_size(*part_nums) attr[section_attr("BINARY.SIZE", part_nums)] end
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].
Source
# File lib/net/imap/fetch_data.rb, line 133 def body; attr["BODY"] end
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, ormimeto retrieveBODY[#{section_spec}]attributes.
Source
# File lib/net/imap/fetch_data.rb, line 295 def bodystructure; attr["BODYSTRUCTURE"] end
A BodyStructure object that describes the message, if it was fetched.
This is the same as getting the value for "BODYSTRUCTURE" from attr.
Source
# File lib/net/imap/fetch_data.rb, line 482 def emailid; attr["EMAILID"] end
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].
Source
# File lib/net/imap/fetch_data.rb, line 307 def envelope; attr["ENVELOPE"] end
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.
Source
# File lib/net/imap/fetch_data.rb, line 320 def flags; attr["FLAGS"] end
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.
Source
# 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
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
Source
# 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
The result from header when called with fields: names.
Source
# 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
The result from header when called with except: names.
Source
# File lib/net/imap/fetch_data.rb, line 335 def internaldate attr["INTERNALDATE"]&.then { IMAP.decode_time _1 } end
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.
Source
# File lib/net/imap/fetch_data.rb, line 149 def message(offset: nil) attr[body_section_attr(offset: offset)] end
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.
Source
# 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
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.
Source
# File lib/net/imap/fetch_data.rb, line 465 def modseq; attr["MODSEQ"] end
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.
Source
# File lib/net/imap/fetch_data.rb, line 171 def part(index, *subparts, offset: nil) attr[body_section_attr([index, *subparts], offset: offset)] end
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.
Source
Source
Source
# File lib/net/imap/fetch_data.rb, line 368 def rfc822_size; attr["RFC822.SIZE"] end
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.
Source
Source
# File lib/net/imap/fetch_data.rb, line 375 def size; rfc822_size end
Alias for: rfc822_size
Source
# File lib/net/imap/fetch_data.rb, line 284 def text(*part, offset: nil) attr[body_section_attr(part, "TEXT", offset: offset)] end
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}>".
Source
# File lib/net/imap/fetch_data.rb, line 499 def threadid; attr["THREADID"] end
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].
Source
# File lib/net/imap/fetch_data.rb, line 408 def uid; attr["UID"] end
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 theUIDFETCHresponse, not the value fromattr.