#!/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);