Skip to main content
Glama
smart-inbox-organization.js8.67 kB
#!/usr/bin/env node import { FastMailClient } from '../src/fastmail-client.js'; import dotenv from 'dotenv'; dotenv.config({ path: '../.env' }); async function smartInboxOrganization() { console.log('⭐ SMART INBOX ORGANIZATION - KEEPING ONLY STARRED EMAILS\n'); const client = new FastMailClient( process.env.FASTMAIL_API_TOKEN, 'clark@clarkeverson.com', 'clark@clarkeverson.com', 'clarkeverson.com', 'https://api.fastmail.com/jmap/session' ); try { await client.authenticate(); const mailboxes = await client.getMailboxes(); // Get Sent folder to identify conversations const sentMailbox = mailboxes.find(mb => mb.name === 'Sent'); const inboxMailbox = mailboxes.find(mb => mb.name === 'Inbox'); if (!sentMailbox || !inboxMailbox) { console.log('❌ Could not find Sent or Inbox folders'); return; } console.log('📧 Getting your sent emails to identify active conversations...'); // Get recent sent emails to identify who you've been communicating with const sentEmails = await client.getEmails(sentMailbox.id, 200, 0); const conversationParticipants = new Set(); const conversationSubjects = new Set(); if (sentEmails && sentEmails.emails) { sentEmails.emails.forEach(email => { // Add recipients you've emailed if (email.to) { email.to.forEach(recipient => { conversationParticipants.add(recipient.email.toLowerCase()); }); } // Add subject lines (without Re: or Fwd:) if (email.subject) { const cleanSubject = email.subject .replace(/^(re:|fwd?:)\s*/i, '') .toLowerCase() .trim(); if (cleanSubject.length > 5) { // Ignore very short subjects conversationSubjects.add(cleanSubject); } } }); } console.log(`📤 Found ${conversationParticipants.size} conversation participants`); console.log(`📝 Found ${conversationSubjects.size} conversation subjects`); // Get target mailboxes for organization const infoParent = mailboxes.find(mb => mb.name === 'Information'); const financialParent = mailboxes.find(mb => mb.name === 'Financial'); const commerceParent = mailboxes.find(mb => mb.name === 'Commerce'); const professionalParent = mailboxes.find(mb => mb.name === 'Professional'); const targets = { 'Information/Newsletters': mailboxes.find(mb => mb.parentId === infoParent?.id && mb.name === 'Newsletters'), 'Financial/Receipts': mailboxes.find(mb => mb.parentId === financialParent?.id && mb.name === 'Receipts'), 'Commerce/Orders': mailboxes.find(mb => mb.parentId === commerceParent?.id && mb.name === 'Orders'), 'Professional/GitHub': mailboxes.find(mb => mb.parentId === professionalParent?.id && mb.name === 'GitHub'), 'Spam': mailboxes.find(mb => mb.name === 'Spam') }; console.log(`\n📥 Analyzing ${inboxMailbox.totalEmails} inbox emails...`); console.log('='.repeat(80)); let position = 0; let conversationEmails = 0; let automatedEmails = 0; let spamEmails = 0; while (position < inboxMailbox.totalEmails) { const emailResult = await client.getEmails(inboxMailbox.id, 25, position); if (!emailResult?.emails?.length) break; console.log(`\n📧 Batch ${Math.floor(position/25) + 1}: emails ${position + 1}-${position + emailResult.emails.length}`); for (const email of emailResult.emails) { try { const sender = email.from?.[0]?.email?.toLowerCase() || ''; const subject = email.subject || ''; const cleanSubject = subject.replace(/^(re:|fwd?:)\s*/i, '').toLowerCase().trim(); // Check if email is starred - ONLY keep starred emails in inbox const isStarred = email.keywords && email.keywords.includes('$flagged'); if (isStarred) { conversationEmails++; console.log(` ⭐ [STARRED] ${subject.substring(0, 50)}... (FROM: ${sender})`); // Don't move - keep starred emails in inbox continue; } // Categorize non-conversation emails let targetPath = null; let reason = ''; // SPAM - Health scams, adult content, suspicious domains if ( subject.toLowerCase().includes('tea trick') || subject.toLowerCase().includes('blood sugar') || subject.toLowerCase().includes('weight loss') || subject.toLowerCase().includes('prostate') || subject.toLowerCase().includes('vertigo') || subject.toLowerCase().includes('diabetes') || subject.toLowerCase().includes('memory loss') || subject.toLowerCase().includes('milf') || subject.toLowerCase().includes('wild night') || sender.includes('@cube.dochltrowapp.com') || sender.includes('@petsitedeal.com') || sender.includes('@techisam.com') || sender.includes('@roadreadynutrition.com') || sender.includes('@blanco17.com') || sender.includes('@acompanhantestop.com') ) { targetPath = 'Spam'; reason = 'Spam/scam content'; spamEmails++; } // FINANCIAL - Legitimate financial services else if ( sender.includes('paypal') || sender.includes('stripe') || sender.includes('bank') || sender.includes('credit') || sender.includes('mortgage') || sender.includes('loan') || subject.toLowerCase().includes('payment') || subject.toLowerCase().includes('receipt') || subject.toLowerCase().includes('invoice') || subject.toLowerCase().includes('statement') ) { targetPath = 'Financial/Receipts'; reason = 'Financial transaction'; } // COMMERCE - Shopping, orders, subscriptions else if ( sender.includes('amazon') || sender.includes('etsy') || sender.includes('order') || sender.includes('shop') || subject.toLowerCase().includes('order') || subject.toLowerCase().includes('shipped') || subject.toLowerCase().includes('delivery') || subject.toLowerCase().includes('subscription') ) { targetPath = 'Commerce/Orders'; reason = 'Shopping/order'; } // PROFESSIONAL - GitHub, work services else if ( sender.includes('github') || sender.includes('slack') || subject.toLowerCase().includes('github') || subject.toLowerCase().includes('build') || subject.toLowerCase().includes('deploy') ) { targetPath = 'Professional/GitHub'; reason = 'Professional service'; } // DEFAULT - Everything else goes to newsletters else { targetPath = 'Information/Newsletters'; reason = 'Automated/promotional content'; } // Apply categorization if (targetPath && targets[targetPath]) { await client.moveEmailsToMailbox([email.id], targets[targetPath].id); automatedEmails++; const icon = targetPath === 'Spam' ? '🗑️' : '✅'; console.log(` ${icon} [${automatedEmails + spamEmails}] ${subject.substring(0, 40)}... → ${targetPath} (${reason})`); } } catch (error) { console.log(` ❌ Error processing: ${error.message}`); } } position += emailResult.emails.length; await new Promise(resolve => setTimeout(resolve, 1500)); } console.log('\n🎉 SMART ORGANIZATION COMPLETE!'); console.log('='.repeat(60)); console.log(`⭐ Starred emails kept in inbox: ${conversationEmails}`); console.log(`✅ Automated emails organized: ${automatedEmails}`); console.log(`🗑️ Spam emails moved: ${spamEmails}`); console.log(`📧 Total processed: ${conversationEmails + automatedEmails + spamEmails}`); if (conversationEmails <= 15) { console.log('\n✅ PERFECT! Inbox now contains only starred emails'); } else { console.log('\n⭐ Inbox contains starred emails - review stars if needed'); } } catch (error) { console.log('❌ Error:', error.message); } } smartInboxOrganization().catch(console.error);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/gr3enarr0w/fastmail-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server