# Query 5: Draft Emails Needing Attention ## Use Case Description Find draft emails that need attention, focusing on older drafts that may have been forgotten. This helps users manage their composition workflow and complete pending communications. ## Key JMAP Concepts Used - **Mailbox role filtering**: Finding drafts mailbox by role - **Keyword filtering**: Using `$draft` keyword to identify draft emails - **Age-based sorting**: Finding oldest drafts first for prioritization - **Mailbox/query**: Locating system mailboxes by role - **Multi-step queries**: Mailbox discovery followed by email filtering ## JMAP Request ```json { "using": ["urn:ietf:params:jmap:core", "urn:ietf:params:jmap:mail"], "methodCalls": [ [ "Mailbox/query", { "accountId": "u12345678", "filter": { "role": "drafts" } }, "mb0" ], [ "Email/query", { "accountId": "u12345678", "filter": { "operator": "AND", "conditions": [ { "hasKeyword": "$draft" }, { "#inMailbox": { "resultOf": "mb0", "name": "Mailbox/query", "path": "/ids/0" } }, { "before": "2024-08-20T00:00:00Z" } ] }, "sort": [ { "property": "receivedAt", "isAscending": true } ], "limit": 10 }, "q0" ], [ "Email/get", { "accountId": "u12345678", "#ids": { "resultOf": "q0", "name": "Email/query", "path": "/ids" }, "properties": [ "id", "threadId", "keywords", "from", "to", "cc", "bcc", "subject", "receivedAt", "sentAt", "preview", "textBody", "htmlBody", "attachments", "bodyValues" ], "bodyProperties": ["value", "isEncodingProblem", "isTruncated"] }, "g0" ] ] } ``` ## Expected Response Structure ```json { "methodResponses": [ [ "Mailbox/query", { "accountId": "u12345678", "queryState": "mq1234567893", "canCalculateChanges": true, "position": 0, "ids": ["Mdrafts"], "total": 1, "limit": null }, "mb0" ], [ "Email/query", { "accountId": "u12345678", "queryState": "q1234567893", "canCalculateChanges": true, "position": 0, "ids": ["Memail201", "Memail202", "Memail203"], "total": 7, "limit": 10 }, "q0" ], [ "Email/get", { "accountId": "u12345678", "state": "s9876543214", "list": [ { "id": "Memail201", "threadId": "Tthread301", "keywords": {"$draft": true}, "from": [{"email": "me@example.com", "name": "John Doe"}], "to": [{"email": "client@company.com", "name": "Important Client"}], "cc": [], "bcc": [], "subject": "Proposal Follow-up - ", "receivedAt": "2024-08-10T15:30:00Z", "sentAt": null, "preview": "Hi [Client Name], Thank you for taking the time to review our proposal...", "textBody": [{"id": "draft1", "mimeType": "text/plain"}], "htmlBody": null, "bodyValues": { "draft1": { "value": "Hi [Client Name],\n\nThank you for taking the time to review our proposal. I wanted to follow up on a few key points:\n\n- Timeline considerations\n- Budget adjustments\n- [NEED TO ADD SPECIFIC DETAILS]\n\nPlease let me know your thoughts.\n\nBest regards,\nJohn", "isEncodingProblem": false, "isTruncated": false } }, "attachments": [] }, { "id": "Memail202", "threadId": "Tthread302", "keywords": {"$draft": true, "$flagged": true}, "from": [{"email": "me@example.com", "name": "John Doe"}], "to": [{"email": "hr@company.com", "name": "HR Department"}], "cc": [], "bcc": [], "subject": "Time off request - urgent", "receivedAt": "2024-08-15T11:45:00Z", "sentAt": null, "preview": "Dear HR Team, I would like to request time off for the following dates...", "textBody": [{"id": "draft2", "mimeType": "text/plain"}], "htmlBody": null, "bodyValues": { "draft2": { "value": "Dear HR Team,\n\nI would like to request time off for the following dates:\n\n[DATES TO BE FILLED IN]\n\nReason: [NEED TO SPECIFY]\n\nI will ensure all my current projects are completed or properly handed off before my departure.\n\nThank you for your consideration.\n\nBest regards,\nJohn", "isEncodingProblem": false, "isTruncated": false } }, "attachments": [] } ], "notFound": [] }, "g0" ] ] } ``` ## Explanation of Key Features ### Mailbox Role Discovery - **Mailbox/query** with `role: "drafts"` locates the system drafts folder - Role-based lookup works across different email providers and configurations - Handles cases where drafts folder has custom names or locations ### Result Reference Chaining - `#inMailbox` with `resultOf` uses the drafts mailbox ID from step 1 - `path: "/ids/0"` extracts the first (and typically only) drafts mailbox ID - Eliminates hardcoded mailbox IDs and adapts to server configurations ### Draft-Specific Filtering - `hasKeyword: "$draft"` ensures emails are actually drafts - `before` filter finds older drafts that may need attention - Double verification (mailbox + keyword) handles edge cases ### Draft Content Analysis The response reveals common draft patterns: - **Incomplete subjects**: "Proposal Follow-up - " (trailing dash/space) - **Placeholder text**: "[Client Name]", "[NEED TO ADD DETAILS]" - **Template content**: Standardized openings with missing specifics - **Flagged drafts**: Important drafts marked with `$flagged` keyword ### Draft Management Workflow **Identification Criteria:** 1. Age-based priority (older drafts first) 2. Content completeness analysis 3. Recipient validation 4. Subject line completion **Action Items Discovery:** - Search for placeholder patterns: `[...]`, `TODO`, `FIXME` - Identify incomplete subjects (trailing punctuation) - Check for missing recipients or CCs - Validate attachment references in text **Completion Workflow:** 1. Load draft for editing 2. Fill in placeholder content 3. Complete recipient lists 4. Finalize subject line 5. Review and send or save ### Advanced Draft Queries **High Priority Drafts:** ```json { "operator": "AND", "conditions": [ {"hasKeyword": "$draft"}, {"hasKeyword": "$flagged"}, {"before": "2024-08-18T00:00:00Z"} ] } ``` **Template Drafts:** ```json { "operator": "AND", "conditions": [ {"hasKeyword": "$draft"}, {"text": "["} ] } ``` **Drafts with Attachments:** ```json { "operator": "AND", "conditions": [ {"hasKeyword": "$draft"}, {"hasAttachment": true} ] } ```