Skip to main content
Glama
search-solar-emails.jsโ€ข6 kB
#!/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);

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