diff --git a/app/api/mail/route.ts b/app/api/mail/route.ts index 6e006a3..073a5af 100644 --- a/app/api/mail/route.ts +++ b/app/api/mail/route.ts @@ -125,7 +125,16 @@ export async function GET() { } console.log('Available mailboxes:', Object.keys(boxes)); - const foldersToCheck = ['INBOX', 'Sent', 'Trash', 'Drafts']; + + // Map of folder names to their types + const folderMap = { + 'INBOX': 'inbox', + 'Sent': 'sent', + 'Trash': 'trash', + 'Drafts': 'drafts' + }; + + const foldersToCheck = Object.keys(folderMap); let foldersProcessed = 0; const processFolder = (folderName: string) => { @@ -150,12 +159,15 @@ export async function GET() { return; } - // Calculate the range for the last 20 messages - const start = Math.max(1, box.messages.total - 19); - const range = `${start}:${box.messages.total}`; + // Search for all messages in the folder + const searchCriteria = ['ALL']; + + // For INBOX, exclude drafts + if (folderName === 'INBOX') { + searchCriteria.push(['!KEYWORD', '\\Draft']); + } - // Search for all messages in the range - imap.search(['ALL'], (err, results) => { + imap.search(searchCriteria, (err, results) => { if (err) { console.error(`Search error in ${folderName}:`, err); foldersProcessed++; @@ -165,10 +177,10 @@ export async function GET() { return; } - // Filter results to get only the last 20 messages + // Sort results in reverse order (newest first) and take last 20 const messageNumbers = results - .sort((a, b) => b - a) // Sort in descending order - .slice(0, 20); // Take only the last 20 + .sort((a, b) => b - a) + .slice(0, 20); if (messageNumbers.length === 0) { foldersProcessed++; @@ -193,7 +205,7 @@ export async function GET() { starred: false, body: '', to: '', - folder: folderName + folder: folderMap[folderName] || folderName.toLowerCase() }; msg.on('body', (stream, info) => { @@ -218,10 +230,18 @@ export async function GET() { email.id = attrs.uid; email.read = attrs.flags?.includes('\\Seen') || false; email.starred = attrs.flags?.includes('\\Flagged') || false; + email.draft = attrs.flags?.includes('\\Draft') || false; }); msg.once('end', () => { - allEmails.push(email); + // Only add non-draft emails to INBOX + if (folderName === 'INBOX' && !email.draft) { + allEmails.push(email); + } + // Add all emails from other folders + else if (folderName !== 'INBOX') { + allEmails.push(email); + } }); }); @@ -247,6 +267,9 @@ export async function GET() { function finishProcessing() { console.log('All folders processed, total emails:', allEmails.length); + // Sort all emails by date + allEmails.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); + const response = { emails: allEmails, mailUrl: process.env.NEXTCLOUD_URL ? `${process.env.NEXTCLOUD_URL}/apps/mail/` : null