From d0cdf34019280871e741dda3304514c98a2fc460 Mon Sep 17 00:00:00 2001 From: Abhishek kushwaha Date: Thu, 9 May 2024 17:21:12 +0530 Subject: [PATCH] feat: emails using resend Signed-off-by: Abhishek kushwaha --- packages/emails/emails/mail.tsx | 15 +++++++++++ packages/emails/emails/send.ts | 38 +++++++++++++++++++++++++++ packages/emails/emails/utils/utils.ts | 8 ++++++ packages/emails/env.ts | 11 ++++++++ packages/emails/index.ts | 5 ++++ packages/emails/package.json | 30 +++++++++++++++++++++ packages/emails/tsconfig.json | 6 +++++ 7 files changed, 113 insertions(+) create mode 100644 packages/emails/emails/mail.tsx create mode 100644 packages/emails/emails/send.ts create mode 100644 packages/emails/emails/utils/utils.ts create mode 100644 packages/emails/env.ts create mode 100644 packages/emails/index.ts create mode 100644 packages/emails/package.json create mode 100644 packages/emails/tsconfig.json diff --git a/packages/emails/emails/mail.tsx b/packages/emails/emails/mail.tsx new file mode 100644 index 0000000..aa97bb7 --- /dev/null +++ b/packages/emails/emails/mail.tsx @@ -0,0 +1,15 @@ +import * as React from 'react' +import { Html } from '@react-email/html' +import { Button } from '@react-email/button' + +export function Email(props: { url: string }) { + const { url } = props + + return ( + + + + ) +} + +export default Email diff --git a/packages/emails/emails/send.ts b/packages/emails/emails/send.ts new file mode 100644 index 0000000..caff8ad --- /dev/null +++ b/packages/emails/emails/send.ts @@ -0,0 +1,38 @@ +import { Resend } from 'resend' + +import { env } from '../env' + +export const resend = new Resend(env.RESEND_API_KEY) + +export interface Emails { + react: JSX.Element + subject: string + to: string[] + from: string +} + +export type EmailHtml = { + html: string + subject: string + to: string[] + from: string +} +export const sendEmail = async (email: Emails) => { + await resend.emails.send(email) +} + +export const sendEmailHtml = async (email: EmailHtml) => { + await fetch('https://api.resend.com/emails', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${env.RESEND_API_KEY}` + }, + body: JSON.stringify({ + to: email.to, + from: email.from, + subject: email.subject, + html: email.html + }) + }) +} diff --git a/packages/emails/emails/utils/utils.ts b/packages/emails/emails/utils/utils.ts new file mode 100644 index 0000000..d58c4d4 --- /dev/null +++ b/packages/emails/emails/utils/utils.ts @@ -0,0 +1,8 @@ +export const validateEmailNotDisposable = async (mailHost: string) => { + const response = await fetch( + `https://open.kickbox.com/v1/disposable/${mailHost}` + ) + const status = await response.json() + + return status.disposable +} diff --git a/packages/emails/env.ts b/packages/emails/env.ts new file mode 100644 index 0000000..bebc08e --- /dev/null +++ b/packages/emails/env.ts @@ -0,0 +1,11 @@ +import { createEnv } from '@t3-oss/env-core' +import { z } from 'zod' + +export const env = createEnv({ + server: { + RESEND_API_KEY: z.string().min(1) + }, + runtimeEnv: { + RESEND_API_KEY: process.env.RESEND_API_KEY + } +}) diff --git a/packages/emails/index.ts b/packages/emails/index.ts new file mode 100644 index 0000000..bfdb012 --- /dev/null +++ b/packages/emails/index.ts @@ -0,0 +1,5 @@ +import { validateEmailNotDisposable } from './emails/utils/utils' + +export { validateEmailNotDisposable } + +export { sendEmail, sendEmailHtml } from './emails/send' diff --git a/packages/emails/package.json b/packages/emails/package.json new file mode 100644 index 0000000..105a2aa --- /dev/null +++ b/packages/emails/package.json @@ -0,0 +1,30 @@ +{ + "name": "@repo/emails", + "version": "1.0.0", + "description": "", + "main": "./index.ts", + "scripts": { + "dev:email": "email dev" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@react-email/button": "^0.0.15", + "@react-email/components": "^0.0.17", + "@react-email/head": "^0.0.8", + "@react-email/html": "^0.0.8", + "@react-email/tailwind": "^0.0.16", + "@t3-oss/env-core": "^0.10.1", + "react-email": "^2.1.2", + "resend": "^3.2.0", + "zod": "^3.23.8" + }, + "devDependencies": { + "@repo/typescript-config": "workspace:*", + "@types/node": "20.8.0", + "@types/react": "18.2.64", + "react": "18.2.0", + "typescript": "5.4.5" + } +} \ No newline at end of file diff --git a/packages/emails/tsconfig.json b/packages/emails/tsconfig.json new file mode 100644 index 0000000..ec5e259 --- /dev/null +++ b/packages/emails/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "@repo/typescript-config/react-library.json", + "include": [".", "env.ts"], + "exclude": ["dist", "build", "node_modules"] + } + \ No newline at end of file