this repo has no description
1(** Implementation of the JMAP Mail extension, as defined in RFC8621 2 @see <https://datatracker.ietf.org/doc/html/rfc8621> RFC8621 3 4 This module implements the JMAP Mail specification, providing types and 5 functions for working with emails, mailboxes, threads, and other mail-related 6 objects in the JMAP protocol. 7*) 8 9(** Module for managing JMAP Mail-specific capability URIs as defined in RFC8621 Section 1.3 10 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-1.3> RFC8621 Section 1.3 11*) 12module Capability : sig 13 (** Mail capability URI as defined in RFC8621 Section 1.3 14 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-1.3> 15 *) 16 val mail_uri : string 17 18 (** Submission capability URI as defined in RFC8621 Section 1.3 19 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-1.3> 20 *) 21 val submission_uri : string 22 23 (** Vacation response capability URI as defined in RFC8621 Section 1.3 24 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-1.3> 25 *) 26 val vacation_response_uri : string 27 28 (** All mail extension capability types as defined in RFC8621 Section 1.3 29 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-1.3> 30 *) 31 type t = 32 | Mail (** Mail capability for emails and mailboxes *) 33 | Submission (** Submission capability for sending emails *) 34 | VacationResponse (** Vacation response capability for auto-replies *) 35 | Extension of string (** Custom extension capabilities *) 36 37 (** Convert capability to URI string 38 @param capability The capability to convert 39 @return The full URI string for the capability 40 *) 41 val to_string : t -> string 42 43 (** Parse a string to a capability 44 @param uri The capability URI string to parse 45 @return The parsed capability type 46 *) 47 val of_string : string -> t 48 49 (** Check if a capability is a standard mail capability 50 @param capability The capability to check 51 @return True if the capability is a standard JMAP Mail capability 52 *) 53 val is_standard : t -> bool 54 55 (** Check if a capability string is a standard mail capability 56 @param uri The capability URI string to check 57 @return True if the string represents a standard JMAP Mail capability 58 *) 59 val is_standard_string : string -> bool 60 61 (** Create a list of capability strings 62 @param capabilities List of capability types 63 @return List of capability URI strings 64 *) 65 val strings_of_capabilities : t list -> string list 66end 67 68(** Types for the JMAP Mail extension as defined in RFC8621 69 @see <https://datatracker.ietf.org/doc/html/rfc8621> 70*) 71module Types : sig 72 open Jmap.Types 73 74 (** {1 Mail capabilities} 75 Capability URIs for JMAP Mail extension as defined in RFC8621 Section 1.3 76 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-1.3> 77 *) 78 79 (** Capability URI for JMAP Mail as defined in RFC8621 Section 1.3 80 Identifies support for the Mail data model 81 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-1.3> 82 *) 83 val capability_mail : string 84 85 (** Capability URI for JMAP Submission as defined in RFC8621 Section 1.3 86 Identifies support for email submission 87 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-1.3> 88 *) 89 val capability_submission : string 90 91 (** Capability URI for JMAP Vacation Response as defined in RFC8621 Section 1.3 92 Identifies support for vacation auto-reply functionality 93 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-1.3> 94 *) 95 val capability_vacation_response : string 96 97 (** {1:mailbox Mailbox objects} 98 Mailbox types as defined in RFC8621 Section 2 99 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2> 100 *) 101 102 (** A role for a mailbox as defined in RFC8621 Section 2. 103 Standardized roles for special mailboxes like Inbox, Sent, etc. 104 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2> 105 *) 106 type mailbox_role = 107 | All (** All mail mailbox *) 108 | Archive (** Archived mail mailbox *) 109 | Drafts (** Draft messages mailbox *) 110 | Flagged (** Starred/flagged mail mailbox *) 111 | Important (** Important mail mailbox *) 112 | Inbox (** Primary inbox mailbox *) 113 | Junk (** Spam/Junk mail mailbox *) 114 | Sent (** Sent mail mailbox *) 115 | Trash (** Deleted/Trash mail mailbox *) 116 | Unknown of string (** Server-specific custom roles *) 117 118 (** A mailbox (folder) in a mail account as defined in RFC8621 Section 2. 119 Represents an email folder or label in the account. 120 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2> 121 *) 122 type mailbox = { 123 id : id; (** Server-assigned ID for the mailbox *) 124 name : string; (** User-visible name for the mailbox *) 125 parent_id : id option; (** ID of the parent mailbox, if any *) 126 role : mailbox_role option; (** The role of this mailbox, if it's a special mailbox *) 127 sort_order : unsigned_int; (** Position for mailbox in the UI *) 128 total_emails : unsigned_int; (** Total number of emails in the mailbox *) 129 unread_emails : unsigned_int; (** Number of unread emails in the mailbox *) 130 total_threads : unsigned_int; (** Total number of threads in the mailbox *) 131 unread_threads : unsigned_int; (** Number of threads with unread emails *) 132 is_subscribed : bool; (** Has the user subscribed to this mailbox *) 133 my_rights : mailbox_rights; (** Access rights for the user on this mailbox *) 134 } 135 136 (** Rights for a mailbox as defined in RFC8621 Section 2. 137 Determines the operations a user can perform on a mailbox. 138 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2> 139 *) 140 and mailbox_rights = { 141 may_read_items : bool; (** Can the user read messages in this mailbox *) 142 may_add_items : bool; (** Can the user add messages to this mailbox *) 143 may_remove_items : bool; (** Can the user remove messages from this mailbox *) 144 may_set_seen : bool; (** Can the user mark messages as read/unread *) 145 may_set_keywords : bool; (** Can the user set keywords/flags on messages *) 146 may_create_child : bool; (** Can the user create child mailboxes *) 147 may_rename : bool; (** Can the user rename this mailbox *) 148 may_delete : bool; (** Can the user delete this mailbox *) 149 may_submit : bool; (** Can the user submit messages in this mailbox for delivery *) 150 } 151 152 (** Filter condition for mailbox queries as defined in RFC8621 Section 2.3. 153 Used to filter mailboxes in queries. 154 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.3> 155 *) 156 type mailbox_filter_condition = { 157 parent_id : id option; (** Only include mailboxes with this parent *) 158 name : string option; (** Only include mailboxes with this name (case-insensitive substring match) *) 159 role : string option; (** Only include mailboxes with this role *) 160 has_any_role : bool option; (** If true, only include mailboxes with a role, if false those without *) 161 is_subscribed : bool option; (** If true, only include subscribed mailboxes, if false unsubscribed *) 162 } 163 164 (** Filter for mailbox queries as defined in RFC8621 Section 2.3. 165 Complex filter for Mailbox/query method. 166 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.3> 167 *) 168 type mailbox_query_filter = [ 169 | `And of mailbox_query_filter list (** Logical AND of filters *) 170 | `Or of mailbox_query_filter list (** Logical OR of filters *) 171 | `Not of mailbox_query_filter (** Logical NOT of a filter *) 172 | `Condition of mailbox_filter_condition (** Simple condition filter *) 173 ] 174 175 (** Mailbox/get request arguments as defined in RFC8621 Section 2.1. 176 Used to fetch mailboxes by ID. 177 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.1> 178 *) 179 type mailbox_get_arguments = { 180 account_id : id; (** The account to fetch mailboxes from *) 181 ids : id list option; (** The IDs of mailboxes to fetch, null means all *) 182 properties : string list option; (** Properties to return, null means all *) 183 } 184 185 (** Mailbox/get response as defined in RFC8621 Section 2.1. 186 Contains requested mailboxes. 187 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.1> 188 *) 189 type mailbox_get_response = { 190 account_id : id; (** The account from which mailboxes were fetched *) 191 state : string; (** A string representing the state on the server *) 192 list : mailbox list; (** The list of mailboxes requested *) 193 not_found : id list; (** IDs requested that could not be found *) 194 } 195 196 (** Mailbox/changes request arguments as defined in RFC8621 Section 2.2. 197 Used to get mailbox changes since a previous state. 198 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.2> 199 *) 200 type mailbox_changes_arguments = { 201 account_id : id; (** The account to get changes for *) 202 since_state : string; (** The previous state to compare to *) 203 max_changes : unsigned_int option; (** Maximum number of changes to return *) 204 } 205 206 (** Mailbox/changes response as defined in RFC8621 Section 2.2. 207 Reports mailboxes that have changed since a previous state. 208 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.2> 209 *) 210 type mailbox_changes_response = { 211 account_id : id; (** The account changes are for *) 212 old_state : string; (** The state provided in the request *) 213 new_state : string; (** The current state on the server *) 214 has_more_changes : bool; (** If true, more changes are available *) 215 created : id list; (** IDs of mailboxes created since old_state *) 216 updated : id list; (** IDs of mailboxes updated since old_state *) 217 destroyed : id list; (** IDs of mailboxes destroyed since old_state *) 218 } 219 220 (** Mailbox/query request arguments as defined in RFC8621 Section 2.3. 221 Used to query mailboxes based on filter criteria. 222 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.3> 223 *) 224 type mailbox_query_arguments = { 225 account_id : id; (** The account to query *) 226 filter : mailbox_query_filter option; (** Filter to match mailboxes against *) 227 sort : [ `name | `role | `sort_order ] list option; (** Sort criteria *) 228 limit : unsigned_int option; (** Maximum number of results to return *) 229 } 230 231 (** Mailbox/query response as defined in RFC8621 Section 2.3. 232 Contains IDs of mailboxes matching the query. 233 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.3> 234 *) 235 type mailbox_query_response = { 236 account_id : id; (** The account that was queried *) 237 query_state : string; (** State string for the query results *) 238 can_calculate_changes : bool; (** Whether queryChanges can be used with these results *) 239 position : unsigned_int; (** Zero-based index of the first result *) 240 ids : id list; (** IDs of mailboxes matching the query *) 241 total : unsigned_int option; (** Total number of matches if requested *) 242 } 243 244 (** Mailbox/queryChanges request arguments as defined in RFC8621 Section 2.4. 245 Used to get changes to mailbox query results. 246 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.4> 247 *) 248 type mailbox_query_changes_arguments = { 249 account_id : id; (** The account to query *) 250 filter : mailbox_query_filter option; (** Same filter as the original query *) 251 sort : [ `name | `role | `sort_order ] list option; (** Same sort as the original query *) 252 since_query_state : string; (** The query_state from the previous result *) 253 max_changes : unsigned_int option; (** Maximum number of changes to return *) 254 up_to_id : id option; (** ID of the last mailbox to check for changes *) 255 } 256 257 (** Mailbox/queryChanges response as defined in RFC8621 Section 2.4. 258 Reports changes to a mailbox query since the previous state. 259 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.4> 260 *) 261 type mailbox_query_changes_response = { 262 account_id : id; (** The account that was queried *) 263 old_query_state : string; (** The query_state from the request *) 264 new_query_state : string; (** The current query_state on the server *) 265 total : unsigned_int option; (** Updated total number of matches, if requested *) 266 removed : id list; (** IDs that were in the old results but not the new *) 267 added : mailbox_query_changes_added list; (** IDs that are in the new results but not the old *) 268 } 269 270 (** Added item in mailbox query changes as defined in RFC8621 Section 2.4. 271 Represents a mailbox added to query results. 272 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.4> 273 *) 274 and mailbox_query_changes_added = { 275 id : id; (** ID of the added mailbox *) 276 index : unsigned_int; (** Zero-based index of the added mailbox in the results *) 277 } 278 279 (** Mailbox/set request arguments as defined in RFC8621 Section 2.5. 280 Used to create, update, and destroy mailboxes. 281 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.5> 282 *) 283 type mailbox_set_arguments = { 284 account_id : id; (** The account to make changes in *) 285 if_in_state : string option; (** Only apply changes if in this state *) 286 create : (id * mailbox_creation) list option; (** Map of creation IDs to mailboxes to create *) 287 update : (id * mailbox_update) list option; (** Map of IDs to update properties *) 288 destroy : id list option; (** List of IDs to destroy *) 289 } 290 291 (** Properties for mailbox creation as defined in RFC8621 Section 2.5. 292 Used to create new mailboxes. 293 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.5> 294 *) 295 and mailbox_creation = { 296 name : string; (** Name for the new mailbox *) 297 parent_id : id option; (** ID of the parent mailbox, if any *) 298 role : string option; (** Role for the mailbox, if it's a special-purpose mailbox *) 299 sort_order : unsigned_int option; (** Sort order, defaults to 0 *) 300 is_subscribed : bool option; (** Whether the mailbox is subscribed, defaults to true *) 301 } 302 303 (** Properties for mailbox update as defined in RFC8621 Section 2.5. 304 Used to update existing mailboxes. 305 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.5> 306 *) 307 and mailbox_update = { 308 name : string option; (** New name for the mailbox *) 309 parent_id : id option; (** New parent ID for the mailbox *) 310 role : string option; (** New role for the mailbox *) 311 sort_order : unsigned_int option; (** New sort order for the mailbox *) 312 is_subscribed : bool option; (** New subscription status for the mailbox *) 313 } 314 315 (** Mailbox/set response as defined in RFC8621 Section 2.5. 316 Reports the results of mailbox changes. 317 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-2.5> 318 *) 319 type mailbox_set_response = { 320 account_id : id; (** The account that was modified *) 321 old_state : string option; (** The state before processing, if changed *) 322 new_state : string; (** The current state on the server *) 323 created : (id * mailbox) list option; (** Map of creation IDs to created mailboxes *) 324 updated : id list option; (** List of IDs that were successfully updated *) 325 destroyed : id list option; (** List of IDs that were successfully destroyed *) 326 not_created : (id * set_error) list option; (** Map of IDs to errors for failed creates *) 327 not_updated : (id * set_error) list option; (** Map of IDs to errors for failed updates *) 328 not_destroyed : (id * set_error) list option; (** Map of IDs to errors for failed destroys *) 329 } 330 331 (** {1:thread Thread objects} 332 Thread types as defined in RFC8621 Section 3 333 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-3> 334 *) 335 336 (** A thread in a mail account as defined in RFC8621 Section 3. 337 Represents a group of related email messages. 338 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-3> 339 *) 340 type thread = { 341 id : id; (** Server-assigned ID for the thread *) 342 email_ids : id list; (** IDs of emails in the thread *) 343 } 344 345 (** Thread/get request arguments as defined in RFC8621 Section 3.1. 346 Used to fetch threads by ID. 347 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-3.1> 348 *) 349 type thread_get_arguments = { 350 account_id : id; (** The account to fetch threads from *) 351 ids : id list option; (** The IDs of threads to fetch, null means all *) 352 properties : string list option; (** Properties to return, null means all *) 353 } 354 355 (** Thread/get response as defined in RFC8621 Section 3.1. 356 Contains requested threads. 357 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-3.1> 358 *) 359 type thread_get_response = { 360 account_id : id; (** The account from which threads were fetched *) 361 state : string; (** A string representing the state on the server *) 362 list : thread list; (** The list of threads requested *) 363 not_found : id list; (** IDs requested that could not be found *) 364 } 365 366 (** Thread/changes request arguments as defined in RFC8621 Section 3.2. 367 Used to get thread changes since a previous state. 368 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-3.2> 369 *) 370 type thread_changes_arguments = { 371 account_id : id; (** The account to get changes for *) 372 since_state : string; (** The previous state to compare to *) 373 max_changes : unsigned_int option; (** Maximum number of changes to return *) 374 } 375 376 (** Thread/changes response as defined in RFC8621 Section 3.2. 377 Reports threads that have changed since a previous state. 378 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-3.2> 379 *) 380 type thread_changes_response = { 381 account_id : id; (** The account changes are for *) 382 old_state : string; (** The state provided in the request *) 383 new_state : string; (** The current state on the server *) 384 has_more_changes : bool; (** If true, more changes are available *) 385 created : id list; (** IDs of threads created since old_state *) 386 updated : id list; (** IDs of threads updated since old_state *) 387 destroyed : id list; (** IDs of threads destroyed since old_state *) 388 } 389 390 (** {1:email Email objects} 391 Email types as defined in RFC8621 Section 4 392 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4> 393 *) 394 395 (** Addressing (mailbox) information as defined in RFC8621 Section 4.1.1. 396 Represents an email address with optional display name. 397 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.1.1> 398 *) 399 type email_address = { 400 name : string option; (** Display name of the mailbox (e.g., "John Doe") *) 401 email : string; (** The email address (e.g., "john@example.com") *) 402 parameters : (string * string) list; (** Additional parameters for the address *) 403 } 404 405 (** Message header field as defined in RFC8621 Section 4.1.2. 406 Represents an email header. 407 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.1.2> 408 *) 409 type header = { 410 name : string; (** Name of the header field (e.g., "Subject") *) 411 value : string; (** Value of the header field *) 412 } 413 414 (** Email keyword (flag) as defined in RFC8621 Section 4.3. 415 Represents a flag or tag on an email message. 416 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.3> 417 *) 418 type keyword = 419 | Flagged (** Message is flagged/starred *) 420 | Answered (** Message has been replied to *) 421 | Draft (** Message is a draft *) 422 | Forwarded (** Message has been forwarded *) 423 | Phishing (** Message has been reported as phishing *) 424 | Junk (** Message is spam/junk *) 425 | NotJunk (** Message is explicitly not spam *) 426 | Seen (** Message has been read *) 427 | Unread (** Message is unread (inverse of $seen) *) 428 | Custom of string (** Custom/non-standard keywords *) 429 430 (** Email message as defined in RFC8621 Section 4. 431 Represents an email message in a mail account. 432 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4> 433 *) 434 type email = { 435 id : id; (** Server-assigned ID for the message *) 436 blob_id : id; (** ID of the raw message content blob *) 437 thread_id : id; (** ID of the thread this message belongs to *) 438 mailbox_ids : (id * bool) list; (** Map of mailbox IDs to boolean (whether message belongs to mailbox) *) 439 keywords : (keyword * bool) list; (** Map of keywords to boolean (whether message has keyword) *) 440 size : unsigned_int; (** Size of the message in octets *) 441 received_at : utc_date; (** When the message was received by the server *) 442 message_id : string list; (** Message-ID header values *) 443 in_reply_to : string list option; (** In-Reply-To header values *) 444 references : string list option; (** References header values *) 445 sender : email_address list option; (** Sender header addresses *) 446 from : email_address list option; (** From header addresses *) 447 to_ : email_address list option; (** To header addresses *) 448 cc : email_address list option; (** Cc header addresses *) 449 bcc : email_address list option; (** Bcc header addresses *) 450 reply_to : email_address list option; (** Reply-To header addresses *) 451 subject : string option; (** Subject header value *) 452 sent_at : utc_date option; (** Date header value as a date-time *) 453 has_attachment : bool option; (** Does the message have any attachments *) 454 preview : string option; (** Preview of the message (first bit of text) *) 455 body_values : (string * string) list option; (** Map of part IDs to text content *) 456 text_body : email_body_part list option; (** Plain text message body parts *) 457 html_body : email_body_part list option; (** HTML message body parts *) 458 attachments : email_body_part list option; (** Attachment parts in the message *) 459 headers : header list option; (** All headers in the message *) 460 } 461 462 (** Email body part as defined in RFC8621 Section 4.1.4. 463 Represents a MIME part in an email message. 464 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.1.4> 465 *) 466 and email_body_part = { 467 part_id : string option; (** Server-assigned ID for the MIME part *) 468 blob_id : id option; (** ID of the raw content for this part *) 469 size : unsigned_int option; (** Size of the part in octets *) 470 headers : header list option; (** Headers for this MIME part *) 471 name : string option; (** Filename of this part, if any *) 472 type_ : string option; (** MIME type of the part *) 473 charset : string option; (** Character set of the part, if applicable *) 474 disposition : string option; (** Content-Disposition value *) 475 cid : string option; (** Content-ID value *) 476 language : string list option; (** Content-Language values *) 477 location : string option; (** Content-Location value *) 478 sub_parts : email_body_part list option; (** Child MIME parts for multipart types *) 479 header_parameter_name : string option; (** Header parameter name (for headers with parameters) *) 480 header_parameter_value : string option; (** Header parameter value (for headers with parameters) *) 481 } 482 483 (** Email query filter condition as defined in RFC8621 Section 4.4. 484 Specifies conditions for filtering emails in queries. 485 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.4> 486 *) 487 type email_filter_condition = { 488 in_mailbox : id option; (** Only include emails in this mailbox *) 489 in_mailbox_other_than : id list option; (** Only include emails not in these mailboxes *) 490 min_size : unsigned_int option; (** Only include emails of at least this size in octets *) 491 max_size : unsigned_int option; (** Only include emails of at most this size in octets *) 492 before : utc_date option; (** Only include emails received before this date-time *) 493 after : utc_date option; (** Only include emails received after this date-time *) 494 header : (string * string) option; (** Only include emails with header matching value (name, value) *) 495 from : string option; (** Only include emails with From containing this text *) 496 to_ : string option; (** Only include emails with To containing this text *) 497 cc : string option; (** Only include emails with CC containing this text *) 498 bcc : string option; (** Only include emails with BCC containing this text *) 499 subject : string option; (** Only include emails with Subject containing this text *) 500 body : string option; (** Only include emails with body containing this text *) 501 has_keyword : string option; (** Only include emails with this keyword *) 502 not_keyword : string option; (** Only include emails without this keyword *) 503 has_attachment : bool option; (** If true, only include emails with attachments *) 504 text : string option; (** Only include emails with this text in headers or body *) 505 } 506 507 (** Filter for email queries as defined in RFC8621 Section 4.4. 508 Complex filter for Email/query method. 509 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.4> 510 *) 511 type email_query_filter = [ 512 | `And of email_query_filter list (** Logical AND of filters *) 513 | `Or of email_query_filter list (** Logical OR of filters *) 514 | `Not of email_query_filter (** Logical NOT of a filter *) 515 | `Condition of email_filter_condition (** Simple condition filter *) 516 ] 517 518 (** Email/get request arguments as defined in RFC8621 Section 4.5. 519 Used to fetch emails by ID. 520 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.5> 521 *) 522 type email_get_arguments = { 523 account_id : id; (** The account to fetch emails from *) 524 ids : id list option; (** The IDs of emails to fetch, null means all *) 525 properties : string list option; (** Properties to return, null means all *) 526 body_properties : string list option; (** Properties to return on body parts *) 527 fetch_text_body_values : bool option; (** Whether to fetch text body content *) 528 fetch_html_body_values : bool option; (** Whether to fetch HTML body content *) 529 fetch_all_body_values : bool option; (** Whether to fetch all body content *) 530 max_body_value_bytes : unsigned_int option; (** Maximum size of body values to return *) 531 } 532 533 (** Email/get response as defined in RFC8621 Section 4.5. 534 Contains requested emails. 535 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.5> 536 *) 537 type email_get_response = { 538 account_id : id; (** The account from which emails were fetched *) 539 state : string; (** A string representing the state on the server *) 540 list : email list; (** The list of emails requested *) 541 not_found : id list; (** IDs requested that could not be found *) 542 } 543 544 (** Email/changes request arguments as defined in RFC8621 Section 4.6. 545 Used to get email changes since a previous state. 546 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.6> 547 *) 548 type email_changes_arguments = { 549 account_id : id; (** The account to get changes for *) 550 since_state : string; (** The previous state to compare to *) 551 max_changes : unsigned_int option; (** Maximum number of changes to return *) 552 } 553 554 (** Email/changes response as defined in RFC8621 Section 4.6. 555 Reports emails that have changed since a previous state. 556 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.6> 557 *) 558 type email_changes_response = { 559 account_id : id; (** The account changes are for *) 560 old_state : string; (** The state provided in the request *) 561 new_state : string; (** The current state on the server *) 562 has_more_changes : bool; (** If true, more changes are available *) 563 created : id list; (** IDs of emails created since old_state *) 564 updated : id list; (** IDs of emails updated since old_state *) 565 destroyed : id list; (** IDs of emails destroyed since old_state *) 566 } 567 568 (** Email/query request arguments as defined in RFC8621 Section 4.4. 569 Used to query emails based on filter criteria. 570 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.4> 571 *) 572 type email_query_arguments = { 573 account_id : id; (** The account to query *) 574 filter : email_query_filter option; (** Filter to match emails against *) 575 sort : comparator list option; (** Sort criteria *) 576 collapse_threads : bool option; (** Whether to collapse threads in the results *) 577 position : unsigned_int option; (** Zero-based index of first result to return *) 578 anchor : id option; (** ID of email to use as reference point *) 579 anchor_offset : int_t option; (** Offset from anchor to start returning results *) 580 limit : unsigned_int option; (** Maximum number of results to return *) 581 calculate_total : bool option; (** Whether to calculate the total number of matching emails *) 582 } 583 584 (** Email/query response as defined in RFC8621 Section 4.4. 585 Contains IDs of emails matching the query. 586 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.4> 587 *) 588 type email_query_response = { 589 account_id : id; (** The account that was queried *) 590 query_state : string; (** State string for the query results *) 591 can_calculate_changes : bool; (** Whether queryChanges can be used with these results *) 592 position : unsigned_int; (** Zero-based index of the first result *) 593 ids : id list; (** IDs of emails matching the query *) 594 total : unsigned_int option; (** Total number of matches if requested *) 595 thread_ids : id list option; (** IDs of threads if collapse_threads was true *) 596 } 597 598 (** Email/queryChanges request arguments as defined in RFC8621 Section 4.7. 599 Used to get changes to email query results. 600 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.7> 601 *) 602 type email_query_changes_arguments = { 603 account_id : id; (** The account to query *) 604 filter : email_query_filter option; (** Same filter as the original query *) 605 sort : comparator list option; (** Same sort as the original query *) 606 collapse_threads : bool option; (** Same collapse_threads as the original query *) 607 since_query_state : string; (** The query_state from the previous result *) 608 max_changes : unsigned_int option; (** Maximum number of changes to return *) 609 up_to_id : id option; (** ID of the last email to check for changes *) 610 } 611 612 (** Email/queryChanges response as defined in RFC8621 Section 4.7. 613 Reports changes to an email query since the previous state. 614 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.7> 615 *) 616 type email_query_changes_response = { 617 account_id : id; (** The account that was queried *) 618 old_query_state : string; (** The query_state from the request *) 619 new_query_state : string; (** The current query_state on the server *) 620 total : unsigned_int option; (** Updated total number of matches, if requested *) 621 removed : id list; (** IDs that were in the old results but not the new *) 622 added : email_query_changes_added list; (** IDs that are in the new results but not the old *) 623 } 624 625 (** Added item in email query changes as defined in RFC8621 Section 4.7. 626 Represents an email added to query results. 627 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.7> 628 *) 629 and email_query_changes_added = { 630 id : id; (** ID of the added email *) 631 index : unsigned_int; (** Zero-based index of the added email in the results *) 632 } 633 634 (** Email/set request arguments as defined in RFC8621 Section 4.8. 635 Used to create, update, and destroy emails. 636 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.8> 637 *) 638 type email_set_arguments = { 639 account_id : id; (** The account to make changes in *) 640 if_in_state : string option; (** Only apply changes if in this state *) 641 create : (id * email_creation) list option; (** Map of creation IDs to emails to create *) 642 update : (id * email_update) list option; (** Map of IDs to update properties *) 643 destroy : id list option; (** List of IDs to destroy *) 644 } 645 646 (** Properties for email creation as defined in RFC8621 Section 4.8. 647 Used to create new emails. 648 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.8> 649 *) 650 and email_creation = { 651 mailbox_ids : (id * bool) list; (** Map of mailbox IDs to boolean (whether message belongs to mailbox) *) 652 keywords : (keyword * bool) list option; (** Map of keywords to boolean (whether message has keyword) *) 653 received_at : utc_date option; (** When the message was received by the server *) 654 message_id : string list option; (** Message-ID header values *) 655 in_reply_to : string list option; (** In-Reply-To header values *) 656 references : string list option; (** References header values *) 657 sender : email_address list option; (** Sender header addresses *) 658 from : email_address list option; (** From header addresses *) 659 to_ : email_address list option; (** To header addresses *) 660 cc : email_address list option; (** Cc header addresses *) 661 bcc : email_address list option; (** Bcc header addresses *) 662 reply_to : email_address list option; (** Reply-To header addresses *) 663 subject : string option; (** Subject header value *) 664 body_values : (string * string) list option; (** Map of part IDs to text content *) 665 text_body : email_body_part list option; (** Plain text message body parts *) 666 html_body : email_body_part list option; (** HTML message body parts *) 667 attachments : email_body_part list option; (** Attachment parts in the message *) 668 headers : header list option; (** All headers in the message *) 669 } 670 671 (** Properties for email update as defined in RFC8621 Section 4.8. 672 Used to update existing emails. 673 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.8> 674 *) 675 and email_update = { 676 keywords : (keyword * bool) list option; (** New keywords to set on the email *) 677 mailbox_ids : (id * bool) list option; (** New mailboxes to set for the email *) 678 } 679 680 (** Email/set response as defined in RFC8621 Section 4.8. 681 Reports the results of email changes. 682 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.8> 683 *) 684 type email_set_response = { 685 account_id : id; (** The account that was modified *) 686 old_state : string option; (** The state before processing, if changed *) 687 new_state : string; (** The current state on the server *) 688 created : (id * email) list option; (** Map of creation IDs to created emails *) 689 updated : id list option; (** List of IDs that were successfully updated *) 690 destroyed : id list option; (** List of IDs that were successfully destroyed *) 691 not_created : (id * set_error) list option; (** Map of IDs to errors for failed creates *) 692 not_updated : (id * set_error) list option; (** Map of IDs to errors for failed updates *) 693 not_destroyed : (id * set_error) list option; (** Map of IDs to errors for failed destroys *) 694 } 695 696 (** Email/copy request arguments as defined in RFC8621 Section 4.9. 697 Used to copy emails between accounts. 698 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.9> 699 *) 700 type email_copy_arguments = { 701 from_account_id : id; (** The account to copy emails from *) 702 account_id : id; (** The account to copy emails to *) 703 create : (id * email_creation) list; (** Map of creation IDs to email creation properties *) 704 on_success_destroy_original : bool option; (** Whether to destroy originals after copying *) 705 } 706 707 (** Email/copy response as defined in RFC8621 Section 4.9. 708 Reports the results of copying emails. 709 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.9> 710 *) 711 type email_copy_response = { 712 from_account_id : id; (** The account emails were copied from *) 713 account_id : id; (** The account emails were copied to *) 714 created : (id * email) list option; (** Map of creation IDs to created emails *) 715 not_created : (id * set_error) list option; (** Map of IDs to errors for failed copies *) 716 } 717 718 (** Email/import request arguments as defined in RFC8621 Section 4.10. 719 Used to import raw emails from blobs. 720 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.10> 721 *) 722 type email_import_arguments = { 723 account_id : id; (** The account to import emails into *) 724 emails : (id * email_import) list; (** Map of creation IDs to import properties *) 725 } 726 727 (** Properties for email import as defined in RFC8621 Section 4.10. 728 Used to import raw emails from blobs. 729 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.10> 730 *) 731 and email_import = { 732 blob_id : id; (** ID of the blob containing the raw message *) 733 mailbox_ids : (id * bool) list; (** Map of mailbox IDs to boolean (whether message belongs to mailbox) *) 734 keywords : (keyword * bool) list option; (** Map of keywords to boolean (whether message has keyword) *) 735 received_at : utc_date option; (** When the message was received, defaults to now *) 736 } 737 738 (** Email/import response as defined in RFC8621 Section 4.10. 739 Reports the results of importing emails. 740 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.10> 741 *) 742 type email_import_response = { 743 account_id : id; (** The account emails were imported into *) 744 created : (id * email) list option; (** Map of creation IDs to created emails *) 745 not_created : (id * set_error) list option; (** Map of IDs to errors for failed imports *) 746 } 747 748 (** {1:search_snippet Search snippets} 749 Search snippet types as defined in RFC8621 Section 4.11 750 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.11> 751 *) 752 753 (** SearchSnippet/get request arguments as defined in RFC8621 Section 4.11. 754 Used to get highlighted snippets from emails matching a search. 755 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.11> 756 *) 757 type search_snippet_get_arguments = { 758 account_id : id; (** The account to search in *) 759 email_ids : id list; (** The IDs of emails to get snippets for *) 760 filter : email_filter_condition; (** Filter containing the text to find and highlight *) 761 } 762 763 (** SearchSnippet/get response as defined in RFC8621 Section 4.11. 764 Contains search result snippets with highlighted text. 765 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.11> 766 *) 767 type search_snippet_get_response = { 768 account_id : id; (** The account that was searched *) 769 list : (id * search_snippet) list; (** Map of email IDs to their search snippets *) 770 not_found : id list; (** IDs for which no snippet could be generated *) 771 } 772 773 (** Search snippet for an email as defined in RFC8621 Section 4.11. 774 Contains highlighted parts of emails matching a search. 775 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-4.11> 776 *) 777 and search_snippet = { 778 subject : string option; (** Subject with search terms highlighted *) 779 preview : string option; (** Email body preview with search terms highlighted *) 780 } 781 782 (** {1:submission EmailSubmission objects} 783 Email submission types as defined in RFC8621 Section 5 784 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5> 785 *) 786 787 (** EmailSubmission address as defined in RFC8621 Section 5.1. 788 Represents an email address for mail submission. 789 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.1> 790 *) 791 type submission_address = { 792 email : string; (** The email address (e.g., "john@example.com") *) 793 parameters : (string * string) list option; (** SMTP extension parameters *) 794 } 795 796 (** Email submission object as defined in RFC8621 Section 5.1. 797 Represents an email that has been or will be sent. 798 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.1> 799 *) 800 type email_submission = { 801 id : id; (** Server-assigned ID for the submission *) 802 identity_id : id; (** ID of the identity used to send the email *) 803 email_id : id; (** ID of the email to send *) 804 thread_id : id; (** ID of the thread containing the message *) 805 envelope : envelope option; (** SMTP envelope for the message *) 806 send_at : utc_date option; (** When to send the email, null for immediate *) 807 undo_status : [ 808 | `pending (** Submission can still be canceled *) 809 | `final (** Submission can no longer be canceled *) 810 | `canceled (** Submission was canceled *) 811 ] option; (** Current undo status of the submission *) 812 delivery_status : (string * submission_status) list option; (** Map of recipient to delivery status *) 813 dsn_blob_ids : (string * id) list option; (** Map of recipient to DSN blob ID *) 814 mdn_blob_ids : (string * id) list option; (** Map of recipient to MDN blob ID *) 815 } 816 817 (** Envelope for mail submission as defined in RFC8621 Section 5.1. 818 Represents the SMTP envelope for a message. 819 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.1> 820 *) 821 and envelope = { 822 mail_from : submission_address; (** Return path for the message *) 823 rcpt_to : submission_address list; (** Recipients for the message *) 824 } 825 826 (** Delivery status for submitted email as defined in RFC8621 Section 5.1. 827 Represents the SMTP status of a delivery attempt. 828 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.1> 829 *) 830 and submission_status = { 831 smtp_reply : string; (** SMTP response from the server *) 832 delivered : string option; (** Timestamp when message was delivered, if successful *) 833 } 834 835 (** EmailSubmission/get request arguments as defined in RFC8621 Section 5.3. 836 Used to fetch email submissions by ID. 837 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.3> 838 *) 839 type email_submission_get_arguments = { 840 account_id : id; (** The account to fetch submissions from *) 841 ids : id list option; (** The IDs of submissions to fetch, null means all *) 842 properties : string list option; (** Properties to return, null means all *) 843 } 844 845 (** EmailSubmission/get response as defined in RFC8621 Section 5.3. 846 Contains requested email submissions. 847 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.3> 848 *) 849 type email_submission_get_response = { 850 account_id : id; (** The account from which submissions were fetched *) 851 state : string; (** A string representing the state on the server *) 852 list : email_submission list; (** The list of submissions requested *) 853 not_found : id list; (** IDs requested that could not be found *) 854 } 855 856 (** EmailSubmission/changes request arguments as defined in RFC8621 Section 5.4. 857 Used to get submission changes since a previous state. 858 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.4> 859 *) 860 type email_submission_changes_arguments = { 861 account_id : id; (** The account to get changes for *) 862 since_state : string; (** The previous state to compare to *) 863 max_changes : unsigned_int option; (** Maximum number of changes to return *) 864 } 865 866 (** EmailSubmission/changes response as defined in RFC8621 Section 5.4. 867 Reports submissions that have changed since a previous state. 868 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.4> 869 *) 870 type email_submission_changes_response = { 871 account_id : id; (** The account changes are for *) 872 old_state : string; (** The state provided in the request *) 873 new_state : string; (** The current state on the server *) 874 has_more_changes : bool; (** If true, more changes are available *) 875 created : id list; (** IDs of submissions created since old_state *) 876 updated : id list; (** IDs of submissions updated since old_state *) 877 destroyed : id list; (** IDs of submissions destroyed since old_state *) 878 } 879 880 (** EmailSubmission/query filter condition as defined in RFC8621 Section 5.5. 881 Specifies conditions for filtering email submissions in queries. 882 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.5> 883 *) 884 type email_submission_filter_condition = { 885 identity_id : id option; (** Only include submissions with this identity *) 886 email_id : id option; (** Only include submissions for this email *) 887 thread_id : id option; (** Only include submissions for emails in this thread *) 888 before : utc_date option; (** Only include submissions created before this date-time *) 889 after : utc_date option; (** Only include submissions created after this date-time *) 890 subject : string option; (** Only include submissions with matching subjects *) 891 } 892 893 (** Filter for email submission queries as defined in RFC8621 Section 5.5. 894 Complex filter for EmailSubmission/query method. 895 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.5> 896 *) 897 type email_submission_query_filter = [ 898 | `And of email_submission_query_filter list (** Logical AND of filters *) 899 | `Or of email_submission_query_filter list (** Logical OR of filters *) 900 | `Not of email_submission_query_filter (** Logical NOT of a filter *) 901 | `Condition of email_submission_filter_condition (** Simple condition filter *) 902 ] 903 904 (** EmailSubmission/query request arguments as defined in RFC8621 Section 5.5. 905 Used to query email submissions based on filter criteria. 906 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.5> 907 *) 908 type email_submission_query_arguments = { 909 account_id : id; (** The account to query *) 910 filter : email_submission_query_filter option; (** Filter to match submissions against *) 911 sort : comparator list option; (** Sort criteria *) 912 position : unsigned_int option; (** Zero-based index of first result to return *) 913 anchor : id option; (** ID of submission to use as reference point *) 914 anchor_offset : int_t option; (** Offset from anchor to start returning results *) 915 limit : unsigned_int option; (** Maximum number of results to return *) 916 calculate_total : bool option; (** Whether to calculate the total number of matching submissions *) 917 } 918 919 (** EmailSubmission/query response as defined in RFC8621 Section 5.5. 920 Contains IDs of email submissions matching the query. 921 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.5> 922 *) 923 type email_submission_query_response = { 924 account_id : id; (** The account that was queried *) 925 query_state : string; (** State string for the query results *) 926 can_calculate_changes : bool; (** Whether queryChanges can be used with these results *) 927 position : unsigned_int; (** Zero-based index of the first result *) 928 ids : id list; (** IDs of email submissions matching the query *) 929 total : unsigned_int option; (** Total number of matches if requested *) 930 } 931 932 (** EmailSubmission/set request arguments as defined in RFC8621 Section 5.6. 933 Used to create, update, and destroy email submissions. 934 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.6> 935 *) 936 type email_submission_set_arguments = { 937 account_id : id; (** The account to make changes in *) 938 if_in_state : string option; (** Only apply changes if in this state *) 939 create : (id * email_submission_creation) list option; (** Map of creation IDs to submissions to create *) 940 update : (id * email_submission_update) list option; (** Map of IDs to update properties *) 941 destroy : id list option; (** List of IDs to destroy *) 942 on_success_update_email : (id * email_update) list option; (** Emails to update if submissions succeed *) 943 } 944 945 (** Properties for email submission creation as defined in RFC8621 Section 5.6. 946 Used to create new email submissions. 947 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.6> 948 *) 949 and email_submission_creation = { 950 email_id : id; (** ID of the email to send *) 951 identity_id : id; (** ID of the identity to send from *) 952 envelope : envelope option; (** Custom envelope, if needed *) 953 send_at : utc_date option; (** When to send the email, defaults to now *) 954 } 955 956 (** Properties for email submission update as defined in RFC8621 Section 5.6. 957 Used to update existing email submissions. 958 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.6> 959 *) 960 and email_submission_update = { 961 email_id : id option; (** New email ID to use for this submission *) 962 identity_id : id option; (** New identity ID to use for this submission *) 963 envelope : envelope option; (** New envelope to use for this submission *) 964 undo_status : [`canceled] option; (** Set to cancel a pending submission *) 965 } 966 967 (** EmailSubmission/set response as defined in RFC8621 Section 5.6. 968 Reports the results of email submission changes. 969 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-5.6> 970 *) 971 type email_submission_set_response = { 972 account_id : id; (** The account that was modified *) 973 old_state : string option; (** The state before processing, if changed *) 974 new_state : string; (** The current state on the server *) 975 created : (id * email_submission) list option; (** Map of creation IDs to created submissions *) 976 updated : id list option; (** List of IDs that were successfully updated *) 977 destroyed : id list option; (** List of IDs that were successfully destroyed *) 978 not_created : (id * set_error) list option; (** Map of IDs to errors for failed creates *) 979 not_updated : (id * set_error) list option; (** Map of IDs to errors for failed updates *) 980 not_destroyed : (id * set_error) list option; (** Map of IDs to errors for failed destroys *) 981 } 982 983 (** {1:identity Identity objects} 984 Identity types as defined in RFC8621 Section 6 985 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-6> 986 *) 987 988 (** Identity for sending mail as defined in RFC8621 Section 6. 989 Represents an email identity that can be used to send messages. 990 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-6> 991 *) 992 type identity = { 993 id : id; (** Server-assigned ID for the identity *) 994 name : string; (** Display name for the identity *) 995 email : string; (** Email address for the identity *) 996 reply_to : email_address list option; (** Reply-To addresses to use when sending *) 997 bcc : email_address list option; (** BCC addresses to automatically include *) 998 text_signature : string option; (** Plain text signature for the identity *) 999 html_signature : string option; (** HTML signature for the identity *) 1000 may_delete : bool; (** Whether this identity can be deleted *) 1001 } 1002 1003 (** Identity/get request arguments as defined in RFC8621 Section 6.1. 1004 Used to fetch identities by ID. 1005 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-6.1> 1006 *) 1007 type identity_get_arguments = { 1008 account_id : id; (** The account to fetch identities from *) 1009 ids : id list option; (** The IDs of identities to fetch, null means all *) 1010 properties : string list option; (** Properties to return, null means all *) 1011 } 1012 1013 (** Identity/get response as defined in RFC8621 Section 6.1. 1014 Contains requested identities. 1015 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-6.1> 1016 *) 1017 type identity_get_response = { 1018 account_id : id; (** The account from which identities were fetched *) 1019 state : string; (** A string representing the state on the server *) 1020 list : identity list; (** The list of identities requested *) 1021 not_found : id list; (** IDs requested that could not be found *) 1022 } 1023 1024 (** Identity/changes request arguments as defined in RFC8621 Section 6.2. 1025 Used to get identity changes since a previous state. 1026 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-6.2> 1027 *) 1028 type identity_changes_arguments = { 1029 account_id : id; (** The account to get changes for *) 1030 since_state : string; (** The previous state to compare to *) 1031 max_changes : unsigned_int option; (** Maximum number of changes to return *) 1032 } 1033 1034 (** Identity/changes response as defined in RFC8621 Section 6.2. 1035 Reports identities that have changed since a previous state. 1036 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-6.2> 1037 *) 1038 type identity_changes_response = { 1039 account_id : id; (** The account changes are for *) 1040 old_state : string; (** The state provided in the request *) 1041 new_state : string; (** The current state on the server *) 1042 has_more_changes : bool; (** If true, more changes are available *) 1043 created : id list; (** IDs of identities created since old_state *) 1044 updated : id list; (** IDs of identities updated since old_state *) 1045 destroyed : id list; (** IDs of identities destroyed since old_state *) 1046 } 1047 1048 (** Identity/set request arguments as defined in RFC8621 Section 6.3. 1049 Used to create, update, and destroy identities. 1050 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-6.3> 1051 *) 1052 type identity_set_arguments = { 1053 account_id : id; (** The account to make changes in *) 1054 if_in_state : string option; (** Only apply changes if in this state *) 1055 create : (id * identity_creation) list option; (** Map of creation IDs to identities to create *) 1056 update : (id * identity_update) list option; (** Map of IDs to update properties *) 1057 destroy : id list option; (** List of IDs to destroy *) 1058 } 1059 1060 (** Properties for identity creation as defined in RFC8621 Section 6.3. 1061 Used to create new identities. 1062 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-6.3> 1063 *) 1064 and identity_creation = { 1065 name : string; (** Display name for the identity *) 1066 email : string; (** Email address for the identity *) 1067 reply_to : email_address list option; (** Reply-To addresses to use when sending *) 1068 bcc : email_address list option; (** BCC addresses to automatically include *) 1069 text_signature : string option; (** Plain text signature for the identity *) 1070 html_signature : string option; (** HTML signature for the identity *) 1071 } 1072 1073 (** Properties for identity update as defined in RFC8621 Section 6.3. 1074 Used to update existing identities. 1075 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-6.3> 1076 *) 1077 and identity_update = { 1078 name : string option; (** New display name for the identity *) 1079 email : string option; (** New email address for the identity *) 1080 reply_to : email_address list option; (** New Reply-To addresses to use *) 1081 bcc : email_address list option; (** New BCC addresses to automatically include *) 1082 text_signature : string option; (** New plain text signature *) 1083 html_signature : string option; (** New HTML signature *) 1084 } 1085 1086 (** Identity/set response as defined in RFC8621 Section 6.3. 1087 Reports the results of identity changes. 1088 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-6.3> 1089 *) 1090 type identity_set_response = { 1091 account_id : id; (** The account that was modified *) 1092 old_state : string option; (** The state before processing, if changed *) 1093 new_state : string; (** The current state on the server *) 1094 created : (id * identity) list option; (** Map of creation IDs to created identities *) 1095 updated : id list option; (** List of IDs that were successfully updated *) 1096 destroyed : id list option; (** List of IDs that were successfully destroyed *) 1097 not_created : (id * set_error) list option; (** Map of IDs to errors for failed creates *) 1098 not_updated : (id * set_error) list option; (** Map of IDs to errors for failed updates *) 1099 not_destroyed : (id * set_error) list option; (** Map of IDs to errors for failed destroys *) 1100 } 1101 1102 (** {1:vacation_response VacationResponse objects} 1103 Vacation response types as defined in RFC8621 Section 7 1104 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-7> 1105 *) 1106 1107 (** Vacation auto-reply setting as defined in RFC8621 Section 7. 1108 Represents an automatic vacation/out-of-office response. 1109 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-7> 1110 *) 1111 type vacation_response = { 1112 id : id; (** Server-assigned ID for the vacation response *) 1113 is_enabled : bool; (** Whether the vacation response is active *) 1114 from_date : utc_date option; (** Start date-time of the vacation period *) 1115 to_date : utc_date option; (** End date-time of the vacation period *) 1116 subject : string option; (** Subject line for the vacation response *) 1117 text_body : string option; (** Plain text body for the vacation response *) 1118 html_body : string option; (** HTML body for the vacation response *) 1119 } 1120 1121 (** VacationResponse/get request arguments as defined in RFC8621 Section 7.2. 1122 Used to fetch vacation responses by ID. 1123 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-7.2> 1124 *) 1125 type vacation_response_get_arguments = { 1126 account_id : id; (** The account to fetch vacation responses from *) 1127 ids : id list option; (** The IDs of vacation responses to fetch, null means all *) 1128 properties : string list option; (** Properties to return, null means all *) 1129 } 1130 1131 (** VacationResponse/get response as defined in RFC8621 Section 7.2. 1132 Contains requested vacation responses. 1133 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-7.2> 1134 *) 1135 type vacation_response_get_response = { 1136 account_id : id; (** The account from which vacation responses were fetched *) 1137 state : string; (** A string representing the state on the server *) 1138 list : vacation_response list; (** The list of vacation responses requested *) 1139 not_found : id list; (** IDs requested that could not be found *) 1140 } 1141 1142 (** VacationResponse/set request arguments as defined in RFC8621 Section 7.3. 1143 Used to update vacation responses. 1144 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-7.3> 1145 *) 1146 type vacation_response_set_arguments = { 1147 account_id : id; (** The account to make changes in *) 1148 if_in_state : string option; (** Only apply changes if in this state *) 1149 update : (id * vacation_response_update) list; (** Map of IDs to update properties *) 1150 } 1151 1152 (** Properties for vacation response update as defined in RFC8621 Section 7.3. 1153 Used to update existing vacation responses. 1154 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-7.3> 1155 *) 1156 and vacation_response_update = { 1157 is_enabled : bool option; (** Whether the vacation response is active *) 1158 from_date : utc_date option; (** Start date-time of the vacation period *) 1159 to_date : utc_date option; (** End date-time of the vacation period *) 1160 subject : string option; (** Subject line for the vacation response *) 1161 text_body : string option; (** Plain text body for the vacation response *) 1162 html_body : string option; (** HTML body for the vacation response *) 1163 } 1164 1165 (** VacationResponse/set response as defined in RFC8621 Section 7.3. 1166 Reports the results of vacation response changes. 1167 @see <https://datatracker.ietf.org/doc/html/rfc8621#section-7.3> 1168 *) 1169 type vacation_response_set_response = { 1170 account_id : id; (** The account that was modified *) 1171 old_state : string option; (** The state before processing, if changed *) 1172 new_state : string; (** The current state on the server *) 1173 updated : id list option; (** List of IDs that were successfully updated *) 1174 not_updated : (id * set_error) list option; (** Map of IDs to errors for failed updates *) 1175 } 1176 1177 (** {1:message_flags Message Flags and Mailbox Attributes} 1178 Message flag types as defined in draft-ietf-mailmaint-messageflag-mailboxattribute-02 1179 @see <https://datatracker.ietf.org/doc/html/draft-ietf-mailmaint-messageflag-mailboxattribute> 1180 *) 1181 1182 (** Flag color defined by the combination of MailFlagBit0, MailFlagBit1, and MailFlagBit2 keywords 1183 as defined in draft-ietf-mailmaint-messageflag-mailboxattribute-02 Section 3. 1184 @see <https://datatracker.ietf.org/doc/html/draft-ietf-mailmaint-messageflag-mailboxattribute#section-3> 1185 *) 1186 type flag_color = 1187 | Red (** Bit pattern 000 - default color *) 1188 | Orange (** Bit pattern 100 - MailFlagBit2 set *) 1189 | Yellow (** Bit pattern 010 - MailFlagBit1 set *) 1190 | Green (** Bit pattern 111 - all bits set *) 1191 | Blue (** Bit pattern 001 - MailFlagBit0 set *) 1192 | Purple (** Bit pattern 101 - MailFlagBit2 and MailFlagBit0 set *) 1193 | Gray (** Bit pattern 011 - MailFlagBit1 and MailFlagBit0 set *) 1194 1195 (** Standard message keywords as defined in draft-ietf-mailmaint-messageflag-mailboxattribute-02 Section 4.1. 1196 These are standardized keywords that can be applied to email messages. 1197 @see <https://datatracker.ietf.org/doc/html/draft-ietf-mailmaint-messageflag-mailboxattribute#section-4.1> 1198 *) 1199 type message_keyword = 1200 | Notify (** Indicate a notification should be shown for this message *) 1201 | Muted (** User is not interested in future replies to this thread *) 1202 | Followed (** User is particularly interested in future replies to this thread *) 1203 | Memo (** Message is a note-to-self about another message in the same thread *) 1204 | HasMemo (** Message has an associated memo with the $memo keyword *) 1205 | HasAttachment (** Message has an attachment *) 1206 | HasNoAttachment (** Message does not have an attachment *) 1207 | AutoSent (** Message was sent automatically as a response due to a user rule *) 1208 | Unsubscribed (** User has unsubscribed from the thread this message is in *) 1209 | CanUnsubscribe (** Message has an RFC8058-compliant List-Unsubscribe header *) 1210 | Imported (** Message was imported from another mailbox *) 1211 | IsTrusted (** Server has verified authenticity of the from name and email *) 1212 | MaskedEmail (** Message was received via an alias created for an individual sender *) 1213 | New (** Message should be made more prominent due to a recent action *) 1214 | MailFlagBit0 (** Bit 0 of the 3-bit flag color pattern *) 1215 | MailFlagBit1 (** Bit 1 of the 3-bit flag color pattern *) 1216 | MailFlagBit2 (** Bit 2 of the 3-bit flag color pattern *) 1217 | OtherKeyword of string (** Other non-standard keywords *) 1218 1219 (** Special mailbox attribute names as defined in draft-ietf-mailmaint-messageflag-mailboxattribute-02 Section 4.2. 1220 These are standardized attributes for special-purpose mailboxes. 1221 @see <https://datatracker.ietf.org/doc/html/draft-ietf-mailmaint-messageflag-mailboxattribute#section-4.2> 1222 *) 1223 type mailbox_attribute = 1224 | Snoozed (** Mailbox containing messages that have been snoozed *) 1225 | Scheduled (** Mailbox containing messages scheduled to be sent later *) 1226 | Memos (** Mailbox containing messages with the $memo keyword *) 1227 | OtherAttribute of string (** Other non-standard mailbox attributes *) 1228 1229 (** Convert bit values to a flag color 1230 @param bit0 Value of bit 0 (least significant bit) 1231 @param bit1 Value of bit 1 1232 @param bit2 Value of bit 2 (most significant bit) 1233 @return The corresponding flag color 1234 *) 1235 val flag_color_of_bits : bool -> bool -> bool -> flag_color 1236 1237 (** Get the bit values for a flag color 1238 @param color The flag color 1239 @return Tuple of (bit2, bit1, bit0) values 1240 *) 1241 val bits_of_flag_color : flag_color -> bool * bool * bool 1242 1243 (** Check if a message has a flag color based on its keywords 1244 @param keywords The list of keywords for the message 1245 @return True if the message has one or more flag color bits set 1246 *) 1247 val has_flag_color : (keyword * bool) list -> bool 1248 1249 (** Get the flag color from a message's keywords, if present 1250 @param keywords The list of keywords for the message 1251 @return The flag color if all required bits are present, None otherwise 1252 *) 1253 val get_flag_color : (keyword * bool) list -> flag_color option 1254 1255 (** Convert a message keyword to its string representation 1256 @param keyword The message keyword 1257 @return String representation with $ prefix (e.g., "$notify") 1258 *) 1259 val string_of_message_keyword : message_keyword -> string 1260 1261 (** Parse a string into a message keyword 1262 @param s The string to parse (with or without $ prefix) 1263 @return The corresponding message keyword 1264 *) 1265 val message_keyword_of_string : string -> message_keyword 1266 1267 (** Convert a mailbox attribute to its string representation 1268 @param attr The mailbox attribute 1269 @return String representation with $ prefix (e.g., "$snoozed") 1270 *) 1271 val string_of_mailbox_attribute : mailbox_attribute -> string 1272 1273 (** Parse a string into a mailbox attribute 1274 @param s The string to parse (with or without $ prefix) 1275 @return The corresponding mailbox attribute 1276 *) 1277 val mailbox_attribute_of_string : string -> mailbox_attribute 1278 1279 (** Get a human-readable representation of a flag color 1280 @param color The flag color 1281 @return Human-readable name of the color 1282 *) 1283 val human_readable_flag_color : flag_color -> string 1284 1285 (** Get a human-readable representation of a message keyword 1286 @param keyword The message keyword 1287 @return Human-readable description of the keyword 1288 *) 1289 val human_readable_message_keyword : message_keyword -> string 1290 1291 (** Format email keywords into a human-readable string representation 1292 @param keywords The list of keywords and their values 1293 @return Human-readable comma-separated list of keywords 1294 *) 1295 val format_email_keywords : (keyword * bool) list -> string 1296end 1297 1298(** {1 JSON serialization} 1299 Functions for serializing and deserializing JMAP Mail objects to/from JSON 1300*) 1301 1302module Json : sig 1303 open Types 1304 1305 (** {2 Helper functions for serialization} 1306 Utility functions for converting between OCaml types and JSON representation 1307 *) 1308 1309 (** Convert a mailbox role to its string representation 1310 @param role The mailbox role 1311 @return String representation (e.g., "inbox", "drafts", etc.) 1312 *) 1313 val string_of_mailbox_role : mailbox_role -> string 1314 1315 (** Parse a string into a mailbox role 1316 @param s The string to parse 1317 @return The corresponding mailbox role, or Unknown if not recognized 1318 *) 1319 val mailbox_role_of_string : string -> mailbox_role 1320 1321 (** Convert an email keyword to its string representation 1322 @param keyword The email keyword 1323 @return String representation with $ prefix (e.g., "$flagged") 1324 *) 1325 val string_of_keyword : keyword -> string 1326 1327 (** Parse a string into an email keyword 1328 @param s The string to parse (with or without $ prefix) 1329 @return The corresponding email keyword 1330 *) 1331 val keyword_of_string : string -> keyword 1332 1333 (** {2 Mailbox serialization} 1334 Functions for serializing and deserializing mailbox objects 1335 *) 1336 1337 (** TODO:claude - Need to implement all JSON serialization functions 1338 for each type we've defined. This would be a substantial amount of 1339 code and likely require additional understanding of the ezjsonm API. 1340 1341 The interface would include functions like: 1342 1343 val mailbox_to_json : mailbox -> Ezjsonm.value 1344 val mailbox_of_json : Ezjsonm.value -> mailbox result 1345 1346 And similarly for all other types. 1347 *) 1348end 1349 1350(** {1 API functions} 1351 High-level functions for interacting with JMAP Mail servers 1352*) 1353 1354(** Authentication credentials for a JMAP server *) 1355type credentials = { 1356 username: string; (** Username for authentication *) 1357 password: string; (** Password for authentication *) 1358} 1359 1360(** Connection to a JMAP mail server *) 1361type connection = { 1362 session: Jmap.Types.session; (** Session information from the server *) 1363 config: Jmap.Api.config; (** Configuration for API requests *) 1364} 1365 1366(** Login to a JMAP server and establish a connection 1367 @param uri The URI of the JMAP server 1368 @param credentials Authentication credentials 1369 @return A connection object if successful 1370 1371 Creates a new connection to a JMAP server using username/password authentication. 1372*) 1373val login : 1374 uri:string -> 1375 credentials:credentials -> 1376 (connection, Jmap.Api.error) result Lwt.t 1377 1378(** Login to a JMAP server using an API token 1379 @param uri The URI of the JMAP server 1380 @param api_token The API token for authentication 1381 @return A connection object if successful 1382 1383 Creates a new connection to a JMAP server using Bearer token authentication. 1384*) 1385val login_with_token : 1386 uri:string -> 1387 api_token:string -> 1388 (connection, Jmap.Api.error) result Lwt.t 1389 1390(** Get all mailboxes for an account 1391 @param conn The JMAP connection 1392 @param account_id The account ID to get mailboxes for 1393 @return A list of mailboxes if successful 1394 1395 Retrieves all mailboxes (folders) in the specified account. 1396*) 1397val get_mailboxes : 1398 connection -> 1399 account_id:Jmap.Types.id -> 1400 (Types.mailbox list, Jmap.Api.error) result Lwt.t 1401 1402(** Get a specific mailbox by ID 1403 @param conn The JMAP connection 1404 @param account_id The account ID 1405 @param mailbox_id The mailbox ID to retrieve 1406 @return The mailbox if found 1407 1408 Retrieves a single mailbox by its ID. 1409*) 1410val get_mailbox : 1411 connection -> 1412 account_id:Jmap.Types.id -> 1413 mailbox_id:Jmap.Types.id -> 1414 (Types.mailbox, Jmap.Api.error) result Lwt.t 1415 1416(** Get messages in a mailbox 1417 @param conn The JMAP connection 1418 @param account_id The account ID 1419 @param mailbox_id The mailbox ID to get messages from 1420 @param limit Optional limit on number of messages to return 1421 @return The list of email messages if successful 1422 1423 Retrieves email messages in the specified mailbox, with optional limit. 1424*) 1425val get_messages_in_mailbox : 1426 connection -> 1427 account_id:Jmap.Types.id -> 1428 mailbox_id:Jmap.Types.id -> 1429 ?limit:int -> 1430 unit -> 1431 (Types.email list, Jmap.Api.error) result Lwt.t 1432 1433(** Get a single email message by ID 1434 @param conn The JMAP connection 1435 @param account_id The account ID 1436 @param email_id The email ID to retrieve 1437 @return The email message if found 1438 1439 Retrieves a single email message by its ID. 1440*) 1441val get_email : 1442 connection -> 1443 account_id:Jmap.Types.id -> 1444 email_id:Jmap.Types.id -> 1445 (Types.email, Jmap.Api.error) result Lwt.t 1446 1447(** Check if an email has a specific message keyword 1448 @param email The email to check 1449 @param keyword The message keyword to look for 1450 @return true if the email has the keyword, false otherwise 1451 1452 Tests whether an email has a particular keyword (flag) set. 1453*) 1454val has_message_keyword : 1455 Types.email -> 1456 Types.message_keyword -> 1457 bool 1458 1459(** Add a message keyword to an email 1460 @param conn The JMAP connection 1461 @param account_id The account ID 1462 @param email_id The email ID 1463 @param keyword The message keyword to add 1464 @return Success or error 1465 1466 Adds a keyword (flag) to an email message. 1467*) 1468val add_message_keyword : 1469 connection -> 1470 account_id:Jmap.Types.id -> 1471 email_id:Jmap.Types.id -> 1472 keyword:Types.message_keyword -> 1473 (unit, Jmap.Api.error) result Lwt.t 1474 1475(** Set a flag color for an email 1476 @param conn The JMAP connection 1477 @param account_id The account ID 1478 @param email_id The email ID 1479 @param color The flag color to set 1480 @return Success or error 1481 1482 Sets a flag color on an email message by setting the appropriate bit flags. 1483*) 1484val set_flag_color : 1485 connection -> 1486 account_id:Jmap.Types.id -> 1487 email_id:Jmap.Types.id -> 1488 color:Types.flag_color -> 1489 (unit, Jmap.Api.error) result Lwt.t 1490 1491(** Convert an email's keywords to typed message_keyword list 1492 @param email The email to analyze 1493 @return List of message keywords 1494 1495 Extracts all message keywords from an email's keyword list. 1496*) 1497val get_message_keywords : 1498 Types.email -> 1499 Types.message_keyword list 1500 1501(** Get emails with a specific message keyword 1502 @param conn The JMAP connection 1503 @param account_id The account ID 1504 @param keyword The message keyword to search for 1505 @param limit Optional limit on number of emails to return 1506 @return List of emails with the keyword if successful 1507 1508 Retrieves all emails that have a specific keyword (flag) set. 1509*) 1510val get_emails_with_keyword : 1511 connection -> 1512 account_id:Jmap.Types.id -> 1513 keyword:Types.message_keyword -> 1514 ?limit:int -> 1515 unit -> 1516 (Types.email list, Jmap.Api.error) result Lwt.t 1517 1518(** {1 Email Address Utilities} 1519 Utilities for working with email addresses 1520*) 1521 1522(** Check if an email address matches a filter string 1523 @param email The email address to check 1524 @param pattern The filter pattern to match against 1525 @return True if the email address matches the filter 1526 1527 The filter supports simple wildcards: 1528 - "*" matches any sequence of characters 1529 - "?" matches any single character 1530 - Case-insensitive matching is used 1531 - If no wildcards are present, substring matching is used 1532*) 1533val email_address_matches : string -> string -> bool 1534 1535(** Check if an email matches a sender filter 1536 @param email The email object to check 1537 @param pattern The sender filter pattern 1538 @return True if any sender address matches the filter 1539 1540 Tests whether any of an email's sender addresses match the provided pattern. 1541*) 1542val email_matches_sender : Types.email -> string -> bool