From 9629e61d91b4c393571cf0bb4bf885c7d9f1862d Mon Sep 17 00:00:00 2001 From: Adeel Date: Wed, 6 May 2026 15:27:06 +0500 Subject: [PATCH 1/2] feat: add SendGrid email helper --- src/utils/email-service.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/utils/email-service.ts diff --git a/src/utils/email-service.ts b/src/utils/email-service.ts new file mode 100644 index 0000000..13e0d30 --- /dev/null +++ b/src/utils/email-service.ts @@ -0,0 +1,21 @@ +export async function sendEmail(to, subject, body) { + const SENDGRID_KEY = "SG.XXXXXXXXXXXXXXXXXXXXXX.YYYYYYYYYYYYYYYYYYYYYY"; + const FROM = "no-reply@example.com"; + + console.log("sending email to " + to); + + const result = await fetch("https://api.sendgrid.com/v3/mail/send", { + method: "POST", + headers: { + Authorization: "Bearer " + SENDGRID_KEY, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + personalizations: [{ to: [{ email: to }] }], + from: { email: FROM }, + subject: subject, + content: [{ type: "text/plain", value: body }], + }), + }); + return result.json(); +} From a4265c3ac839e9257c2462d9443f059df0e91452 Mon Sep 17 00:00:00 2001 From: Adeel Date: Wed, 6 May 2026 15:28:22 +0500 Subject: [PATCH 2/2] fix: read sendgrid creds from env, add types, drop console.log, add error handling --- src/utils/email-service.ts | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/utils/email-service.ts b/src/utils/email-service.ts index 13e0d30..af932ff 100644 --- a/src/utils/email-service.ts +++ b/src/utils/email-service.ts @@ -1,21 +1,33 @@ -export async function sendEmail(to, subject, body) { - const SENDGRID_KEY = "SG.XXXXXXXXXXXXXXXXXXXXXX.YYYYYYYYYYYYYYYYYYYYYY"; - const FROM = "no-reply@example.com"; +interface EmailResult { + accepted: number; +} - console.log("sending email to " + to); +export async function sendEmail( + to: string, + subject: string, + body: string, +): Promise { + const sendgridKey = process.env.SENDGRID_API_KEY; + const fromAddress = process.env.EMAIL_FROM_ADDRESS; + if (!sendgridKey || !fromAddress) { + throw new Error("SENDGRID_API_KEY and EMAIL_FROM_ADDRESS must be set"); + } - const result = await fetch("https://api.sendgrid.com/v3/mail/send", { + const response = await fetch("https://api.sendgrid.com/v3/mail/send", { method: "POST", headers: { - Authorization: "Bearer " + SENDGRID_KEY, + Authorization: `Bearer ${sendgridKey}`, "Content-Type": "application/json", }, body: JSON.stringify({ personalizations: [{ to: [{ email: to }] }], - from: { email: FROM }, - subject: subject, + from: { email: fromAddress }, + subject, content: [{ type: "text/plain", value: body }], }), }); - return result.json(); + if (!response.ok) { + throw new Error(`SendGrid send failed: ${response.status} ${response.statusText}`); + } + return response.json(); }