[]'s indicate lists. List items can be marked with a '?', meaning
they are optional; or a '*', meaning there can be zero or more of that
item. {}'s indicate an object that maps from field identifiers to
-values. An object field marked '?' is optional. |'s indicate
-alternates (e.g., int|string means something can be an int or a
-string).
+values. An object field marked '?' is optional; one marked with '*'
+can repeat (with a different name). |'s indicate alternates (e.g.,
+int|string means something can be an int or a string).
For S-Expression output, lists are printed delimited by () instead of
[]. Objects are printed as p-lists, i.e. lists where the keys and values
colon), e.g. (:id "123" :time 54321 :from "foobar"). Null is printed as
nil, true as t and false as nil.
-This is version 2 of the structured output format.
+This is version 5 of the structured output format.
Version history
---------------
v2
- Added the thread_summary.query field.
+v3
+- Replaced message.filename string with a list of filenames.
+- Added part.content-disposition field.
+
+v4
+- replace signature error integer bitmask with a set of flags for
+ individual errors.
+- (notmuch 0.29) added message.crypto to identify overall message
+ cryptographic state
+
+v5
+- sorting support for notmuch show (no change to actual schema,
+ just new command line argument)
+
Common non-terminals
--------------------
# Message ID, sans "id:"
messageid = string
+# E-mail header name, sans trailing colon, like "Subject" or "In-Reply-To"
+header_name = string
+
notmuch show schema
-------------------
# (format_message_sprinter)
id: messageid,
match: bool,
- filename: string,
+ filename: [string*],
timestamp: unix_time, # date header as unix time
date_relative: string, # user-friendly timestamp
tags: [string*],
headers: headers,
+ crypto: crypto,
+ duplicate: integer,
body?: [part] # omitted if --body=false
}
+# when showing the message, was any or all of it decrypted?
+msgdecstatus: "full"|"partial"
+
+# The overall cryptographic state of the message as a whole:
+crypto = {
+ signed?: {
+ status: sigstatus,
+ # was the set of signatures described under encrypted cover?
+ encrypted: bool,
+ # which of the headers is covered by sigstatus?
+ headers: [header_name*]
+ },
+ decrypted?: {
+ status: msgdecstatus,
+ # map encrypted headers that differed from the outside headers.
+ # the value of each item in the map is what that field showed externally
+ # (maybe null if it was not present in the external headers).
+ header-mask: { header_name*: string|null }
+ }
+}
+
# A MIME part (format_part_sprinter)
part = {
id: int|string, # part id (currently DFS part number)
sigstatus?: sigstatus,
content-type: string,
+ content-disposition?: string,
content-id?: string,
# if content-type starts with "multipart/":
content: [part*],
Cc?: string,
Bcc?: string,
Reply-To?: string,
- Date: string
+ Date: string,
+ extra_header_pair*
}
+extra_header_pair= (header_name: string)
# Encryption status (format_part_sprinter)
encstatus = [{status: "good"|"bad"}]
signature = {
# (signature_status_to_string)
- status: "none"|"good"|"bad"|"error"|"unknown",
+ status: "good"|"bad"|"error"|"unknown",
# if status is "good":
fingerprint?: string,
created?: unix_time,
expires?: unix_time,
userid?: string
+ email?: string
# if status is not "good":
keyid?: string
- # if the signature has errors:
- errors?: int
+ errors?: sig_errors
+}
+
+sig_errors = {
+ key-revoked?: bool,
+ key-expired?: bool,
+ sig-expired?: bool,
+ key-missing?: bool,
+ alg-unsupported?: bool,
+ crl-missing?: bool,
+ crl-too-old?: bool,
+ bad-policy?: bool,
+ sys-error?: bool,
+ tofu-conflict?: bool
}
notmuch search schema