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) {