interface EmailTemplate { subject: string; template: JSX.Element; } const SWEEGO_API_URL = 'https://api.sweego.io/send'; const renderTemplate = async (template: JSX.Element): Promise => { const { renderToStaticMarkup } = await import('react-dom/server'); const html = renderToStaticMarkup(template); return ` ${html} `; }; export async function sender( recipients: string[], { subject, template }: EmailTemplate ): Promise { if (!process.env.SWEEGO_API_KEY) { throw new Error('SWEEGO_API_KEY is not set'); } if (!process.env.SWEEGO_FROM) { throw new Error('SWEEGO_FROM is not set'); } if (recipients.length === 0) { console.info(`${subject} email skipped for having zero recipients`); return true; } const htmlContent = await renderTemplate(template); const fromName = process.env.NEXT_PUBLIC_BRAND_NAME || 'Newsletter'; let successCount = 0; let failCount = 0; for (const recipient of recipients) { try { const response = await fetch(SWEEGO_API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Api-Key': process.env.SWEEGO_API_KEY }, body: JSON.stringify({ channel: 'email', provider: 'sweego', recipients: [{ email: recipient }], from: { name: fromName, email: process.env.SWEEGO_FROM }, subject, 'message-html': htmlContent, headers: { 'List-Unsubscribe': `` } }) }); if (!response.ok) { const error = await response.text(); console.error( `Failed to send to ${recipient}: ${response.status} ${error}` ); failCount++; continue; } successCount++; } catch (error) { console.error(`Failed to send to ${recipient}:`, error); failCount++; } } console.info( `${subject} email: ${successCount} sent, ${failCount} failed out of ${recipients.length} recipients` ); return successCount > 0; }