#!/usr/bin/env node
import { FastMailClient } from './src/fastmail-client.js';
import dotenv from 'dotenv';
dotenv.config({ path: '../.env' });
async function comprehensiveSpamReview() {
console.log('๐ COMPREHENSIVE SPAM FOLDER REVIEW - DETAILED ANALYSIS\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();
const spamMailbox = mailboxes.find(mb => mb.name === 'Spam');
if (!spamMailbox) {
console.log('โ Spam folder not found');
return;
}
console.log(`๐ง ANALYZING ALL ${spamMailbox.totalEmails} EMAILS IN SPAM FOLDER:`);
console.log('='.repeat(80));
// Get target folders
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 personalParent = mailboxes.find(mb => mb.name === 'Personal');
const targets = {
'Information/Newsletters': mailboxes.find(mb => mb.parentId === infoParent?.id && mb.name === 'Newsletters'),
'Information/News': mailboxes.find(mb => mb.parentId === infoParent?.id && mb.name === 'News'),
'Financial/Receipts': mailboxes.find(mb => mb.parentId === financialParent?.id && mb.name === 'Receipts'),
'Financial/Banking': mailboxes.find(mb => mb.parentId === financialParent?.id && mb.name === 'Banking'),
'Commerce/Orders': mailboxes.find(mb => mb.parentId === commerceParent?.id && mb.name === 'Orders'),
'Commerce/Subscriptions': mailboxes.find(mb => mb.parentId === commerceParent?.id && mb.name === 'Subscriptions'),
'Professional/GitHub': mailboxes.find(mb => mb.parentId === professionalParent?.id && mb.name === 'GitHub'),
'Professional/Security': mailboxes.find(mb => mb.parentId === professionalParent?.id && mb.name === 'Security'),
'Personal/Travel': mailboxes.find(mb => mb.parentId === personalParent?.id && mb.name === 'Travel')
};
let position = 0;
let legitimateFound = [];
let confirmedSpam = [];
let processed = 0;
while (position < spamMailbox.totalEmails) {
const emailResult = await client.getEmails(spamMailbox.id, 50, position);
if (!emailResult?.emails?.length) break;
console.log(`\n๐ง Batch ${Math.floor(position/50) + 1}: Analyzing emails ${position + 1}-${position + emailResult.emails.length}`);
for (const email of emailResult.emails) {
const sender = email.from?.[0]?.email?.toLowerCase() || '';
const subject = email.subject || '';
const senderDomain = sender.split('@')[1]?.toLowerCase() || '';
processed++;
// Comprehensive legitimate email detection
const isLegitimate =
// Major legitimate companies/services
senderDomain.includes('amazon') || senderDomain.includes('apple') ||
senderDomain.includes('google') || senderDomain.includes('microsoft') ||
senderDomain.includes('paypal') || senderDomain.includes('stripe') ||
senderDomain.includes('github') || senderDomain.includes('salesforce') ||
senderDomain.includes('slack') || senderDomain.includes('zoom') ||
senderDomain.includes('adobe') || senderDomain.includes('dropbox') ||
senderDomain.includes('atlassian') || senderDomain.includes('jetbrains') ||
// Financial institutions
senderDomain.includes('chase') || senderDomain.includes('schwab') ||
senderDomain.includes('fidelity') || senderDomain.includes('wellsfargo') ||
senderDomain.includes('bankofamerica') || senderDomain.includes('usbank') ||
senderDomain.includes('americanexpress') || senderDomain.includes('amex') ||
senderDomain.includes('discover') || senderDomain.includes('capitalone') ||
// Airlines/Travel (mentioned tickts)
senderDomain.includes('united') || senderDomain.includes('delta') ||
senderDomain.includes('southwest') || senderDomain.includes('american') ||
senderDomain.includes('expedia') || senderDomain.includes('booking') ||
senderDomain.includes('priceline') || senderDomain.includes('kayak') ||
senderDomain.includes('hotels') || senderDomain.includes('airbnb') ||
senderDomain.includes('uber') || senderDomain.includes('lyft') ||
// Retail/Shopping
senderDomain.includes('walmart') || senderDomain.includes('target') ||
senderDomain.includes('costco') || senderDomain.includes('homedepot') ||
senderDomain.includes('bestbuy') || senderDomain.includes('staples') ||
senderDomain.includes('wayfair') || senderDomain.includes('overstock') ||
senderDomain.includes('newegg') || senderDomain.includes('tigerdirect') ||
// Deal/Coupon sites (mentioned offers.com)
senderDomain.includes('offers.com') || senderDomain.includes('groupon') ||
senderDomain.includes('livingsocial') || senderDomain.includes('woot') ||
senderDomain.includes('slickdeals') || senderDomain.includes('dealnews') ||
senderDomain.includes('retailmenot') || senderDomain.includes('honey') ||
// Streaming/Entertainment
senderDomain.includes('netflix') || senderDomain.includes('hulu') ||
senderDomain.includes('spotify') || senderDomain.includes('youtube') ||
senderDomain.includes('twitch') || senderDomain.includes('steam') ||
// Professional/Career
senderDomain.includes('linkedin') || senderDomain.includes('indeed') ||
senderDomain.includes('glassdoor') || senderDomain.includes('upwork') ||
senderDomain.includes('freelancer') || senderDomain.includes('fiverr') ||
// Health/Medical
senderDomain.includes('mayoclinic') || senderDomain.includes('webmd') ||
senderDomain.includes('healthline') || senderDomain.includes('cvs') ||
senderDomain.includes('walgreens') || senderDomain.includes('rite-aid') ||
// Government/Official (.gov, .edu)
senderDomain.includes('.gov') || senderDomain.includes('.edu') ||
senderDomain.includes('irs.gov') || senderDomain.includes('ssa.gov') ||
// Email marketing platforms (legitimate services)
senderDomain.includes('mailchimp') || senderDomain.includes('constantcontact') ||
senderDomain.includes('sendgrid') || senderDomain.includes('mandrill') ||
senderDomain.includes('aweber') || senderDomain.includes('getresponse') ||
// Food delivery/restaurants
senderDomain.includes('doordash') || senderDomain.includes('grubhub') ||
senderDomain.includes('ubereats') || senderDomain.includes('postmates') ||
// Utility companies
senderDomain.includes('comcast') || senderDomain.includes('verizon') ||
senderDomain.includes('att.com') || senderDomain.includes('tmobile') ||
// Subscription boxes/services
senderDomain.includes('birchbox') || senderDomain.includes('ipsy') ||
senderDomain.includes('lootcrate') || senderDomain.includes('dollar') ||
// Legitimate content that might be in spam
(subject.toLowerCase().includes('receipt') ||
subject.toLowerCase().includes('order') ||
subject.toLowerCase().includes('confirmation') ||
subject.toLowerCase().includes('invoice') ||
subject.toLowerCase().includes('statement') ||
subject.toLowerCase().includes('ticket') ||
subject.toLowerCase().includes('reservation') ||
subject.toLowerCase().includes('booking') ||
subject.toLowerCase().includes('shipment') ||
subject.toLowerCase().includes('delivery')) &&
// BUT exclude obvious spam patterns
!subject.toLowerCase().includes('tea trick') &&
!subject.toLowerCase().includes('weight loss') &&
!subject.toLowerCase().includes('blood sugar') &&
!subject.toLowerCase().includes('diabetes') &&
!subject.toLowerCase().includes('milf') &&
!subject.toLowerCase().includes('hookup') &&
!subject.toLowerCase().includes('wild night') &&
!subject.toLowerCase().includes('sexy') &&
!sender.includes('@students.') &&
!sender.includes('.edu.ng') &&
!sender.includes('.edu.gh') &&
!sender.includes('@unilorin.') &&
!senderDomain.includes('cube.dochltrowapp.com') &&
!senderDomain.includes('petsitedeal.com') &&
!senderDomain.includes('learnaboutquail.com') &&
!senderDomain.includes('makeupfridges.com');
if (isLegitimate) {
legitimateFound.push({
id: email.id,
from: sender,
subject: subject,
domain: senderDomain,
preview: email.preview?.substring(0, 100) || ''
});
} else {
confirmedSpam.push({
from: sender,
subject: subject.substring(0, 60)
});
}
}
position += emailResult.emails.length;
// Show progress
if (processed % 100 === 0) {
console.log(` ๐ Progress: ${processed}/${spamMailbox.totalEmails} emails analyzed`);
}
}
console.log('\n๐ข LEGITIMATE EMAILS FOUND IN SPAM:');
console.log('='.repeat(80));
if (legitimateFound.length === 0) {
console.log('โ
No additional legitimate emails found in spam folder');
} else {
console.log(`๐ง Found ${legitimateFound.length} legitimate emails to rescue:`);
console.log('');
let moved = 0;
for (const email of legitimateFound) {
console.log(`๐ง FROM: ${email.from}`);
console.log(` SUBJECT: ${email.subject}`);
console.log(` PREVIEW: ${email.preview}...`);
// Categorize legitimate email
let targetPath = null;
// Financial/Banking
if (email.domain.includes('schwab') || email.domain.includes('fidelity') ||
email.domain.includes('chase') || email.domain.includes('bank') ||
email.subject.toLowerCase().includes('statement') ||
email.subject.toLowerCase().includes('balance')) {
targetPath = 'Financial/Banking';
}
// Financial/Receipts
else if (email.subject.toLowerCase().includes('receipt') ||
email.subject.toLowerCase().includes('payment') ||
email.subject.toLowerCase().includes('invoice') ||
email.domain.includes('paypal') || email.domain.includes('stripe')) {
targetPath = 'Financial/Receipts';
}
// Commerce/Orders
else if (email.domain.includes('amazon') || email.domain.includes('walmart') ||
email.domain.includes('target') || email.domain.includes('bestbuy') ||
email.subject.toLowerCase().includes('order') ||
email.subject.toLowerCase().includes('shipped') ||
email.subject.toLowerCase().includes('delivery')) {
targetPath = 'Commerce/Orders';
}
// Travel
else if (email.domain.includes('airline') || email.domain.includes('hotel') ||
email.domain.includes('expedia') || email.domain.includes('booking') ||
email.subject.toLowerCase().includes('flight') ||
email.subject.toLowerCase().includes('reservation')) {
targetPath = 'Personal/Travel';
}
// Professional/Security
else if (email.subject.toLowerCase().includes('security') ||
email.subject.toLowerCase().includes('login') ||
email.subject.toLowerCase().includes('password') ||
email.subject.toLowerCase().includes('verification')) {
targetPath = 'Professional/Security';
}
// Professional/GitHub
else if (email.domain.includes('github') || email.domain.includes('gitlab') ||
email.domain.includes('google') || email.domain.includes('microsoft') ||
email.domain.includes('adobe')) {
targetPath = 'Professional/GitHub';
}
// Default to Information/Newsletters
else {
targetPath = 'Information/Newsletters';
}
if (targetPath && targets[targetPath]) {
try {
await client.moveEmailsToMailbox([email.id], targets[targetPath].id);
console.log(` โ
MOVED TO: ${targetPath}`);
moved++;
} catch (error) {
console.log(` โ Error moving: ${error.message}`);
}
}
console.log('');
}
console.log(`๐ RESCUED: Successfully moved ${moved} legitimate emails out of spam`);
}
console.log('\n๐ด CONFIRMED SPAM SAMPLES:');
console.log('='.repeat(60));
const sampleSpam = confirmedSpam.slice(0, 20);
sampleSpam.forEach((email, index) => {
console.log(`${index + 1}. ${email.subject} (${email.from.substring(0, 40)}...)`);
});
if (confirmedSpam.length > 20) {
console.log(`... and ${confirmedSpam.length - 20} more confirmed spam emails`);
}
console.log(`\n๐ COMPREHENSIVE SPAM REVIEW COMPLETE:`);
console.log('='.repeat(60));
console.log(`๐ง Total emails analyzed: ${processed}`);
console.log(`โ
Legitimate emails rescued: ${legitimateFound.length}`);
console.log(`๐๏ธ Confirmed spam remaining: ${confirmedSpam.length}`);
console.log(`๐ Spam detection accuracy: ${((confirmedSpam.length / processed) * 100).toFixed(1)}%`);
} catch (error) {
console.log('โ Error:', error.message);
}
}
comprehensiveSpamReview().catch(console.error);