This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

1(** Implementation of the JMAP Mail extension, as defined in RFC8621 *) 2 3(** Module for managing JMAP Mail-specific capability URIs *) 4module Capability : sig 5 (** Mail capability URI *) 6 val mail_uri : string 7 8 (** Submission capability URI *) 9 val submission_uri : string 10 11 (** Vacation response capability URI *) 12 val vacation_response_uri : string 13 14 (** All mail extension capability types *) 15 type t = 16 | Mail (** Mail capability *) 17 | Submission (** Submission capability *) 18 | VacationResponse (** Vacation response capability *) 19 | Extension of string (** Custom extension *) 20 21 (** Convert capability to URI string *) 22 val to_string : t -> string 23 24 (** Parse a string to a capability *) 25 val of_string : string -> t 26 27 (** Check if a capability is a standard mail capability *) 28 val is_standard : t -> bool 29 30 (** Check if a capability string is a standard mail capability *) 31 val is_standard_string : string -> bool 32 33 (** Create a list of capability strings *) 34 val strings_of_capabilities : t list -> string list 35end 36 37(** Types for the JMAP Mail extension *) 38module Types : sig 39 open Jmap.Types 40 41 (** {1 Mail capabilities} *) 42 43 (** Capability URI for JMAP Mail*) 44 val capability_mail : string 45 46 (** Capability URI for JMAP Submission *) 47 val capability_submission : string 48 49 (** Capability URI for JMAP Vacation Response *) 50 val capability_vacation_response : string 51 52 (** {1:mailbox Mailbox objects} *) 53 54 (** A role for a mailbox. See RFC8621 Section 2. *) 55 type mailbox_role = 56 | All (** All mail *) 57 | Archive (** Archived mail *) 58 | Drafts (** Draft messages *) 59 | Flagged (** Starred/flagged mail *) 60 | Important (** Important mail *) 61 | Inbox (** Inbox *) 62 | Junk (** Spam/Junk mail *) 63 | Sent (** Sent mail *) 64 | Trash (** Deleted/Trash mail *) 65 | Unknown of string (** Server-specific roles *) 66 67 (** A mailbox (folder) in a mail account. See RFC8621 Section 2. *) 68 type mailbox = { 69 id : id; 70 name : string; 71 parent_id : id option; 72 role : mailbox_role option; 73 sort_order : unsigned_int; 74 total_emails : unsigned_int; 75 unread_emails : unsigned_int; 76 total_threads : unsigned_int; 77 unread_threads : unsigned_int; 78 is_subscribed : bool; 79 my_rights : mailbox_rights; 80 } 81 82 (** Rights for a mailbox. See RFC8621 Section 2. *) 83 and mailbox_rights = { 84 may_read_items : bool; 85 may_add_items : bool; 86 may_remove_items : bool; 87 may_set_seen : bool; 88 may_set_keywords : bool; 89 may_create_child : bool; 90 may_rename : bool; 91 may_delete : bool; 92 may_submit : bool; 93 } 94 95 (** Filter condition for mailbox queries. See RFC8621 Section 2.3. *) 96 type mailbox_filter_condition = { 97 parent_id : id option; 98 name : string option; 99 role : string option; 100 has_any_role : bool option; 101 is_subscribed : bool option; 102 } 103 104 type mailbox_query_filter = [ 105 | `And of mailbox_query_filter list 106 | `Or of mailbox_query_filter list 107 | `Not of mailbox_query_filter 108 | `Condition of mailbox_filter_condition 109 ] 110 111 (** Mailbox/get request arguments. See RFC8621 Section 2.1. *) 112 type mailbox_get_arguments = { 113 account_id : id; 114 ids : id list option; 115 properties : string list option; 116 } 117 118 (** Mailbox/get response. See RFC8621 Section 2.1. *) 119 type mailbox_get_response = { 120 account_id : id; 121 state : string; 122 list : mailbox list; 123 not_found : id list; 124 } 125 126 (** Mailbox/changes request arguments. See RFC8621 Section 2.2. *) 127 type mailbox_changes_arguments = { 128 account_id : id; 129 since_state : string; 130 max_changes : unsigned_int option; 131 } 132 133 (** Mailbox/changes response. See RFC8621 Section 2.2. *) 134 type mailbox_changes_response = { 135 account_id : id; 136 old_state : string; 137 new_state : string; 138 has_more_changes : bool; 139 created : id list; 140 updated : id list; 141 destroyed : id list; 142 } 143 144 (** Mailbox/query request arguments. See RFC8621 Section 2.3. *) 145 type mailbox_query_arguments = { 146 account_id : id; 147 filter : mailbox_query_filter option; 148 sort : [ `name | `role | `sort_order ] list option; 149 limit : unsigned_int option; 150 } 151 152 (** Mailbox/query response. See RFC8621 Section 2.3. *) 153 type mailbox_query_response = { 154 account_id : id; 155 query_state : string; 156 can_calculate_changes : bool; 157 position : unsigned_int; 158 ids : id list; 159 total : unsigned_int option; 160 } 161 162 (** Mailbox/queryChanges request arguments. See RFC8621 Section 2.4. *) 163 type mailbox_query_changes_arguments = { 164 account_id : id; 165 filter : mailbox_query_filter option; 166 sort : [ `name | `role | `sort_order ] list option; 167 since_query_state : string; 168 max_changes : unsigned_int option; 169 up_to_id : id option; 170 } 171 172 (** Mailbox/queryChanges response. See RFC8621 Section 2.4. *) 173 type mailbox_query_changes_response = { 174 account_id : id; 175 old_query_state : string; 176 new_query_state : string; 177 total : unsigned_int option; 178 removed : id list; 179 added : mailbox_query_changes_added list; 180 } 181 182 and mailbox_query_changes_added = { 183 id : id; 184 index : unsigned_int; 185 } 186 187 (** Mailbox/set request arguments. See RFC8621 Section 2.5. *) 188 type mailbox_set_arguments = { 189 account_id : id; 190 if_in_state : string option; 191 create : (id * mailbox_creation) list option; 192 update : (id * mailbox_update) list option; 193 destroy : id list option; 194 } 195 196 and mailbox_creation = { 197 name : string; 198 parent_id : id option; 199 role : string option; 200 sort_order : unsigned_int option; 201 is_subscribed : bool option; 202 } 203 204 and mailbox_update = { 205 name : string option; 206 parent_id : id option; 207 role : string option; 208 sort_order : unsigned_int option; 209 is_subscribed : bool option; 210 } 211 212 (** Mailbox/set response. See RFC8621 Section 2.5. *) 213 type mailbox_set_response = { 214 account_id : id; 215 old_state : string option; 216 new_state : string; 217 created : (id * mailbox) list option; 218 updated : id list option; 219 destroyed : id list option; 220 not_created : (id * set_error) list option; 221 not_updated : (id * set_error) list option; 222 not_destroyed : (id * set_error) list option; 223 } 224 225 (** {1:thread Thread objects} *) 226 227 (** A thread in a mail account. See RFC8621 Section 3. *) 228 type thread = { 229 id : id; 230 email_ids : id list; 231 } 232 233 (** Thread/get request arguments. See RFC8621 Section 3.1. *) 234 type thread_get_arguments = { 235 account_id : id; 236 ids : id list option; 237 properties : string list option; 238 } 239 240 (** Thread/get response. See RFC8621 Section 3.1. *) 241 type thread_get_response = { 242 account_id : id; 243 state : string; 244 list : thread list; 245 not_found : id list; 246 } 247 248 (** Thread/changes request arguments. See RFC8621 Section 3.2. *) 249 type thread_changes_arguments = { 250 account_id : id; 251 since_state : string; 252 max_changes : unsigned_int option; 253 } 254 255 (** Thread/changes response. See RFC8621 Section 3.2. *) 256 type thread_changes_response = { 257 account_id : id; 258 old_state : string; 259 new_state : string; 260 has_more_changes : bool; 261 created : id list; 262 updated : id list; 263 destroyed : id list; 264 } 265 266 (** {1:email Email objects} *) 267 268 (** Addressing (mailbox) information. See RFC8621 Section 4.1.1. *) 269 type email_address = { 270 name : string option; 271 email : string; 272 parameters : (string * string) list; 273 } 274 275 (** Message header field. See RFC8621 Section 4.1.2. *) 276 type header = { 277 name : string; 278 value : string; 279 } 280 281 (** Email keyword (flag). See RFC8621 Section 4.3. *) 282 type keyword = 283 | Flagged 284 | Answered 285 | Draft 286 | Forwarded 287 | Phishing 288 | Junk 289 | NotJunk 290 | Seen 291 | Unread 292 | Custom of string 293 294 (** Email message. See RFC8621 Section 4. *) 295 type email = { 296 id : id; 297 blob_id : id; 298 thread_id : id; 299 mailbox_ids : (id * bool) list; 300 keywords : (keyword * bool) list; 301 size : unsigned_int; 302 received_at : utc_date; 303 message_id : string list; 304 in_reply_to : string list option; 305 references : string list option; 306 sender : email_address list option; 307 from : email_address list option; 308 to_ : email_address list option; 309 cc : email_address list option; 310 bcc : email_address list option; 311 reply_to : email_address list option; 312 subject : string option; 313 sent_at : utc_date option; 314 has_attachment : bool option; 315 preview : string option; 316 body_values : (string * string) list option; 317 text_body : email_body_part list option; 318 html_body : email_body_part list option; 319 attachments : email_body_part list option; 320 headers : header list option; 321 } 322 323 (** Email body part. See RFC8621 Section 4.1.4. *) 324 and email_body_part = { 325 part_id : string option; 326 blob_id : id option; 327 size : unsigned_int option; 328 headers : header list option; 329 name : string option; 330 type_ : string option; 331 charset : string option; 332 disposition : string option; 333 cid : string option; 334 language : string list option; 335 location : string option; 336 sub_parts : email_body_part list option; 337 header_parameter_name : string option; 338 header_parameter_value : string option; 339 } 340 341 (** Email query filter condition. See RFC8621 Section 4.4. *) 342 type email_filter_condition = { 343 in_mailbox : id option; 344 in_mailbox_other_than : id list option; 345 min_size : unsigned_int option; 346 max_size : unsigned_int option; 347 before : utc_date option; 348 after : utc_date option; 349 header : (string * string) option; 350 from : string option; 351 to_ : string option; 352 cc : string option; 353 bcc : string option; 354 subject : string option; 355 body : string option; 356 has_keyword : string option; 357 not_keyword : string option; 358 has_attachment : bool option; 359 text : string option; 360 } 361 362 type email_query_filter = [ 363 | `And of email_query_filter list 364 | `Or of email_query_filter list 365 | `Not of email_query_filter 366 | `Condition of email_filter_condition 367 ] 368 369 (** Email/get request arguments. See RFC8621 Section 4.5. *) 370 type email_get_arguments = { 371 account_id : id; 372 ids : id list option; 373 properties : string list option; 374 body_properties : string list option; 375 fetch_text_body_values : bool option; 376 fetch_html_body_values : bool option; 377 fetch_all_body_values : bool option; 378 max_body_value_bytes : unsigned_int option; 379 } 380 381 (** Email/get response. See RFC8621 Section 4.5. *) 382 type email_get_response = { 383 account_id : id; 384 state : string; 385 list : email list; 386 not_found : id list; 387 } 388 389 (** Email/changes request arguments. See RFC8621 Section 4.6. *) 390 type email_changes_arguments = { 391 account_id : id; 392 since_state : string; 393 max_changes : unsigned_int option; 394 } 395 396 (** Email/changes response. See RFC8621 Section 4.6. *) 397 type email_changes_response = { 398 account_id : id; 399 old_state : string; 400 new_state : string; 401 has_more_changes : bool; 402 created : id list; 403 updated : id list; 404 destroyed : id list; 405 } 406 407 (** Email/query request arguments. See RFC8621 Section 4.4. *) 408 type email_query_arguments = { 409 account_id : id; 410 filter : email_query_filter option; 411 sort : comparator list option; 412 collapse_threads : bool option; 413 position : unsigned_int option; 414 anchor : id option; 415 anchor_offset : int_t option; 416 limit : unsigned_int option; 417 calculate_total : bool option; 418 } 419 420 (** Email/query response. See RFC8621 Section 4.4. *) 421 type email_query_response = { 422 account_id : id; 423 query_state : string; 424 can_calculate_changes : bool; 425 position : unsigned_int; 426 ids : id list; 427 total : unsigned_int option; 428 thread_ids : id list option; 429 } 430 431 (** Email/queryChanges request arguments. See RFC8621 Section 4.7. *) 432 type email_query_changes_arguments = { 433 account_id : id; 434 filter : email_query_filter option; 435 sort : comparator list option; 436 collapse_threads : bool option; 437 since_query_state : string; 438 max_changes : unsigned_int option; 439 up_to_id : id option; 440 } 441 442 (** Email/queryChanges response. See RFC8621 Section 4.7. *) 443 type email_query_changes_response = { 444 account_id : id; 445 old_query_state : string; 446 new_query_state : string; 447 total : unsigned_int option; 448 removed : id list; 449 added : email_query_changes_added list; 450 } 451 452 and email_query_changes_added = { 453 id : id; 454 index : unsigned_int; 455 } 456 457 (** Email/set request arguments. See RFC8621 Section 4.8. *) 458 type email_set_arguments = { 459 account_id : id; 460 if_in_state : string option; 461 create : (id * email_creation) list option; 462 update : (id * email_update) list option; 463 destroy : id list option; 464 } 465 466 and email_creation = { 467 mailbox_ids : (id * bool) list; 468 keywords : (keyword * bool) list option; 469 received_at : utc_date option; 470 message_id : string list option; 471 in_reply_to : string list option; 472 references : string list option; 473 sender : email_address list option; 474 from : email_address list option; 475 to_ : email_address list option; 476 cc : email_address list option; 477 bcc : email_address list option; 478 reply_to : email_address list option; 479 subject : string option; 480 body_values : (string * string) list option; 481 text_body : email_body_part list option; 482 html_body : email_body_part list option; 483 attachments : email_body_part list option; 484 headers : header list option; 485 } 486 487 and email_update = { 488 keywords : (keyword * bool) list option; 489 mailbox_ids : (id * bool) list option; 490 } 491 492 (** Email/set response. See RFC8621 Section 4.8. *) 493 type email_set_response = { 494 account_id : id; 495 old_state : string option; 496 new_state : string; 497 created : (id * email) list option; 498 updated : id list option; 499 destroyed : id list option; 500 not_created : (id * set_error) list option; 501 not_updated : (id * set_error) list option; 502 not_destroyed : (id * set_error) list option; 503 } 504 505 (** Email/copy request arguments. See RFC8621 Section 4.9. *) 506 type email_copy_arguments = { 507 from_account_id : id; 508 account_id : id; 509 create : (id * email_creation) list; 510 on_success_destroy_original : bool option; 511 } 512 513 (** Email/copy response. See RFC8621 Section 4.9. *) 514 type email_copy_response = { 515 from_account_id : id; 516 account_id : id; 517 created : (id * email) list option; 518 not_created : (id * set_error) list option; 519 } 520 521 (** Email/import request arguments. See RFC8621 Section 4.10. *) 522 type email_import_arguments = { 523 account_id : id; 524 emails : (id * email_import) list; 525 } 526 527 and email_import = { 528 blob_id : id; 529 mailbox_ids : (id * bool) list; 530 keywords : (keyword * bool) list option; 531 received_at : utc_date option; 532 } 533 534 (** Email/import response. See RFC8621 Section 4.10. *) 535 type email_import_response = { 536 account_id : id; 537 created : (id * email) list option; 538 not_created : (id * set_error) list option; 539 } 540 541 (** {1:search_snippet Search snippets} *) 542 543 (** SearchSnippet/get request arguments. See RFC8621 Section 4.11. *) 544 type search_snippet_get_arguments = { 545 account_id : id; 546 email_ids : id list; 547 filter : email_filter_condition; 548 } 549 550 (** SearchSnippet/get response. See RFC8621 Section 4.11. *) 551 type search_snippet_get_response = { 552 account_id : id; 553 list : (id * search_snippet) list; 554 not_found : id list; 555 } 556 557 and search_snippet = { 558 subject : string option; 559 preview : string option; 560 } 561 562 (** {1:submission EmailSubmission objects} *) 563 564 (** EmailSubmission address. See RFC8621 Section 5.1. *) 565 type submission_address = { 566 email : string; 567 parameters : (string * string) list option; 568 } 569 570 (** Email submission object. See RFC8621 Section 5.1. *) 571 type email_submission = { 572 id : id; 573 identity_id : id; 574 email_id : id; 575 thread_id : id; 576 envelope : envelope option; 577 send_at : utc_date option; 578 undo_status : [ 579 | `pending 580 | `final 581 | `canceled 582 ] option; 583 delivery_status : (string * submission_status) list option; 584 dsn_blob_ids : (string * id) list option; 585 mdn_blob_ids : (string * id) list option; 586 } 587 588 (** Envelope for mail submission. See RFC8621 Section 5.1. *) 589 and envelope = { 590 mail_from : submission_address; 591 rcpt_to : submission_address list; 592 } 593 594 (** Delivery status for submitted email. See RFC8621 Section 5.1. *) 595 and submission_status = { 596 smtp_reply : string; 597 delivered : string option; 598 } 599 600 (** EmailSubmission/get request arguments. See RFC8621 Section 5.3. *) 601 type email_submission_get_arguments = { 602 account_id : id; 603 ids : id list option; 604 properties : string list option; 605 } 606 607 (** EmailSubmission/get response. See RFC8621 Section 5.3. *) 608 type email_submission_get_response = { 609 account_id : id; 610 state : string; 611 list : email_submission list; 612 not_found : id list; 613 } 614 615 (** EmailSubmission/changes request arguments. See RFC8621 Section 5.4. *) 616 type email_submission_changes_arguments = { 617 account_id : id; 618 since_state : string; 619 max_changes : unsigned_int option; 620 } 621 622 (** EmailSubmission/changes response. See RFC8621 Section 5.4. *) 623 type email_submission_changes_response = { 624 account_id : id; 625 old_state : string; 626 new_state : string; 627 has_more_changes : bool; 628 created : id list; 629 updated : id list; 630 destroyed : id list; 631 } 632 633 (** EmailSubmission/query filter condition. See RFC8621 Section 5.5. *) 634 type email_submission_filter_condition = { 635 identity_id : id option; 636 email_id : id option; 637 thread_id : id option; 638 before : utc_date option; 639 after : utc_date option; 640 subject : string option; 641 } 642 643 type email_submission_query_filter = [ 644 | `And of email_submission_query_filter list 645 | `Or of email_submission_query_filter list 646 | `Not of email_submission_query_filter 647 | `Condition of email_submission_filter_condition 648 ] 649 650 (** EmailSubmission/query request arguments. See RFC8621 Section 5.5. *) 651 type email_submission_query_arguments = { 652 account_id : id; 653 filter : email_submission_query_filter option; 654 sort : comparator list option; 655 position : unsigned_int option; 656 anchor : id option; 657 anchor_offset : int_t option; 658 limit : unsigned_int option; 659 calculate_total : bool option; 660 } 661 662 (** EmailSubmission/query response. See RFC8621 Section 5.5. *) 663 type email_submission_query_response = { 664 account_id : id; 665 query_state : string; 666 can_calculate_changes : bool; 667 position : unsigned_int; 668 ids : id list; 669 total : unsigned_int option; 670 } 671 672 (** EmailSubmission/set request arguments. See RFC8621 Section 5.6. *) 673 type email_submission_set_arguments = { 674 account_id : id; 675 if_in_state : string option; 676 create : (id * email_submission_creation) list option; 677 update : (id * email_submission_update) list option; 678 destroy : id list option; 679 on_success_update_email : (id * email_update) list option; 680 } 681 682 and email_submission_creation = { 683 email_id : id; 684 identity_id : id; 685 envelope : envelope option; 686 send_at : utc_date option; 687 } 688 689 and email_submission_update = { 690 email_id : id option; 691 identity_id : id option; 692 envelope : envelope option; 693 undo_status : [`canceled] option; 694 } 695 696 (** EmailSubmission/set response. See RFC8621 Section 5.6. *) 697 type email_submission_set_response = { 698 account_id : id; 699 old_state : string option; 700 new_state : string; 701 created : (id * email_submission) list option; 702 updated : id list option; 703 destroyed : id list option; 704 not_created : (id * set_error) list option; 705 not_updated : (id * set_error) list option; 706 not_destroyed : (id * set_error) list option; 707 } 708 709 (** {1:identity Identity objects} *) 710 711 (** Identity for sending mail. See RFC8621 Section 6. *) 712 type identity = { 713 id : id; 714 name : string; 715 email : string; 716 reply_to : email_address list option; 717 bcc : email_address list option; 718 text_signature : string option; 719 html_signature : string option; 720 may_delete : bool; 721 } 722 723 (** Identity/get request arguments. See RFC8621 Section 6.1. *) 724 type identity_get_arguments = { 725 account_id : id; 726 ids : id list option; 727 properties : string list option; 728 } 729 730 (** Identity/get response. See RFC8621 Section 6.1. *) 731 type identity_get_response = { 732 account_id : id; 733 state : string; 734 list : identity list; 735 not_found : id list; 736 } 737 738 (** Identity/changes request arguments. See RFC8621 Section 6.2. *) 739 type identity_changes_arguments = { 740 account_id : id; 741 since_state : string; 742 max_changes : unsigned_int option; 743 } 744 745 (** Identity/changes response. See RFC8621 Section 6.2. *) 746 type identity_changes_response = { 747 account_id : id; 748 old_state : string; 749 new_state : string; 750 has_more_changes : bool; 751 created : id list; 752 updated : id list; 753 destroyed : id list; 754 } 755 756 (** Identity/set request arguments. See RFC8621 Section 6.3. *) 757 type identity_set_arguments = { 758 account_id : id; 759 if_in_state : string option; 760 create : (id * identity_creation) list option; 761 update : (id * identity_update) list option; 762 destroy : id list option; 763 } 764 765 and identity_creation = { 766 name : string; 767 email : string; 768 reply_to : email_address list option; 769 bcc : email_address list option; 770 text_signature : string option; 771 html_signature : string option; 772 } 773 774 and identity_update = { 775 name : string option; 776 email : string option; 777 reply_to : email_address list option; 778 bcc : email_address list option; 779 text_signature : string option; 780 html_signature : string option; 781 } 782 783 (** Identity/set response. See RFC8621 Section 6.3. *) 784 type identity_set_response = { 785 account_id : id; 786 old_state : string option; 787 new_state : string; 788 created : (id * identity) list option; 789 updated : id list option; 790 destroyed : id list option; 791 not_created : (id * set_error) list option; 792 not_updated : (id * set_error) list option; 793 not_destroyed : (id * set_error) list option; 794 } 795 796 (** {1:vacation_response VacationResponse objects} *) 797 798 (** Vacation auto-reply setting. See RFC8621 Section 7. *) 799 type vacation_response = { 800 id : id; 801 is_enabled : bool; 802 from_date : utc_date option; 803 to_date : utc_date option; 804 subject : string option; 805 text_body : string option; 806 html_body : string option; 807 } 808 809 (** VacationResponse/get request arguments. See RFC8621 Section 7.2. *) 810 type vacation_response_get_arguments = { 811 account_id : id; 812 ids : id list option; 813 properties : string list option; 814 } 815 816 (** VacationResponse/get response. See RFC8621 Section 7.2. *) 817 type vacation_response_get_response = { 818 account_id : id; 819 state : string; 820 list : vacation_response list; 821 not_found : id list; 822 } 823 824 (** VacationResponse/set request arguments. See RFC8621 Section 7.3. *) 825 type vacation_response_set_arguments = { 826 account_id : id; 827 if_in_state : string option; 828 update : (id * vacation_response_update) list; 829 } 830 831 and vacation_response_update = { 832 is_enabled : bool option; 833 from_date : utc_date option; 834 to_date : utc_date option; 835 subject : string option; 836 text_body : string option; 837 html_body : string option; 838 } 839 840 (** VacationResponse/set response. See RFC8621 Section 7.3. *) 841 type vacation_response_set_response = { 842 account_id : id; 843 old_state : string option; 844 new_state : string; 845 updated : id list option; 846 not_updated : (id * set_error) list option; 847 } 848 849 (** {1:message_flags Message Flags and Mailbox Attributes} *) 850 851 (** Flag color defined by the combination of MailFlagBit0, MailFlagBit1, and MailFlagBit2 keywords *) 852 type flag_color = 853 | Red (** Bit pattern 000 *) 854 | Orange (** Bit pattern 100 *) 855 | Yellow (** Bit pattern 010 *) 856 | Green (** Bit pattern 111 *) 857 | Blue (** Bit pattern 001 *) 858 | Purple (** Bit pattern 101 *) 859 | Gray (** Bit pattern 011 *) 860 861 (** Standard message keywords as defined in draft-ietf-mailmaint-messageflag-mailboxattribute-02 *) 862 type message_keyword = 863 | Notify (** Indicate a notification should be shown for this message *) 864 | Muted (** User is not interested in future replies to this thread *) 865 | Followed (** User is particularly interested in future replies to this thread *) 866 | Memo (** Message is a note-to-self about another message in the same thread *) 867 | HasMemo (** Message has an associated memo with the $memo keyword *) 868 | HasAttachment (** Message has an attachment *) 869 | HasNoAttachment (** Message does not have an attachment *) 870 | AutoSent (** Message was sent automatically as a response due to a user rule *) 871 | Unsubscribed (** User has unsubscribed from the thread this message is in *) 872 | CanUnsubscribe (** Message has an RFC8058-compliant List-Unsubscribe header *) 873 | Imported (** Message was imported from another mailbox *) 874 | IsTrusted (** Server has verified authenticity of the from name and email *) 875 | MaskedEmail (** Message was received via an alias created for an individual sender *) 876 | New (** Message should be made more prominent due to a recent action *) 877 | MailFlagBit0 (** Bit 0 of the 3-bit flag color pattern *) 878 | MailFlagBit1 (** Bit 1 of the 3-bit flag color pattern *) 879 | MailFlagBit2 (** Bit 2 of the 3-bit flag color pattern *) 880 | OtherKeyword of string (** Other non-standard keywords *) 881 882 (** Special mailbox attribute names as defined in draft-ietf-mailmaint-messageflag-mailboxattribute-02 *) 883 type mailbox_attribute = 884 | Snoozed (** Mailbox containing messages that have been snoozed *) 885 | Scheduled (** Mailbox containing messages scheduled to be sent later *) 886 | Memos (** Mailbox containing messages with the $memo keyword *) 887 | OtherAttribute of string (** Other non-standard mailbox attributes *) 888 889 (** Functions for working with flag colors *) 890 val flag_color_of_bits : bool -> bool -> bool -> flag_color 891 892 (** Get bits for a flag color *) 893 val bits_of_flag_color : flag_color -> bool * bool * bool 894 895 (** Check if a message has a flag color based on its keywords *) 896 val has_flag_color : (keyword * bool) list -> bool 897 898 (** Get the flag color from a message's keywords, if present *) 899 val get_flag_color : (keyword * bool) list -> flag_color option 900 901 (** Convert a message keyword to its string representation *) 902 val string_of_message_keyword : message_keyword -> string 903 904 (** Parse a string into a message keyword *) 905 val message_keyword_of_string : string -> message_keyword 906 907 (** Convert a mailbox attribute to its string representation *) 908 val string_of_mailbox_attribute : mailbox_attribute -> string 909 910 (** Parse a string into a mailbox attribute *) 911 val mailbox_attribute_of_string : string -> mailbox_attribute 912end 913 914(** {1 JSON serialization} *) 915 916module Json : sig 917 open Types 918 919 (** {2 Helper functions for serialization} *) 920 921 val string_of_mailbox_role : mailbox_role -> string 922 val mailbox_role_of_string : string -> mailbox_role 923 924 val string_of_keyword : keyword -> string 925 val keyword_of_string : string -> keyword 926 927 (** {2 Mailbox serialization} *) 928 929 (** TODO:claude - Need to implement all JSON serialization functions 930 for each type we've defined. This would be a substantial amount of 931 code and likely require additional understanding of the ezjsonm API. 932 933 The interface would include functions like: 934 935 val mailbox_to_json : mailbox -> Ezjsonm.value 936 val mailbox_of_json : Ezjsonm.value -> mailbox result 937 938 And similarly for all other types. 939 *) 940end 941 942(** {1 API functions} *) 943 944(** Authentication credentials for a JMAP server *) 945type credentials = { 946 username: string; 947 password: string; 948} 949 950(** Connection to a JMAP mail server *) 951type connection = { 952 session: Jmap.Types.session; 953 config: Jmap.Api.config; 954} 955 956(** Login to a JMAP server and establish a connection 957 @param uri The URI of the JMAP server 958 @param credentials Authentication credentials 959 @return A connection object if successful 960 961 TODO:claude *) 962val login : 963 uri:string -> 964 credentials:credentials -> 965 (connection, Jmap.Api.error) result Lwt.t 966 967(** Login to a JMAP server using an API token 968 @param uri The URI of the JMAP server 969 @param api_token The API token for authentication 970 @return A connection object if successful 971 972 TODO:claude *) 973val login_with_token : 974 uri:string -> 975 api_token:string -> 976 (connection, Jmap.Api.error) result Lwt.t 977 978(** Get all mailboxes for an account 979 @param conn The JMAP connection 980 @param account_id The account ID to get mailboxes for 981 @return A list of mailboxes if successful 982 983 TODO:claude *) 984val get_mailboxes : 985 connection -> 986 account_id:Jmap.Types.id -> 987 (Types.mailbox list, Jmap.Api.error) result Lwt.t 988 989(** Get a specific mailbox by ID 990 @param conn The JMAP connection 991 @param account_id The account ID 992 @param mailbox_id The mailbox ID to retrieve 993 @return The mailbox if found 994 995 TODO:claude *) 996val get_mailbox : 997 connection -> 998 account_id:Jmap.Types.id -> 999 mailbox_id:Jmap.Types.id -> 1000 (Types.mailbox, Jmap.Api.error) result Lwt.t 1001 1002(** Get messages in a mailbox 1003 @param conn The JMAP connection 1004 @param account_id The account ID 1005 @param mailbox_id The mailbox ID to get messages from 1006 @param limit Optional limit on number of messages to return 1007 @return The list of email messages if successful 1008 1009 TODO:claude *) 1010val get_messages_in_mailbox : 1011 connection -> 1012 account_id:Jmap.Types.id -> 1013 mailbox_id:Jmap.Types.id -> 1014 ?limit:int -> 1015 unit -> 1016 (Types.email list, Jmap.Api.error) result Lwt.t 1017 1018(** Get a single email message by ID 1019 @param conn The JMAP connection 1020 @param account_id The account ID 1021 @param email_id The email ID to retrieve 1022 @return The email message if found 1023 1024 TODO:claude *) 1025val get_email : 1026 connection -> 1027 account_id:Jmap.Types.id -> 1028 email_id:Jmap.Types.id -> 1029 (Types.email, Jmap.Api.error) result Lwt.t 1030 1031(** Check if an email has a specific message keyword 1032 @param email The email to check 1033 @param keyword The message keyword to look for 1034 @return true if the email has the keyword, false otherwise 1035 1036 TODO:claude *) 1037val has_message_keyword : 1038 Types.email -> 1039 Types.message_keyword -> 1040 bool 1041 1042(** Add a message keyword to an email 1043 @param conn The JMAP connection 1044 @param account_id The account ID 1045 @param email_id The email ID 1046 @param keyword The message keyword to add 1047 @return Success or error 1048 1049 TODO:claude *) 1050val add_message_keyword : 1051 connection -> 1052 account_id:Jmap.Types.id -> 1053 email_id:Jmap.Types.id -> 1054 keyword:Types.message_keyword -> 1055 (unit, Jmap.Api.error) result Lwt.t 1056 1057(** Set a flag color for an email 1058 @param conn The JMAP connection 1059 @param account_id The account ID 1060 @param email_id The email ID 1061 @param color The flag color to set 1062 @return Success or error 1063 1064 TODO:claude *) 1065val set_flag_color : 1066 connection -> 1067 account_id:Jmap.Types.id -> 1068 email_id:Jmap.Types.id -> 1069 color:Types.flag_color -> 1070 (unit, Jmap.Api.error) result Lwt.t 1071 1072(** Convert an email's keywords to typed message_keyword list 1073 @param email The email to analyze 1074 @return List of message keywords 1075 1076 TODO:claude *) 1077val get_message_keywords : 1078 Types.email -> 1079 Types.message_keyword list 1080 1081(** Get emails with a specific message keyword 1082 @param conn The JMAP connection 1083 @param account_id The account ID 1084 @param keyword The message keyword to search for 1085 @param limit Optional limit on number of emails to return 1086 @return List of emails with the keyword if successful 1087 1088 TODO:claude *) 1089val get_emails_with_keyword : 1090 connection -> 1091 account_id:Jmap.Types.id -> 1092 keyword:Types.message_keyword -> 1093 ?limit:int -> 1094 unit -> 1095 (Types.email list, Jmap.Api.error) result Lwt.t