← 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 ===`);
})();