#!/usr/bin/env node
import { FastMailClient } from '../src/fastmail-client.js';
import dotenv from 'dotenv';
dotenv.config({ path: '../../.env' });
async function searchSolarEmails() {
console.log('๐ SEARCHING FOR SOLAR-RELATED EMAILS\n');
const client = new FastMailClient(
process.env.FASTMAIL_API_TOKEN,
'clark@everson.dev',
'clark@clarkeverson.com',
'clarkeverson.com',
'https://api.fastmail.com/jmap/session'
);
try {
await client.authenticate();
const mailboxes = await client.getMailboxes();
// Define solar-related keywords
const solarKeywords = [
'solar', 'panel', 'panels', 'photovoltaic', 'pv', 'installation',
'quote', 'estimate', 'energy', 'renewable', 'sunpower', 'tesla',
'enphase', 'inverter', 'roof', 'electricity', 'kwh', 'kilowatt',
'sunrun', 'vivint', 'momentum', 'freedom', 'solar city'
];
// Folders to search (focusing on likely locations)
const foldersToSearch = [
'Inbox',
'Archive',
'Financial',
'Financial/Receipts',
'Commerce',
'Commerce/Orders',
'Information',
'Information/Newsletters'
];
const solarEmails = [];
let totalSearched = 0;
console.log('๐ Searching folders for solar-related emails...');
console.log('='.repeat(80));
for (const folderPath of foldersToSearch) {
let folder;
if (folderPath.includes('/')) {
const [parentName, childName] = folderPath.split('/');
const parent = mailboxes.find(mb => mb.name === parentName);
folder = mailboxes.find(mb => mb.parentId === parent?.id && mb.name === childName);
} else {
folder = mailboxes.find(mb => mb.name === folderPath);
}
if (!folder) {
console.log(`โ ๏ธ ${folderPath}: Folder not found`);
continue;
}
console.log(`\n๐ Searching ${folderPath} (${folder.totalEmails} emails)...`);
// Search in batches
let position = 0;
const batchSize = 100;
let folderResults = 0;
while (position < folder.totalEmails) {
const emailResult = await client.getEmails(folder.id, batchSize, position);
if (!emailResult?.emails?.length) break;
for (const email of emailResult.emails) {
totalSearched++;
const sender = email.from?.[0]?.email?.toLowerCase() || '';
const subject = (email.subject || '').toLowerCase();
const preview = (email.preview || '').toLowerCase();
const senderName = email.from?.[0]?.name?.toLowerCase() || '';
// Check for solar keywords in subject, sender, or preview
const hasSolarKeyword = solarKeywords.some(keyword =>
subject.includes(keyword) ||
sender.includes(keyword) ||
preview.includes(keyword) ||
senderName.includes(keyword)
);
if (hasSolarKeyword) {
solarEmails.push({
folder: folderPath,
date: email.receivedAt,
from: email.from?.[0]?.email || 'Unknown',
fromName: email.from?.[0]?.name || '',
subject: email.subject || 'No subject',
preview: email.preview?.substring(0, 200) || '',
matchedKeywords: solarKeywords.filter(keyword =>
subject.includes(keyword) ||
sender.includes(keyword) ||
preview.includes(keyword) ||
senderName.includes(keyword)
)
});
folderResults++;
}
}
position += emailResult.emails.length;
// Show progress for large folders
if (position % 500 === 0) {
console.log(` ๐ Searched ${position}/${folder.totalEmails} emails...`);
}
}
console.log(` โ
Found ${folderResults} solar-related emails in ${folderPath}`);
}
console.log('\n๐ SOLAR EMAIL SEARCH RESULTS:');
console.log('='.repeat(80));
console.log(`๐ง Total emails searched: ${totalSearched}`);
console.log(`๐ Solar-related emails found: ${solarEmails.length}`);
if (solarEmails.length === 0) {
console.log('\nโ No solar-related emails found');
console.log('Try searching manually in FastMail with keywords: solar, panel, quote');
return;
}
// Sort by date (newest first)
solarEmails.sort((a, b) => new Date(b.date) - new Date(a.date));
console.log('\n๐ FOUND SOLAR EMAILS:');
console.log('='.repeat(80));
solarEmails.forEach((email, index) => {
const date = new Date(email.date).toLocaleDateString();
console.log(`\n${index + 1}. ๐
${date} | ๐ ${email.folder}`);
console.log(` FROM: ${email.fromName ? `${email.fromName} <${email.from}>` : email.from}`);
console.log(` SUBJECT: ${email.subject}`);
console.log(` KEYWORDS: ${email.matchedKeywords.join(', ')}`);
console.log(` PREVIEW: ${email.preview}...`);
});
// Group by company/sender for analysis
console.log('\n๐ข SOLAR COMPANIES FOUND:');
console.log('='.repeat(60));
const companies = {};
solarEmails.forEach(email => {
const domain = email.from.split('@')[1]?.toLowerCase() || email.from;
if (!companies[domain]) {
companies[domain] = [];
}
companies[domain].push(email);
});
Object.entries(companies)
.sort(([,a], [,b]) => b.length - a.length)
.forEach(([domain, emails]) => {
console.log(`๐ง ${domain}: ${emails.length} emails`);
const latestDate = new Date(Math.max(...emails.map(e => new Date(e.date))));
console.log(` Latest: ${latestDate.toLocaleDateString()}`);
});
} catch (error) {
console.log('โ Error:', error.message);
}
}
searchSolarEmails().catch(console.error);