class Net::IMAP::FetchData
Net::IMAP::FetchData
represents the contents of a FETCH response. Net::IMAP#fetch
and Net::IMAP#uid_fetch
both return an array of FetchData
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_header
or replace with"BODY[HEADER]"
andheader
. -
"RFC822.TEXT"
— Seerfc822_text
or 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::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"
— 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::IMAP
can’t parse them yet.
Implicitly setting \Seen
and using PEEK
¶ ↑
Unless the mailbox is 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 that the data will always be returned without ".PEEK"
, in BODY[#{specifier}]
or BINARY[#{section}]
.
Public Instance Methods
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.
Note:
seqno
is not a message attribute.
# File lib/net/imap/fetch_data.rb, line 119
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
.
# File lib/net/imap/fetch_data.rb, line 136 def attr_upcase; attr.transform_keys(&:upcase) 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
# File lib/net/imap/fetch_data.rb, line 430 def binary(*part_nums, offset: nil) attr[section_attr("BINARY", part_nums, offset: offset)] 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].
# File lib/net/imap/fetch_data.rb, line 451 def binary_size(*part_nums) attr[section_attr("BINARY.SIZE", part_nums)] 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
, ormime
to retrieveBODY[#{section_spec}]
attributes.
# File lib/net/imap/fetch_data.rb, line 148 def body; attr["BODY"] end
A BodyStructure
object that describes the message, if it was fetched.
This is the same as getting the value for "BODYSTRUCTURE"
from attr
.
# File lib/net/imap/fetch_data.rb, line 310 def bodystructure; attr["BODYSTRUCTURE"] 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].
# File lib/net/imap/fetch_data.rb, line 484 def emailid; attr["EMAILID"] 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
.
# File lib/net/imap/fetch_data.rb, line 321 def envelope; attr["ENVELOPE"] 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
FLAGS
field is dynamic, and can change for a uniquely identified message.
# File lib/net/imap/fetch_data.rb, line 334 def flags; attr["FLAGS"] 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
# File 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
The result from header
when called with fields: names
.
# File lib/net/imap/fetch_data.rb, line 252 def header_fields(first, *rest, part: [], offset: nil) header(*part, fields: [first, *rest], offset: offset) end
The result from header
when called with except: names
.
# File 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
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.
# File lib/net/imap/fetch_data.rb, line 349 def internaldate attr["INTERNALDATE"]&.then { IMAP.decode_time _1 } 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
.
See also: header
, text
, and mime
.
# File lib/net/imap/fetch_data.rb, line 164 def message(offset: nil) attr[body_section_attr(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
.
See also: message
, header
, and text
.
# File lib/net/imap/fetch_data.rb, line 278 def mime(part, *subparts, offset: nil) attr[body_section_attr([part, *subparts], "MIME", offset: offset)] 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
MODSEQ
field is dynamic, and can change for a uniquely identified message.
# File lib/net/imap/fetch_data.rb, line 467 def modseq; attr["MODSEQ"] 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
.
See also: message
, header
, text
, and mime
.
# File lib/net/imap/fetch_data.rb, line 186 def part(index, *subparts, offset: nil) attr[body_section_attr([index, *subparts], offset: offset)] end
The message sequence number.
- Note
-
This is never the unique identifier (UID), not even for the
Net::IMAP#uid_fetch
result. The UID is available fromuid
, if it was returned.
# File lib/net/imap/fetch_data.rb, line 108
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
.
# File lib/net/imap/fetch_data.rb, line 299 def text(*part, offset: nil) attr[body_section_attr(part, "TEXT", offset: offset)] 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].
# File lib/net/imap/fetch_data.rb, line 501 def threadid; attr["THREADID"] end
A number expressing the unique identifier of the message.
This is the same as getting the value for "UID"
from attr
.
# File lib/net/imap/fetch_data.rb, line 410 def uid; attr["UID"] end