From 770db3067d066423d6ff4de6c420dd2bba63c30a Mon Sep 17 00:00:00 2001 From: Javaxman Date: Wed, 29 Jul 2026 14:45:54 +0200 Subject: [PATCH] Mostra il link di disiscrizione dopo la conferma newsletter. Passa il token unsub alla pagina di conferma e lo include anche nell'email di double opt-in. Co-authored-by: Cursor --- src/pages/api/newsletter/confirm.ts | 5 ++++- src/pages/api/newsletter/subscribe.ts | 21 +++++++++++++++++++-- src/pages/newsletter/confermata.astro | 18 +++++++++++++++++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/pages/api/newsletter/confirm.ts b/src/pages/api/newsletter/confirm.ts index 852abd9..07d36ab 100644 --- a/src/pages/api/newsletter/confirm.ts +++ b/src/pages/api/newsletter/confirm.ts @@ -79,5 +79,8 @@ export const GET: APIRoute = async ({ request, locals, url }) => { } } - return Response.redirect(new URL(okPath, request.url).toString(), 303); + return Response.redirect( + new URL(`${okPath}?unsub=${encodeURIComponent(row.unsubscribe_token)}`, request.url).toString(), + 303, + ); }; diff --git a/src/pages/api/newsletter/subscribe.ts b/src/pages/api/newsletter/subscribe.ts index f9ec786..585a041 100644 --- a/src/pages/api/newsletter/subscribe.ts +++ b/src/pages/api/newsletter/subscribe.ts @@ -18,7 +18,11 @@ import { export const prerender = false; -function confirmEmailCopy(locale: string, confirmUrl: string): { subject: string; text: string } { +function confirmEmailCopy( + locale: string, + confirmUrl: string, + unsubscribeUrl: string, +): { subject: string; text: string } { if (locale === 'en') { return { subject: 'Confirm your NexStudio newsletter subscription', @@ -29,6 +33,9 @@ function confirmEmailCopy(locale: string, confirmUrl: string): { subject: string confirmUrl, '', 'If you did not request this, you can ignore this message.', + '', + 'Unsubscribe:', + unsubscribeUrl, ].join('\n'), }; } @@ -42,6 +49,9 @@ function confirmEmailCopy(locale: string, confirmUrl: string): { subject: string confirmUrl, '', 'หากคุณไม่ได้ขอสมัคร สามารถเพิกเฉยต่อข้อความนี้ได้', + '', + 'ยกเลิกการสมัคร:', + unsubscribeUrl, ].join('\n'), }; } @@ -54,6 +64,9 @@ function confirmEmailCopy(locale: string, confirmUrl: string): { subject: string confirmUrl, '', 'Se non hai richiesto l’iscrizione, puoi ignorare questo messaggio.', + '', + 'Per disiscriverti:', + unsubscribeUrl, ].join('\n'), }; } @@ -102,6 +115,10 @@ export const POST: APIRoute = async ({ request, locals, url }) => { const unsubscribeToken = createToken(); const origin = siteOrigin(url, runtimeEnv); const confirmUrl = absoluteUrl(origin, `/api/newsletter/confirm?token=${confirmToken}`); + const unsubscribeUrl = absoluteUrl( + origin, + `/api/newsletter/unsubscribe?token=${unsubscribeToken}`, + ); if (mode !== 'live') { console.info('[newsletter:dev] Subscription request', { @@ -170,7 +187,7 @@ export const POST: APIRoute = async ({ request, locals, url }) => { .run(); } - const copy = confirmEmailCopy(locale, confirmUrl); + const copy = confirmEmailCopy(locale, confirmUrl, unsubscribeUrl); try { await sendCloudflareEmail(emailBinding, { fromEmail, diff --git a/src/pages/newsletter/confermata.astro b/src/pages/newsletter/confermata.astro index 0e129f7..8732de2 100644 --- a/src/pages/newsletter/confermata.astro +++ b/src/pages/newsletter/confermata.astro @@ -1,5 +1,10 @@ --- import SubpageLayout from '../../layouts/SubpageLayout.astro'; + +const unsubToken = Astro.url.searchParams.get('unsub')?.trim() ?? ''; +const unsubHref = unsubToken + ? `/api/newsletter/unsubscribe?token=${encodeURIComponent(unsubToken)}` + : ''; ---

Puoi disiscriverti in qualsiasi momento dal link presente in fondo a ogni - messaggio. + messaggio della newsletter.

+ { + unsubHref ? ( +

+ Oppure disiscriviti subito:{' '} + + Annulla iscrizione + + . +

+ ) : null + }

Torna alla home

-- 2.49.0