← back to Sample Followup Sweep
scripts/send-drafts.js
40 lines
'use strict';
// Sends the consolidated vendor follow-up letters through George's /api/send,
// carrying the human-approval token (Steve-approved batch, 2026-08-14).
// Secrets are read from george-gmail/.env at runtime and never printed.
const fs = require('fs');
const path = require('path');
const { georgeRequest } = require('../lib/george-transport');
const GENV = '/Users/macstudio3/Projects/george-gmail/.env';
function env(k) { try { const m = fs.readFileSync(GENV, 'utf8').match(new RegExp('^' + k + '=(.+)$', 'm')); return m ? m[1].trim() : ''; } catch (e) { return ''; } }
let auth = env('GEORGE_BASIC_AUTH');
if (!auth.includes(':')) auth = 'admin:' + env('GEORGE_BASIC_AUTH_PASS');
const token = env('GEORGE_EXTERNAL_SEND_TOKEN');
if (!token) { console.error('ABORT: GEORGE_EXTERNAL_SEND_TOKEN not found in george-gmail/.env'); process.exit(1); }
const basic = 'Basic ' + Buffer.from(auth).toString('base64');
const drafts = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'out', 'all-drafts.json'), 'utf8'));
function send(d) {
const payload = { account: 'info', to: d.to, subject: d.subject, body: d.body };
return georgeRequest({ path: '/api/send', payload, headers: { Authorization: basic, 'X-Send-Approval': token } })
.then((result) => ({ code: result.statusCode, body: result.body }))
.catch((error) => ({ code: 0, body: JSON.stringify({ success: false, error: error.message }) }));
}
(async () => {
const ledger = [];
for (const d of drafts) {
const r = await send(d);
let ok = false, mid = '';
try { const j = JSON.parse(r.body); ok = !!j.success; mid = j.messageId || ''; } catch (e) {}
console.log(`${ok ? 'SENT' : 'FAIL'} ${r.code} -> ${d.to} (${d.items} memos) [${d.slugs.join('+')}]` + (ok ? ` msg=${mid}` : ` :: ${r.body.slice(0, 140)}`));
ledger.push({ to: d.to, slugs: d.slugs, items: d.items, ok, code: r.code, messageId: mid });
}
fs.writeFileSync(path.join(__dirname, '..', 'out', 'send-ledger.json'), JSON.stringify(ledger, null, 2));
const sent = ledger.filter(x => x.ok).length;
console.log(`\n=== SENT ${sent}/${ledger.length} vendor follow-up letters ===`);
})();