feat(email): add customizable "FROM" email for resend (#447)

* add customizable from email on resend via envvar

* use existing getBaseDomain utility
This commit is contained in:
Waleed Latif
2025-06-01 14:33:10 -07:00
committed by GitHub
parent a94f61702c
commit 2e77d4625a
4 changed files with 14 additions and 10 deletions

View File

@@ -3,6 +3,7 @@ import { Resend } from 'resend'
import { z } from 'zod'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console-logger'
import { getBaseDomain } from '@/lib/urls/utils'
const resend = env.RESEND_API_KEY ? new Resend(env.RESEND_API_KEY) : null
const logger = createLogger('HelpAPI')
@@ -98,8 +99,8 @@ ${message}
// Send email using Resend
const { data, error } = await resend.emails.send({
from: 'Sim Studio <noreply@simstudio.ai>',
to: ['help@simstudio.ai'],
from: `Sim Studio <noreply@${getBaseDomain()}>`,
to: [`help@${getBaseDomain()}`],
subject: `[${type.toUpperCase()}] ${subject}`,
replyTo: email,
text: emailText,
@@ -121,7 +122,7 @@ ${message}
// Send confirmation email to the user
await resend.emails
.send({
from: 'Sim Studio <noreply@simstudio.ai>',
from: `Sim Studio <noreply@${getBaseDomain()}>`,
to: [email],
subject: `Your ${type} request has been received: ${subject}`,
text: `
@@ -137,7 +138,7 @@ ${images.length > 0 ? `You attached ${images.length} image(s).` : ''}
Best regards,
The Sim Studio Team
`,
replyTo: 'help@simstudio.ai',
replyTo: `help@${getBaseDomain()}`,
})
.catch((err) => {
logger.warn(`[${requestId}] Failed to send confirmation email`, err)

View File

@@ -7,6 +7,7 @@ import { WorkspaceInvitationEmail } from '@/components/emails/workspace-invitati
import { getSession } from '@/lib/auth'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console-logger'
import { getBaseDomain } from '@/lib/urls/utils'
import { db } from '@/db'
import { user, workspace, workspaceInvitation, workspaceMember } from '@/db/schema'
@@ -228,7 +229,7 @@ async function sendInvitationEmail({
}
await resend.emails.send({
from: 'noreply@simstudio.ai',
from: `noreply@${getBaseDomain()}`,
to,
subject: `You've been invited to join "${workspaceName}" on Sim Studio`,
html: emailHtml,

View File

@@ -17,6 +17,7 @@ import { createLogger } from '@/lib/logs/console-logger'
import { db } from '@/db'
import * as schema from '@/db/schema'
import { env } from './env'
import { getBaseDomain } from './urls/utils'
const logger = createLogger('Auth')
@@ -145,7 +146,7 @@ export const auth = betterAuth({
const html = await renderPasswordResetEmail(username, url)
const result = await resend.emails.send({
from: 'Sim Studio <team@simstudio.ai>',
from: `Sim Studio <team@${getBaseDomain()}>`,
to: user.email,
subject: getEmailSubject('reset-password'),
html,
@@ -187,7 +188,7 @@ export const auth = betterAuth({
// In production, send an actual email
const result = await resend.emails.send({
from: 'Sim Studio <onboarding@simstudio.ai>',
from: `Sim Studio <onboarding@${getBaseDomain()}>`,
to: data.email,
subject: getEmailSubject(data.type),
html,
@@ -1077,7 +1078,7 @@ export const auth = betterAuth({
)
await resend.emails.send({
from: 'Sim Studio <team@simstudio.ai>',
from: `Sim Studio <team@${getBaseDomain()}>`,
to: invitation.email,
subject: `${inviterName} has invited you to join ${organization.name} on Sim Studio`,
html,

View File

@@ -1,6 +1,7 @@
import { Resend } from 'resend'
import { createLogger } from '@/lib/logs/console-logger'
import { env } from './env'
import { getBaseDomain } from './urls/utils'
interface EmailOptions {
to: string
@@ -41,7 +42,7 @@ export async function sendEmail({
from,
}: EmailOptions): Promise<SendEmailResult> {
try {
const senderEmail = from || 'noreply@simstudio.ai'
const senderEmail = from || `noreply@${getBaseDomain()}`
if (!resend) {
logger.info('Email not sent (Resend not configured):', {
@@ -89,7 +90,7 @@ export async function sendBatchEmails({
emails,
}: BatchEmailOptions): Promise<BatchSendEmailResult> {
try {
const senderEmail = 'noreply@simstudio.ai'
const senderEmail = `noreply@${getBaseDomain()}`
const results: SendEmailResult[] = []
if (!resend) {