From cdabec2a92a971c233095eba662fc90f8115e751 Mon Sep 17 00:00:00 2001 From: mplorentz Date: Tue, 25 Aug 2026 15:15:33 -0400 Subject: [PATCH] log errors --- src/mailer.ts | 57 +++++++++++++++++++++++++++++++++++---------------- src/server.ts | 5 ++++- 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/mailer.ts b/src/mailer.ts index 1114471..35739a1 100644 --- a/src/mailer.ts +++ b/src/mailer.ts @@ -3,10 +3,13 @@ import { SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD, SMTP_FROM, MAILSHIP_NAM import type { Subscription } from './alert.js' import { render } from './templates.js' +const secure = Number(SMTP_PORT) === 465 + const transporter = nodemailer.createTransport({ host: SMTP_HOST, port: Number(SMTP_PORT), - secure: true, + secure, + requireTLS: !secure, auth: { user: SMTP_USER, pass: SMTP_PASSWORD, @@ -16,28 +19,46 @@ const transporter = nodemailer.createTransport({ export const sendConfirm = (sub: Subscription) => { const href = `${BASE_URL}/confirm?token=${sub.key}` - return transporter.sendMail({ - from: SMTP_FROM, - to: sub.email, - subject: 'Confirm your email digest', - html: ` + return transporter + .sendMail({ + from: SMTP_FROM, + to: sub.email, + subject: 'Confirm your email digest', + html: `

Welcome to ${MAILSHIP_NAME}!

Please confirm that you would like to receive ${sub.frequency} digests by clicking the link below:

Confirm Digest

`, - text: `Please confirm that you would like to receive ${sub.frequency} digests by visiting: ${href}`, - }) + text: `Please confirm that you would like to receive ${sub.frequency} digests by visiting: ${href}`, + }) + .catch(error => { + console.error('mailer: confirmation email failed', { + to: sub.email, + smtp: { host: SMTP_HOST, port: SMTP_PORT }, + error: error?.message || error, + }) + throw error + }) } export const sendDigest = async (sub: Subscription, variables: Record) => { - return transporter.sendMail({ - from: SMTP_FROM, - to: sub.email, - subject: 'New activity', - html: await render('emails/digest.mjml', { - ...variables, - name: sub.email.split('@')[0], - unsubscribeUrl: `${BASE_URL}/unsubscribe?token=${sub.key}`, - }), - }) + return transporter + .sendMail({ + from: SMTP_FROM, + to: sub.email, + subject: 'New activity', + html: await render('emails/digest.mjml', { + ...variables, + name: sub.email.split('@')[0], + unsubscribeUrl: `${BASE_URL}/unsubscribe?token=${sub.key}`, + }), + }) + .catch(error => { + console.error('mailer: digest email failed', { + to: sub.email, + smtp: { host: SMTP_HOST, port: SMTP_PORT }, + error: error?.message || error, + }) + throw error + }) } \ No newline at end of file diff --git a/src/server.ts b/src/server.ts index 8671380..204fb19 100644 --- a/src/server.ts +++ b/src/server.ts @@ -113,7 +113,10 @@ addRoute('post', '/subscription/email', async (req: Request, res: Response) => { const result = await registerSubscription({ pubkey, email, frequency }) res.json(result) } catch (error: any) { - // If the error is just Postmark failing, the subscription was still created + // The subscription was still created, but sending the confirmation email + // may have failed. Always log it so SMTP issues are visible. + console.error('Failed to send confirmation email for', pubkey, error?.message || error) + // Look up the actual subscription key from the DB const sub = await getSubscriptionByPubkey(pubkey) if (sub) {